uwire[31:0] alu = (
op == 'b00 ? x + y :
op == 'b01 ? x - y :
op == 'b10 ? x & y :
op == 'b11 ? x | y :
'x
);
こんな感じの Verilog コードを
logic[31:0] alu;
always_comb case (op)
'b00: alu = x + y;
'b01: alu = x - y;
'b10: alu = x & y;
'b11: alu = x | y;
default: alu = 'x;
endcase
こう書き換えたら、最適化後でもぜんぜん違う回路が生成される。これくらいは最適化で等価になるかと思っていた。
他の人のコードを見てみると、
uwire[31:0] alu = (
(op == 'b00 ? x + y : '0) |
(op == 'b01 ? x - y : '0) |
...
とか
uwire[31:0] alu = (
{32'{op == 'b00}} & (x + y) |
{32'{op == 'b01}} & (x - y) |
...
とか。 |
の代わりに ^
を使っているコードもあった。しかしコードに忠実な回路が生成されると仮定するなら、回路が線形チェインになることには変わりない。 always_comb unique case
にしておくのが無難なのかなあ。組合せ回路はできるだけ procedual にしたくないのだが。