Verilogの抽象化レベル間の違いを完全に理解しようとしています。各レベルの説明が何を言っているかはわかりますが、それでも実際には理解できません。
この場合、いくつかのVerilogコードとそれらについての考えを貼り付けます。
次のコードは動作レベルです。
always @ (a or b or sel)
begin
y = 0;
if (sel == 0) begin
y = a;
end else begin
y = b;
end
end
これ(ほんの一例)はゲートレベルにあります
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
このコードが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 begin
とend
は合成できず、テストにのみ使用されます。今私は2つの質問があります
3番目(および2番目)のコードはRTLまたはGate-Leveですか?良いRTLコード例は何でしょうか?私はこれを見つけました RTLコード例 しかしそれは本当にRTLですか?私にとって、それは行動レベルのように見えます。
Verilogネットリストとはどういう意味ですか?ゲートレベルと同じですか、それともコンテキストベースの定義がありますか?
一部のWebサイトでは、「これは論理ゲートを使用しているVerilogコードです」または「これはゲートレベルのVerilogコードです」と言っているかどうかわからないため、混乱しています。
このトピックについてもっと詳しく説明したい人がいたらとても嬉しいです:)
[〜#〜] 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を組み合わせることができます。通常、特に大規模な設計の場合、ほとんどが構造的です。
テストベンチ。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デザインには両方があります。