sha*_*ura 5 verilog system-verilog
在以下简化的Verilog代码中:
wire [31:0] depth;
wire mode_u2 = 1'h0;
assign depth = 'h80 + (~mode_u2);
Run Code Online (Sandbox Code Playgroud)
如果我在深度上进行显示,并用VCS进行模拟(2014.12-1)
$display("depth is 0x%2x", depth);
Run Code Online (Sandbox Code Playgroud)
我得到了0x7f
,而不是预期的0x81
.好像~mode_u2被视为减1.
如果我换~mode_u2
到!mode_u2
.我按预期得到0x81.
更有趣的是,如果我做wire mode = ~mode_u2
,然后assign depth = 'h80 + (~mode)
而不是0x80
,我得到0x7e
我在这里错过了什么吗?
有人可以解释为什么~
在+
操作中这样做吗?或者这些模拟和综合中的哪一个是不同的情况?
非常感谢!!
威利
在完成加法之前,加法运算符的操作数需要扩展到左侧的大小(或两个操作数的最大宽度,具体取决于上下文)。
这种情况下mode_u2
需要扩展到32位。我无法找到这方面的参考,但看起来位扩展优先于~
运算符。这意味着:
depth = 'h80 + (~mode_u2) =
32'h0000_0080 + (~32h0000_0000) =
32'h0000_0080 + 32'hffff_ffff =
32'h0000_007f
Run Code Online (Sandbox Code Playgroud)
然而,根据定义,运算符的结果!
是单个位,我的猜测是位扩展发生了两次:
depth = 'h80 + (!mode_u2) =
32'h0000_0080 + (!32'h0000_0000) =
32'h0000_0080 + 1'h1 =
32'h0000_0080 + 32'h0000_0001 =
32'h0000_0081
Run Code Online (Sandbox Code Playgroud)
同样对于mode
:
depth = 'h80 + (~mode) =
32'h0000_0080 + (~32'h0000_0001) =
32'h0000_0080 + 32'hffff_fffe =
32'h0000_007e
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
145 次 |
最近记录: |