使用串联和大小写时,移位器输出始终为0

时间:2018-06-14 06:28:54

标签: verilog system-verilog modelsim intel-fpga

我有以下代码:

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,如测试波形所示:

enter image description here

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

2 个答案:

答案 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连接运算符,您编写的代码是非法的:

  

连接中不允许使用未定义的常数。这个   是因为需要连接中每个操作数的大小   计算连接的完整大小

您使用的工具有一个错误,并没有发现此错误,这很难自行找到。