在以下简化的Verilog代码中:
wire [31:0] depth;
wire mode_u2 = 1'h0;
assign depth = 'h80 + (~mode_u2);
如果我在深度上进行显示,并使用VCS(2014.12-1)进行模拟
$display("depth is 0x%2x", depth);
我得到的是0x7f
,而不是预期的0x81
。好像~mode_u2被视为负1。
如果我将~mode_u2
更改为!mode_u2
。我按预期得到了0x81。
更有趣的是,如果我wire mode = ~mode_u2
然后assign depth = 'h80 + (~mode)
而不是0x80
,我会0x7e
我在这里遗漏了什么吗?
有人能解释为什么~
在+
操作中以这种方式行事吗?或者这些模拟和综合是不同的情况之一?
非常感谢!!
威利
答案 0 :(得分:2)
添加运算符的操作数需要在添加完成之前扩展到左侧的大小(或两个操作数的最大宽度,具体取决于上下文)。
在这种情况下,mode_u2
需要扩展到32位。我无法找到此参考,但看起来位扩展优先于~
运算符。这意味着:
depth = 'h80 + (~mode_u2) =
32'h0000_0080 + (~32h0000_0000) =
32'h0000_0080 + 32'hffff_ffff =
32'h0000_007f
!
运算符的结果,但根据定义是一位,我的猜测是位扩展发生了两次:
depth = 'h80 + (!mode_u2) =
32'h0000_0080 + (!32'h0000_0000) =
32'h0000_0080 + 1'h1 =
32'h0000_0080 + 32'h0000_0001 =
32'h0000_0081
同样适用于mode
:
depth = 'h80 + (~mode) =
32'h0000_0080 + (~32'h0000_0001) =
32'h0000_0080 + 32'hffff_fffe =
32'h0000_007e