シミュレーションサイクル
Verylのシミュレーションステップは、厳密な順序で実行される3つのフェーズで構成されます。このモデルはVerylの言語制約により実現された、SystemVerilogスケジューリング領域の簡略化されたビューに対応します。
3つのフェーズ
┌──────────────────────────┐
│ Phase 1: Combinational │ always_comb / assign blocks
│ Settlement │ re-triggered on input changes
│ (SV Active region) │ until all signals stabilize
└────────────┬─────────────┘
│
┌────────────▼─────────────┐
│ Phase 2: Event │ always_ff blocks executed
│ Evaluation │ Reads: current FF values
│ (SV Active + NBA) │ Writes: scheduled as NBA
└────────────┬─────────────┘
│
┌────────────▼─────────────┐
│ Phase 3: FF Commit │ All NBA writes take effect
│ (SV NBA Update) │ Re-triggers Phase 1
└──────────────────────────┘
フェーズ1:組み合わせロジックの収束
すべての組み合わせロジック(always_comb ブロックと assign 宣言)が評価されます。各ブロックはその入力信号に対してセンシティブです:あるブロックが信号を更新すると、その信号に依存するブロックが再評価されます。この伝播はすべての信号が安定するまで続きます。
フェーズ2:イベント評価
トリガーされたイベント(例:クロックエッジ)に対してセンシティブなすべての always_ff ブロックが実行されます。このフェーズでは:
- FF変数からの読み取りはcurrent(コミット前)の値を参照します。
- FF変数への書き込みはノンブロッキングセマンティクスを使用します:値はNBA更新にスケジュールされ、即座には反映されません。
フェーズ3:FFコミット(NBA更新)
フェーズ2からのすべてのノンブロッキング代入がアトミックに反映されます。すべてのFF変数の「next」値が新しい「current」値になります。コミット後、更新された値で組み合わせロジックが再評価されます(フェーズ1に戻る)。
SystemVerilogスケジューリング領域との対応
Verylの言語制約により、SystemVerilogのスケジューリング領域のうち関連するのは2つだけです:
| SV領域 | Verylフェーズ | 何が起こるか |
|---|---|---|
| Active | 組み合わせロジックの収束 | always_comb の評価と伝播 |
| Active | イベント評価(読み取り) | always_ff がcurrent値を読む |
| NBA更新 | イベント評価(書き込み)+ FFコミット | always_ff の書き込みが反映される |
Inactive、Observed、Reactive領域は不要です。Verylはこれらを必要とするコーディングパターン(例:#0 ディレイ、programブロック、同一変数へのブロッキング代入とノンブロッキング代入の混在)を許可しないためです。