initial ブロック
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 47/90。
Verilogには、initial(一度だけruns)とalways(継続的にruns)の2つのプロシージャルblockがあります。ここではinitial blockについて説明します。
Initial Blockとは?
initial blockは、simulationの開始時(time 0)に一度だけexecuteされます。finishすると、二度とexecuteされません。
主にテストベンチで以下のような用途に使用されます:
- 初期値の設定
- テスト信号の生成
- メッセージを表示する
- シミュレーションを開始する
構文
initial begin
// ステートメントは一度だけ、順番に実行されます
end基本例
initial begin
$display("Simulation started");
$display("This runs once");
$finish;
end出力:
Simulation started
This runs onceテスト信号のための Initial ブロックの使用
initial begin
a = 0;
#10 a = 1;
#10 a = 0;
#10 $finish;
endこれにより、時刻 0、10、20 で a が変化します。
Initial と Always の比較
initial | always | |
|---|---|---|
| 実行 | Once | 継続的(永久) |
| 用途 | Testbench、初期化 | ハードウェア(フリップフロップ、カウンタ) |
| 論理合成可能か? | いいえ(simulation のみ) | はい(感度リスト付き) |
重要事項
initialブロックは論理合成不可能(not synthesizable)です — ハードウェアに変換することはできませんinitialはテストベンチ内でのみ使用してください- テストベンチに自走クロック(例:
always #5 clk = ~clk;)が含まれている場合、$finishを呼び出さない限りシミュレーションは永続的に実行されます。initialブロックのみの場合はイベントがなくなるとシミュレータは自動的に停止しますが、それでも$finishを追加するのが優れたプラクティスです
チャレンジ
不足している initial ブロックを追加して、a を 0 に設定し、10 時間単位後に a を 1 に設定します。
作業手順:
initial beginとendを追加しますa = 0に設定します#10待ちますa = 1に設定します- シミュレーションを終了するために $finish を追加します
自分で試してみよう
module test;
reg a;
// TODO: ここに initial ブロックを追加
// a = 0 を設定
// #10 待つ
// a = 1 を設定
// シミュレーションを終了するために $finish; を追加
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。