Case / Switch
case
と switch
は文として使うこともできます。各アームの右辺が文になる点を除けば 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