verilog"〜"操作员另外操作会产生不必要的结果

时间:2015-02-20 23:19:32

标签: verilog system-verilog

在以下简化的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

我在这里遗漏了什么吗?

有人能解释为什么~+操作中以这种方式行事吗?或者这些模拟和综合是不同的情况之一?

非常感谢!!

威利

1 个答案:

答案 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