イベント評価

クロックエッジまたはリセットイベントが発生すると、そのイベントに対してセンシティブなすべての always_ff ブロックが実行されます。イベント評価中:

  1. FF変数からの読み取りcurrent(コミット前)の値を参照します。
  2. 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 ブロックはシミュレーション終了時に一度だけ評価されます。これらのブロックは合成不可であり、テストベンチやデバッグ目的で使用されます。