串联verilog中的奇怪事情

strange thing in concatenation verilog

我在 verilog 中有一个模块,它获取两个 64 位数字。这些数字是随机的。奇怪的是,我调试的时候,fa是正确的,是1开头的,但是fb竟然是0开头的。

有什么问题吗?

module adder(sum,a, b);
   input [63:0]   a;
   input [63:0] b;
   reg one;
output  reg [63:0] sum;
   reg [63:0] fa,fb;

    always @(a or b) begin
      one=1'b1;
    
      fb={one,b[51:0],12'b0};
      fa={one,a[51:0],12'b0};
      sum=64'b1;
    end
  endmodule

此赋值中存在位宽不匹配:

fb={one,b[51:0],12'b0};

左侧 (LHS) 为 64 位宽,但右侧 (RHS) 为 65 位宽。

左轴:

  • fb 是 64 位宽 [63:0].

右手:

  • one 是 1 位宽
  • b[51:0] 是 52 位宽
  • 12'b0 是 12 位宽

(1+52+12=65)

one 被忽略,因为 fb[11:0]=12'b0 和 fb[63:12]=b[51:0]。因此,如果b[51]=0,则fb[63]=0.

fa也是如此。