Verilogスケジューリングセマンティクスの理解:タイミング、イベント、実行順序
Verilogの設計とテストベンチには通常、alwaysまたはinitialブロック、連続代入、その他の手続き文など、多くのコード行が含まれ、これらはシミュレーションの過程で異なる時間にアクティブになります。
Verilogモデル内の信号値のすべての変化は更新イベントと見なされます。そして、これらの更新イベントにセンシティブなalwaysやassignブロックなどのプロセスは、任意の順序で評価され、これは評価イベントと呼ばれます。これらのイベントは異なる時間に発生する可能性があるため、シミュレーション時間で並べられたイベントキューにスケジューリングすることで、より適切に管理し、正しい実行順序を保証できます。
module tb;
reg a, b, c;
wire d;
// 'always'は'a'または'b'が更新されると評価されるプロセス
// 'a'または'b'の値が変化すると'更新イベント'と呼ばれる
// 'always'ブロックが'a'または'b'の変化でトリガーされると
// '評価イベント'と呼ばれる
always @ (a or b) begin
c = a & b;
end
// ここでは'assign'は'a'または'b'または'c'が更新されると
// 評価されるプロセス
assign d = a | b ^ c;
endmodule
イベントキュー
シミュレーションステップは4つの異なる領域に分割できます。アクティブイベントキューは、現在の時間で実行する必要があるプロセスのセットであり、これがアクティブまたは他のイベントキューにさらに多くのプロセスをスケジューリングする結果となります。イベントはどの領域にも追加できますが、常にアクティブ領域から削除されます。
- アクティブイベントは現在のシミュレーション時間で発生し、任意の順序で処理可能
- 非アクティブイベントは現在のシミュレーション時間で発生するが、すべてのアクティブイベント処理後に処理
- ノンブロッキング代入イベントは以前の時点で評価されたが、アクティブおよび非アクティブイベント処理後の現在のシミュレーション時間で代入実行
- モニタイベントはすべてのアクティブ、非アクティブ、ノンブロッキング代入完了後に処理
現在のタイムステップのアクティブキュー内のすべてのイベントが実行されると、シミュレータは時間を次のタイムステップに進め、そのアクティブキューを実行します。
module tb;
reg x, y, z;
initial begin
#1 x = 1; y = 1;
#1 z = 0;
end
endmodule
シミュレーションは時間0で開始し、最初の文はシミュレーション時間が1時間単位に達したときに実行されるようスケジューリングされ、ここでxとyに1が代入されます。これは現在の時間(1時間単位)のアクティブキューです。シミュレータはさらに1時間単位後の次の文をスケジューリングし、ここでzに0が代入されます。
シミュレーションを非決定的にするものは?
シミュレーション中に競合状態が発生し、同じ設計とテストベンチで異なる出力が得られることがあります。非決定的な動作の理由の1つは、アクティブイベントがキューから削除され、任意の順序で処理されることです。
Verilog
- Verilogマスター:デジタル回路設計のための完全チュートリアル
- Verilog連結マスター:実践ガイド
- Verilog代入文の理解:種類、構文、ベストプラクティス
- Verilogブロッキング代入とノンブロッキング代入:違いを徹底解説
- Verilog関数のマスター:効率的なRTL設計のために
- Verilogタスクの理解:関数との違い、構文、使用法
- Verilogクロックジェネレータ:設計と実装ガイド
- Verilog数学関数のマスター:効率的なハードウェア設計のために
- Verilog $timeformatのマスター:精度と表示制御
- 任意のスコープでのVerilog timescale理解と表示
- VerilogファイルI/Oの完全ガイド:オープン、読み取り、書き込み、クローズ