イベント評価
クロックエッジまたはリセットイベントが発生すると、そのイベントに対してセンシティブなすべての always_ff ブロックが実行されます。イベント評価中:
- FF変数からの読み取りはcurrent(コミット前)の値を参照します。
- FF変数へのすべての書き込みはノンブロッキングです — NBA更新にスケジュールされ、FFコミットフェーズまで反映されません。
すべてのブロックが同じスナップショットから読み取り、独立した「next」スロットに書き込むため、always_ff ブロックの実行順序はシミュレーション結果に影響しません。
module ModuleA (
i_clk: input clock,
) {
var a: logic<8>;
var b: logic<8>;
// These two blocks produce the same result regardless of evaluation order:
always_ff {
a = b; // a.next = b.current
}
always_ff {
b = a; // b.next = a.current
}
// コミット後:a と b の値が入れ替わる。
}
ソース順序
同一イベントに対する always_ff ブロックはソース順序で評価されます。
initialブロックとfinalブロック
initial ブロックはシミュレーション開始時に独立したイベントとして一度だけ評価されます。final ブロックはシミュレーション終了時に一度だけ評価されます。これらのブロックは合成不可であり、テストベンチやデバッグ目的で使用されます。