Verilog有符号乘法:将不同大小的数字相乘?

Verilog有符号乘法:将不同大小的数字相乘?,verilog,system-verilog,Verilog,System Verilog,出于某种原因,我无法找到任何明确的资源或问题来回答: verilog在乘以有符号数字时是否考虑输入和输出维度 具体来说,如果我将一个有符号的32位与一个有符号的64位数字相乘,会发生什么?因此,如果我有: reg signed [31:0] a = -5; reg signed [63:0] b = 5; wire signed [63:0] c; assign c = a*b; c是否等于-25(在64位2的补码方案中) 如果我声明c是一个32位的数字呢?它还会是-25吗(在32位2的补码方

出于某种原因,我无法找到任何明确的资源或问题来回答:

verilog在乘以有符号数字时是否考虑输入和输出维度

具体来说,如果我将一个有符号的32位与一个有符号的64位数字相乘,会发生什么?因此,如果我有:

reg signed [31:0] a = -5;
reg signed [63:0] b = 5;
wire signed [63:0] c;
assign c = a*b;
c是否等于-25(在64位2的补码方案中)

如果我声明c是一个32位的数字呢?它还会是-25吗(在32位2的补码方案中)

谢谢

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

assign c = a*b;
用于乘法的宽度将是
a
b
c
中最宽的。在您的例子中,
b
在64位时最宽,因此乘法将使用64位算术

然后将结果分配给32位宽的
导线
-
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;

给出
c
的值
-3
,因为虽然乘法使用8位(最宽的
a
b
c
)并使用有符号算术(因为
a
b
都有符号),结果是189,当截断为4位有符号数时,结果是-3

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


ii)在Verilog中,如果混合使用无符号和有符号操作数,将使用无符号算术。因此,在您的例子中,由于两个操作数都是有符号的,所以将使用有符号算术。(结果是无符号的还是有符号的无关紧要。)

为什么不试试看呢?你只关心整数的乘法吗?而不是定点数字。是的,我只关心整数谢谢!这有助于lotSo,如果执行
(8位)*(8位)=>(16位)
操作,结果将被截断为8位,而不是占用整个16位空间?将使用@harryheadle No-16位。“*”运算符也会考虑结果的宽度。(
assign c=a*b;
用于乘法的宽度将是
a
b
c
中最宽的一个)