行为级、RTL 级和门级之间的区别

Difference between Behavioral, RTL and gate Level

我试图完全理解 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网表是什么意思?它与门级相同还是具有上下文基础定义?

我很困惑,因为在某些网站上我不知道他们说的是 'this is a Verilog code that is using logic gates' 还是 'this is a Verilog code in gate-level'

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

  1. 行为水平。
  2. RTL 级别(不必是门级别,而是原始级别。
  3. 混合工作module/testbench,全部包含在一个模块中。这不是使用 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 设计都将同时具备。

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

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

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、行为和结构的混合。通常它主要是结构性的,特别是对于大型设计。