使用连接和大小写时移位器输出始终为 0

Shifter output is always 0 when using concatenation and case

我有以下代码:

module shifter(
    input[7:0] in,
    input[1:0] amt,
    output logic[7:0] out
);

always_comb case(amt)
    2'h0: out = in;
    2'h1: out = {{in[6:0]}, 0};
    2'h2: out = {{in[5:0]}, 0, 0};
    2'h3: out = {{in[4:0]}, 0, 0, 0};
    default: out = in;
endcase

endmodule

它描述了一个简单的移位器,它通过 amt 输入接收移位量。问题是无论 amt 的值是多少(0 ​​除外),out 始终为 0,如测试波形所示:

我连接错了吗?然而我在网上看到的例子与此类似。

尝试将 0 的大小限制为 2'h1: out = {{in[6:0]}, 0}; 中的 1'b0。发生的情况是您正在分配 in[6:0] 和 32 位(默认宽度)0 的串联,因此只有 0 的 LSB 进入 out

此外,default 是多余的,因为您已经描述了 amt 的所有可能情况。

根据 IEEE 1800-2017 LRM 第 11.4.12 节串联运算符,您编写的代码是非法的:

Unsized constant numbers shall not be allowed in concatenations. This is because the size of each operand in the concatenation is needed to calculate the complete size of the concatenation

你使用的工具有bug,没有捕捉到这个错误,自己很难发现。