【问题标题】:Difference between Behavioral, RTL and gate Level行为、RTL 和门级之间的区别
【发布时间】:2015-04-23 06:15:15
【问题描述】:

我正在尝试完全理解 Verilog 抽象级别之间的差异,我了解每个级别的描述,但我仍然无法在剧本中得到它。

对于这种情况,我将粘贴一些 Verilog 代码以及我对它们的看法:

  1. 以下代码处于行为级别。

    always  @ (a or b or sel)
      begin
        y = 0;
        if (sel == 0) begin
          y = a;
        end else begin
        y = b;
      end
    end
    
  2. 这(只是一个例子)在门级

    module test(clk,  ready, next, Q);
      input clk, enable, next;
      output Q;
    
      \**SEQGEN** reg_1 (.clear(1'b0), .next_state(next), .clocked_on(clk), .Q(Q), .synch_enable(enable) );
    
    endmodule
    
  3. 我不知道这段代码是在 RTL 还是门级(我希望 always 关键字使这个 RTL 而不是门级)

    module dff_from_nand();
      wire Q,Q_BAR;
      reg D,CLK;
    
      nand U1 (X,D,CLK) ;
      nand U2 (Y,X,CLK) ;
      nand U3 (Q,Q_BAR,X);
      nand U4 (Q_BAR,Q,Y);
    
      // Testbench of above code
      initial begin
        $monitor("CLK = %b D = %b Q = %b Q_BAR = %b",CLK, D, Q, Q_BAR);
        CLK = 0;
        D = 0;
        #3  D = 1;
        #3  D = 0;
        #3  $finish;
      end   
    
      always  #2  CLK = ~CLK;
    
    endmodule
    

我已经知道initial beginend 不可合成,仅用于测试。现在我有 2 个问题

  1. 第三(和第二)代码是 RTL 还是 Gate-Level?什么是好的 RTL 代码示例?我找到了这个RTL Code Example,但这真的是 RTL 吗?对我来说,这看起来像是行为水平。

  2. 什么是 Verilog 网表?它与门级相同还是具有上下文基础定义?

我很困惑,因为在某些网站中,我不知道他们是在说“这是使用逻辑门的 Verilog 代码”还是“这是门级的 Verilog 代码”

如果有人想解释有关此主题的更多详细信息,我将非常高兴:)

【问题讨论】:

    标签: verilog


    【解决方案1】:

    RTL :Register-Transfer-Level,一种抽象硬件功能,使用可综合的always 块和assign 语句编写(可以转换为门级)。纯 RTL 不实例化子模块。 RTL 可以包含子模块来指导合成器。结构 RTL(通常仍称为 RTL)是包含其他 RTL 模块的模块。示例:FSM(有限状态机)

    always @* begin
      next_state = state;
      if (count>0) next_count = count - 1;
      case (state)
      IDLE :
        if(do_start) begin
          next_state = START;
          next_count = 2;
        end
      START :
        if (do_wait) begin
          next_count = count;
        end
        else if (count==0) begin
          next_state = RUN;
          next_count = count_from_input;
        end
      RUN :
        if (do_stop) begin
          next_state = IDLE;
        end
        if (do_wait) begin
          next_count = count;
        end
        else if (count==0) begin
          next_state = IDLE;
        end
      endcase
    end
    always @(posedge clk, negedge rst_n) begin
      if (!rst_n) begin
        count <= 0;
        state <= IDLE;
      end
      else begin
        count <= next_count;
        state <= next_state;
      end
    end
    

    行为:模仿所需的硬件功能,但不一定可合成。只要代码生成所需的行为,就没有严格的规则。指导方针是使其简单易读。行为通常用于表示模拟块、占位符代码(RTL/门未准备好)和测试台代码。示例:时钟发生器、延迟单元。

    always begin
      if (!clk_en && clk==1'b1) begin
        wait (clk_en);
      end
      #5 clk = ~clk;
    end
    

    RTL 和 Behavioral 的主要区别在于综合能力。如果您看到 # 延迟、wait 语句、while 循环、force/release 语句或分层引用,则这是行为。从技术上讲,有一些罕见的可原谅的例外,但如果这个问题超出了范围。

    门级(又名结构):仅由门和模块描述的逻辑。没有 always 块或 assign 语句。这是硬件中真正的门的代表。

    Verilog Netlist 是设计中使用的 Verilog 模块的集合。它可以是一个或多个文件。它可以是 RTL、行为和结构的混合。通常它主要是结构性的,尤其是对于大型设计。

    【讨论】:

    • soo,从我展示的示例中,第二个代码将是门级的?
    • 这是一个没有完整设计背景的模糊区域。只是原样:我称之为结构性的;不是经常只有一个模块实例。由于模块名称test 意味着这是一个更多地属于行为定义的测试工具。
    【解决方案2】:
    1. 行为层面。
    2. RTL 级别(不必是门级别,而是原始级别。
    3. 混合工作模块/测试台,全部包含在一个模块中。不是使用 Verilog 进行设计的最佳方法,但可以作为教学示例。其实这个例子其实就是两个模块:

    测试平台,即使它使用 RTL 编码将要测试的模块实例化到测试平台驱动的 regs 和电线,也可以被视为行为:

    module testbench_dff;
      wire Q,Q_BAR;
      reg D,CLK;
    
      // Instantiate the unit under test
      dff_from_nand uut (.CLK(CLK), .D(D), .Q(Q), .Q_BAR(Q_BAR) );
    
      // Testbench
      initial begin
        $monitor("CLK = %b D = %b Q = %b Q_BAR = %b",CLK, D, Q, Q_BAR);
        CLK = 0;
        D = 0;
        #3  D = 1;
        #3  D = 0;
        #3  $finish;
      end   
    
      always  #2  CLK = ~CLK;
    
    endmodule
    

    正在测试的被测单元 (UUT),它是一个像这样的模块(这显然是一个 RTL 级别 - 实际上是门级别 - 模块):

    module dff_from_nand (
      input wire CLK,
      input wire D,
      output wire Q,
      output wire Q_BAR
      );
    
      wire X,Y;
      nand U1 (X,D,CLK) ;
      nand U2 (Y,X,CLK) ;
      nand U3 (Q,Q_BAR,X);
      nand U4 (Q_BAR,Q,Y);
    endmodule
    

    据我了解,RTL 级模块是一个明确给出逻辑方程的模块。行为模块具有进程(在 Verilog 中使用 always 块,尽管可以在这些块中使用逻辑方程)。任何重要的 Verilog 设计都将兼具两者。

    【讨论】:

    • 对不起(英文问题),你的 dff_from_nand 是 RTL 还是门级?
    • (我也有英语问题;))这个特定的实现将是门级实现,可以用作网表
    猜你喜欢
    • 2021-03-27
    • 1970-01-01
    • 2015-11-18
    • 2018-06-02
    • 2015-09-10
    • 1970-01-01
    • 2010-12-28
    • 2012-04-21
    • 1970-01-01
    相关资源
    最近更新 更多