Verilog initialブロック:目的、構文、非合成可能な用途
一連のVerilog文は通常、シミュレーションで順次実行されます。これらの文は 手続き ブロック内に配置されます。Verilogには主に2種類の 手続き ブロックがあります:initial と always
構文
initial [single statement]
initial begin [multiple statements] end
initialブロックの用途
initial ブロックは合成可能ではないため、デジタル要素を持つハードウェア回路図に変換できません。したがって、initialブロックはシミュレーションでの使用以外に大きな目的はありません。これらのブロックは主に、変数の初期化と設計ポートへの特定値の駆動に使用されます。
initialブロックはいつ開始し、いつ終了する?
initial ブロックはシミュレーション開始時、時間0単位でスタートします。このブロックはシミュレーション全体で1回だけ実行されます。ブロック内のすべての文が実行されると、initial ブロックの実行は終了します。
上図の module behave には内部信号 a と b があります。initial ブロックには文が1つしかないため、begin と end で囲む必要はありません。この文は、initialブロックが時間0単位で開始するとき、値 2'b10 を a に代入します。
遅延要素がある場合どうなる?
以下のコードには、信号 b に値を代入する追加の文があります。しかし、これは前の文の実行から10時間単位後にのみ起こります。つまり、a が最初に与えられた値で代入され、その後10時間単位後に b が0に代入されます。
1つのモジュールにいくつのinitialブロックを定義できる?
1つのモジュール内に定義できる initial ブロックの数に制限はありません。
以下のコードには 3つ の initial ブロックがあり、すべて同じ時間に開始し並列に実行されます。しかし、各initialブロック内の文と遅延によって、ブロックの完了時間は異なります。
この例では、最初のブロックは遅延20単位、2番目は合計50単位(10+40)、最後は60単位の遅延があります。したがって、少なくとも1つのinitialブロックが60時間単位まで実行中であるため、シミュレーションは60時間単位で完了します。
$finish は、シミュレータに現在のシミュレーションを終了させるVerilogシステムタスクです。最後のブロックの遅延が30時間単位だった場合(以下)、シミュレーションは30時間単位で終了し、その時点でアクティブな他の initial ブロックもすべて強制終了されます。
initial begin #30 $finish; end
Verilog
- Verilogマスター:デジタル回路設計のための完全チュートリアル
- Verilog連結マスター:実践ガイド
- Verilogエッセンシャル:簡潔な概要
- Verilog代入文の理解:種類、構文、ベストプラクティス
- Verilogブロッキング代入とノンブロッキング代入:違いを徹底解説
- Verilog関数のマスター:効率的なRTL設計のために
- Verilogタスクの理解:関数との違い、構文、使用法
- Verilogクロックジェネレータ:設計と実装ガイド
- Verilog数学関数のマスター:効率的なハードウェア設計のために
- Verilog $timeformatのマスター:精度と表示制御
- 任意のスコープでのVerilog timescale理解と表示