Initialブロック
CoddyのVerilogジャーニー「基礎」セクションの一部。レッスン 47/90。
Verilogには2つの手続きブロックがあります。initial(1回だけ実行)とalways(継続的に実行)です。ここでは、initialブロックについて説明します。
Initialブロックとは?
initialブロックは、シミュレーションの開始時(時刻0)に1回だけ実行されます。終了すると、再び実行されることはありません。
主にテストベンチで次の用途に使用されます:
- 初期値の設定
- テスト信号の生成
- メッセージの表示
- シミュレーションの開始
構文
initial begin
// 文は順番に1回ずつ実行される
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 | |
|---|---|---|
| 実行回数 | 1回 | 継続的(永久に) |
| 用途 | テストベンチ、初期化 | ハードウェア(フリップフロップ、カウンター) |
| 合成可能? | 初期値の設定のみ(FPGA) | はい(センシティビティリストを使用) |
重要な注意事項
initialブロックは主にシミュレーション用です。合成ツールでは、#10のような遅延や$displayのようなタスクをハードウェアに変換できません- テストベンチでは主に
initialを使用します。設計モジュールでは、FPGA合成ツールだけが使用し、レジスタまたはメモリの初期値を設定する場合に限られます - テストベンチに自走クロック(例:
always #5 clk = ~clk;)が含まれている場合、$finishを呼び出さない限りシミュレーションは永遠に続きます。initialブロックだけの場合は、イベントがなくなるとシミュレータは自動的に停止しますが、それでも$finishを追加するのがよい習慣です
チャレンジ
aを0に設定し、その後10時間単位後にaを1に設定する、不足しているinitialブロックを追加してください。
すること:
initial beginとendを追加するa = 0を設定する#10待つa = 1を設定する- シミュレーションを終了するために$finishを追加する
自分で試してみよう
module test;
reg a;
// TODO: ここにinitialブロックを追加する
// a = 0に設定する
// #10だけ待つ
// a = 1に設定する
// シミュレーションを終了するために$finish;を追加する
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Verilogオンラインコンパイラ