行为,RTL和门级之间的差异

时间:2015-04-23 06:15:16

标签: verilog

我正在努力完全理解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
    
  4. 我已经知道initial beginend不可合成,只是用于测试。现在我有两个问题

    1. 第三(和第二)代码是RTL还是Gate-Leve?什么是一个很好的RTL代码示例?我发现这个RTL Code Example但是真的是RTL吗?对我而言,它看起来像行为水平。

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

    3. 我很困惑,因为在某些网站上我不知道他们是否说'这是使用逻辑门的Verilog代码'或'这是门级的Verilog代码'

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

2 个答案:

答案 0 :(得分:12)

RTL :寄存器传输级,一种抽象硬件功能,由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,Behavioral和Structural的混合体。通常它主要是结构,特别是对于大型设计。

答案 1 :(得分:2)

  1. 行为水平。
  2. RTL级别(不必是门级,但原始级别。
  3. 混合工作模块/测试台,全部封装在一个模块中。不是使用Verilog进行设计的最佳方法,但对于教学示例来说是可以的。实际上,这个例子实际上是两个模块:
  4. 测试平台,可以被认为是行为,即使它使用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设计都会兼得。