決定性
Verylは決定論的シミュレーションを保証します:同一のソースコードと同一の刺激シーケンスが与えられた場合、準拠するシミュレータはすべてのシミュレーションステップで同一の信号値を生成します。
Verylが決定性を実現する方法
Verylの言語制約はSystemVerilogにおける一般的な非決定性の原因を排除します:
- Verylは単一の
=演算子を使用し、コンテキストに基づいて正しいセマンティクスを自動推論します。これにより、誤った代入タイプを誤って使用することが不可能になります。 - すべてのブロックが同じスナップショットから読み取り、独立した「next」スロットに書き込むため、
always_ffブロックの実行順序はシミュレーション結果に影響しません。 - 決定論的な組み合わせ評価 — ブロックは安定するまで伝播し、組み合わせループはコンパイル時に検出されます。
- 明示的なクロックドメインクロッシング —
unsafe (cdc)なしのクロスドメインアクセスはコンパイル時エラーとなり、意図しないレースを防止します。
保証の範囲
決定性の保証はシミュレーションステップ境界での観測可能な信号値(各FFコミット後)に適用されます。単一フェーズ内の内部評価順序(例:収束フェーズ内での組み合わせブロック再評価の順序)は実装定義ですが、観測可能な結果は実装間で同一です。
SystemVerilogとの関係
トランスパイルされたSystemVerilog出力は、IEEE 1800準拠のシミュレータが決定論的に処理する確立されたコーディングパターンに従います:
- 順序ロジックには
always_ffと<=(ノンブロッキング) - 組み合わせロジックには
always_combと=(ブロッキング) - 同一変数へのブロッキング/ノンブロッキング代入の混在なし