systemVerilog 中的逐位求反
bit-wise negation in systemVerilog
在下面的代码中,我希望“b”是 2'b00
,因为“a”的位数比“b”少,而且它们是无符号的 wire
。但是,在模拟结果中,“b”是2'b10
.
wire a;
wire [1:0]b;
assign a = 1'b1;
assign b = ~a;
我试过将“b”设置为宽度3,这次“b”是3'b110
。
wire a;
wire [2:0]b;
assign a = 1'b1;
assign b = ~a;
据我理解,如果RHS的位数比LHS少,那么LHS未使用的位应该为0。任何人都可以解释为什么会这样吗?
在第一种情况下,a
是 1 位宽,但 LHS (b
) 是 2 位宽。对 b
的赋值强制所有值都为最大宽度 (2)。在按位求反之前,a
是 left-extended 加 0,变成 2'b01
。而且,~(2'b01)
是 2'b10
.
当b
为3位宽时也是如此
参考 IEEE Std 1800-2017, section 11.6.2 Example of expression bit-length 问题.
在下面的代码中,我希望“b”是 2'b00
,因为“a”的位数比“b”少,而且它们是无符号的 wire
。但是,在模拟结果中,“b”是2'b10
.
wire a;
wire [1:0]b;
assign a = 1'b1;
assign b = ~a;
我试过将“b”设置为宽度3,这次“b”是3'b110
。
wire a;
wire [2:0]b;
assign a = 1'b1;
assign b = ~a;
据我理解,如果RHS的位数比LHS少,那么LHS未使用的位应该为0。任何人都可以解释为什么会这样吗?
在第一种情况下,a
是 1 位宽,但 LHS (b
) 是 2 位宽。对 b
的赋值强制所有值都为最大宽度 (2)。在按位求反之前,a
是 left-extended 加 0,变成 2'b01
。而且,~(2'b01)
是 2'b10
.
当b
为3位宽时也是如此
参考 IEEE Std 1800-2017, section 11.6.2 Example of expression bit-length 问题.