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 を記述する際に留意すべきルールがいくつかあります。
reginitialでのみ割り当てることができます とalwaysブロックwireassign経由でのみ値を割り当てることができます 声明- 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