てがみ: qatacri at protonmail.com | 統計 | 2024

202412100

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 にしたくないのだが。