我有以下代码:
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 :(得分:4)
尝试将0
的大小限制为1'b0
中的2'h1: out = {{in[6:0]}, 0};
。会发生的是您正在分配in[6:0]
和32位(默认宽度)0
的串联,因此只有0
的LSB才会转到out
。
此外,default
是多余的,因为您已经为amt
描述了所有可能的案例。
答案 1 :(得分:1)
根据IEEE 1800-2017 LRM部分11.4.12连接运算符,您编写的代码是非法的:
连接中不允许使用未定义的常数。这个 是因为需要连接中每个操作数的大小 计算连接的完整大小
您使用的工具有一个错误,并没有发现此错误,这很难自行找到。