組み合わせロジックの評価

Verylの組み合わせロジック(always_comb ブロックと assign 宣言)はSystemVerilogと同じ評価セマンティクスに従います:各ブロックは暗黙的にその入力信号に対してセンシティブであり、入力が変化するたびに再評価されます。

ブロックが信号を更新すると、依存するブロックがすべての信号が安定するまで自動的に再トリガーされます。

module ModuleA {
    var a: logic<8>;
    var b: logic<8>;
    var c: logic<8>;

    assign a = 1;

    always_comb {
        b = a + 1; // a が変化すると再評価される
    }

    always_comb {
        c = b + 1; // b が変化すると再評価される
    }
}

この例では、初期評価順序に関係なく、値は常に a = 1b = 2c = 3 です。

組み合わせループ

組み合わせループは、変数がレジスタを介さずに組み合わせロジックを通じて自身に依存する場合に発生します。Verylは組み合わせループをコンパイル時に検出し、エラーとして報告します。

// エラー:組み合わせループ
var x: logic<8>;
always_comb {
    x = x + 1; // x が自身に依存している
}

実装に関する注記

Verylの組み込みシミュレータは、データ依存関係のトポロジカルソートを使用して効率的な評価順序を決定し、再評価パスの回数を最小化します。これはパフォーマンスの最適化であり、観測可能な結果は上述のイベント駆動再トリガーモデルと同等です。