マルチクロックドメイン
Verylは複数のクロックドメインを持つデザインをサポートしています。各クロックドメインは対応するクロックイベントにより独立してトリガーされます。
独立したドメイン評価
クロックエッジが発生すると、そのクロックに対してセンシティブな always_ff ブロックのみが評価されます。FFコミットフェーズはそれらのブロックにより書き込まれた変数にのみ適用されます。他のクロックドメインは影響を受けません。
同時クロックエッジ
2つのクロックが同時にエッジを持つ場合、各ドメインのイベント評価とFFコミットは一度に1ドメインずつ順次実行されます。FFの二重バッファモデル(current/next分離)により、各ドメインは自身の変数の一貫したスナップショットを参照するため、ドメインの処理順序に関係なく単一ドメインの動作は決定論的です。
クロスドメイン信号
異なるクロックドメインの信号へのアクセスはクロックドメインクロッシング(CDC)です。Verylはクロスドメイン信号アクセスに unsafe (cdc) による明示的なアノテーションを要求します(クロックドメインアノテーションを参照)。
同時エッジを持つドメイン間で unsafe (cdc) 信号が共有されている場合、ドメインの評価順序は共有信号値を通じて観測可能です。Verylはこの場合の特定の順序を保証しません。設計者は適切な同期回路(例:2段FFシンクロナイザ、ハンドシェイクプロトコル)により正確性を確保する必要があります。
module ModuleA (
i_clk_a: input 'a clock ,
i_rst_a: input 'a reset ,
i_clk_b: input 'b clock ,
i_dat_a: input 'a logic<8>,
o_dat_b: output 'b logic<8>,
) {
var data_a: 'a logic<8>;
always_ff (i_clk_a, i_rst_a) {
if_reset {
data_a = 0;
} else {
data_a = i_dat_a;
}
}
// クロスドメインアクセスには unsafe (cdc) が必要
unsafe (cdc) {
assign o_dat_b = data_a;
}
}