Case / Switch

caseswitch は文として使うこともできます。各アームの右辺が文になる点を除けば Case / Switch 式 と同じです。

module ModuleA {
    let a: logic<10> = 1;
    var b: logic<10>;
    var c: logic<10>;

    always_comb {
        case a {
            0: b = 1;
            1: b = 2;
            2: {
                   b = 3;
                   b = 3;
                   b = 3;
               }
            default: b = 4;
        }
    }

    always_comb {
        switch {
            a == 0: c = 1;
            a == 1: c = 2;
            a == 2: {
                        c = 3;
                        c = 3;
                        c = 3;
                    }
            default: c = 4;
        }
    }
}

cond_type アトリビュート

SystemVerilogにおける unique unique0 priority を指定するために、cond_type アトリビュートを使うことができます。これらのアトリビュートは case あるいは if 文に付けることができます。

  • unique: アイテムは重複しない。マッチするアイテムがなければエラー。
  • unique0: アイテムは重複しない。マッチするアイテムがなくてもエラーではない。
  • priority: 最初にマッチしたアイテムが使われる。マッチするアイテムがなければエラー。
module ModuleA {
    let a: logic<10> = 1;
    var b: logic<10>;

    always_comb {
        #[cond_type(unique)]
        case a {
            0: b = 1;
            1: b = 2;
        }
    }
}

これらのアトリビュートは合成時により積極的な最適化を可能にしますが、期待される条件を満たさない場合に合成結果が不正になる可能性があります。そのためデフォルトではアトリビュートは無視され、以下の設定がある場合のみ出力されます。

[build]
emit_cond_type = true