Verilog签名乘法:乘以不同大小的数字?

sir*_*ish 3 verilog system-verilog

出于某种原因,我一直无法找到任何确定的资源或stackoverflow问题来回答这个问题:

当有符号数乘以时,verilog会处理输入和输出维数吗?

具体而言,如果我将带符号的32位与带符号的64位数相乘,会发生什么?所以,如果我有:

reg signed [31:0] a = -5;
reg signed [63:0] b = 5;
wire signed [63:0] c;
assign c = a*b;
Run Code Online (Sandbox Code Playgroud)

c等于-25(在64位2的补码方案中)?

如果我将c声明为32位数怎么办?它仍然是-25(在32位2的补码方案中)?

谢谢!

Mat*_*lor 7

i)Verilog中的乘法运算符导致所谓的上下文确定表达式.在自定义表达式中用于算术的宽度取决于操作数的宽度和结果.同

assign c = a*b;
Run Code Online (Sandbox Code Playgroud)

用于乘法的宽度将是最宽的a,bc.在您的情况下,b最宽的是64位,因此64位算术将用于乘法.

然后,您将结果分配给32位宽wire- c.因此,64位结果将被截断为32位; MSB将丢失,这可能会导致奇怪的结果,例如:

reg signed [3:0] a = 3;
reg signed [7:0] b = 63;
wire signed [3:0] c;
assign c = a*b;
Run Code Online (Sandbox Code Playgroud)

http://www.edaplayground.com/x/f3b

给出c的值-3,因为而multiplcation使用8位(最宽的a,bc)和符号的算术运算被使用(因为两个ab被签名),其结果是189,当其截断为一个4位符号数是-3.

因此,您可以根据预期的操作数范围使用合适的宽度.

ii)在Verilog中,如果混合使用无符号和有符号操作数,则将使用无符号算术.因此,在您的情况下,由于两个操作数都已签名,因此将使用带符号的算术.(结果是否未签名或签名是无关紧要的.)

  • @HarryBeadle 否 - 将使用 16 位。“*”运算符还会考虑结果的宽度。(“使用‘assign c = a*b;’,用于乘法的宽度将是‘a’、‘b’和‘c’中最宽的一个。”) (2认同)