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左扩展为0,成为2'b01。而且,~(2'b01)2'b10

b为3位宽时也是如此。

请参阅IEEE Std 1800-2017,第11.6.2节表达式位长问题的示例