Verilog - ナットシェルで
すべての動作コードは module
内に記述されています と endmodule
.したがって、どのようなデジタル デザインを作成しようとしても、module
内に配置されます。 ブロック。ポートが定義されている場合と定義されていない場合があります - 信号が input
としてブロックに入ることを許可します または output
としてブロックをエスケープします .
モジュール
以下の例の空のモジュールは testbench と呼ばれます .任意の名前を付けることができますが、英数字にする必要があり、'_' を含めることができます。
module testbench;
endmodule
別のモジュールを見てみましょう。いくつかの信号があります (d、clk、rstb ) 入力および q として宣言 出力として宣言されています。
module dff (input d,
clk,
rstb,
output q);
endmodule
データ型
モジュールがどのように見えるかを確認したので、テストベンチ モジュールをもう一度見て、モジュール内に何が配置できるかを見てみましょう。 Verilog には、主に次の 2 種類のデータ型があります。
reg
datatype は変数のような値を保持するために使用されますが、wire
は これは、連続的に駆動する必要がある電線に似ています。したがって、通常は wire
複数のモジュールやその他の信号を接続するために使用されます。
module testbench;
reg d;
reg rst_b;
reg clk;
wire q;
endmodule
課題
Verilog には 3 つの基本ブロックがあります:
always @ (状態 ) | 条件が満たされたときに常に実行 |
initial | シミュレーションの開始時に一度だけ実行されます |
assign [左] =[右] | RHS が変更されるたびに LHS の値が更新されます |
Verilog を記述する際に留意すべきルールがいくつかあります。
reg
initial
でのみ割り当てることができます とalways
ブロックwire
assign
経由でのみ値を割り当てることができます 声明- initial/always に複数のステートメントがある場合
begin .. end
でラップする必要があります。
module testbench;
reg d;
reg rst_b;
reg clk;
wire q;
initial begin
d = 0;
rst_b = 0;
clk = 0;
#100 $finish;
end
always begin
#10 clk = ~clk;
end
endmodule
注意 上記の例からの以下:
initial
は複数行あるので ブロック、開始 そして終了 使用されています- 信号 d、rst_b、および clk は、タイプが
reg
であるため、最初のブロック内で割り当てられます。 - 初期ブロック内のコードは 0ns、つまりシミュレーションの開始時に実行されます
always
には条件がないので ブロックすると、C の無限ループのように実行されます- # 時間遅延を表すために使用されます。 #10 は、シミュレーション時間を 10 単位進めるようにシミュレーターに指示します。
clk = ~clk;
クロックの値を切り替えます。#10 ステートメントの前に置くと、時計は 10 時間単位ごとに切り替わります。$finish
シミュレーションを終了する方法です。この場合、100 時間単位実行されて終了します。
Verilog