verilog"〜"运算符另外运算会产生不需要的结果

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

我在这里错过了什么吗?

有人可以解释为什么~+操作中这样做吗?或者这些模拟和综合中的哪一个是不同的情况?

非常感谢!!

威利

Ari*_*Ari 2

在完成加法之前,加法运算符的操作数需要扩展到左侧的大小(或两个操作数的最大宽度,具体取决于上下文)。

这种情况下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)