initial ブロック
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 47/90。
Verilogには2つのプロシージャルブロックがあります。initial(1回だけ実行)とalways(継続的に実行)です。それでは、initialブロックについて説明します。
initialブロックとは何ですか?
initialブロックは、シミュレーションの開始時(時刻0)に1回だけ実行されます。終了すると、二度と実行されません。
主にテストベンチで以下の目的で使用されます:
- 初期値の設定
- テスト信号の生成
- メッセージの表示
- シミュレーションの開始
構文
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これは a を 0、10、20 の各時点で変更します。
initial と always の比較
initial | always | |
|---|---|---|
| 実行 | 1回のみ | 継続的(永続的) |
| 用途 | テストベンチ、初期化 | ハードウェア(フリップフロップ、カウンタ) |
| 論理合成可能か? | 不可(シミュレーションのみ) | 可能(センシティビティ・リストが必要) |
重要な注意事項
initialブロックは論理合成可能ではありません — ハードウェアに変換することはできませんinitialはテストベンチ内でのみ使用してください$finishがないと、シミュレーションは永久に実行されます(停止させるためのクロックがないため)
チャレンジ
a を 0 に設定し、10 時間単位後に a を 1 に設定する、欠落している initial ブロックを追加してください。
手順:
initial beginとendを追加するa = 0を設定する#10待機するa = 1を設定する- シミュレーションを終了するために $finish を追加する
チートシート
initialブロックは、シミュレーション時刻0に1回だけ実行されます。テストベンチでのみ使用されます(論理合成不可)。
initial begin
a = 0; // 時刻0で設定
#10 a = 1; // 時刻10で設定
#10 a = 0; // 時刻20で設定
$finish; // シミュレーション終了
end$finishがないと、シミュレーションは永久に実行されます。
initial | always | |
|---|---|---|
| 実行 | 1回 | 継続的 |
| 用途 | テストベンチ | ハードウェア |
| 論理合成可能か? | いいえ | はい |
自分で試してみよう
module test;
reg a;
// TODO: ここにinitialブロックを追加する
// a = 0 に設定
// #10 待機
// a = 1 に設定
// シミュレーションを終了するために $finish; を追加する
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。