web-dev-qa-db-ja.com

動作、RTL、ゲートレベルの違い

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. 3番目(および2番目)のコードはRTLまたはGate-Leveですか?良いRTLコード例は何でしょうか?私はこれを見つけました RTLコード例 しかしそれは本当にRTLですか?私にとって、それは行動レベルのように見えます。

  2. Verilogネットリストとはどういう意味ですか?ゲートレベルと同じですか、それともコンテキストベースの定義がありますか?

一部のWebサイトでは、「これは論理ゲートを使用しているVerilogコードです」または「これはゲートレベルのVerilogコードです」と言っているかどうかわからないため、混乱しています。

このトピックについてもっと詳しく説明したい人がいたらとても嬉しいです:)

8
lcjury

[〜#〜] 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モジュールのコレクションです。 1つまたは複数のファイルにすることができます。 RTL、Behavioral、Structuralを組み合わせることができます。通常、特に大規模な設計の場合、ほとんどが構造的です。

12
Greg
  1. 行動レベル。
  2. RTLレベル(ゲートレベルである必要はありませんが、プリミティブレベルです。
  3. 混合作業モジュール/テストベンチ、すべてが単一のモジュールに囲まれています。 Verilogを使用して設計するための最良のアプローチではありませんが、教育例としては問題ありません。実際、この例は実際には2つのモジュールです。

テストベンチ。RTLコーディングを使用して、テストベンチが駆動するレジスタとワイヤにテストされるモジュールをインスタンス化する場合でも、動作と見なすことができます。

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デザインには両方があります。

2
mcleod_ideafix