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

Verilog signed multiplication: Multiplying numbers of different sizes?

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

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;

用于乘法的宽度将是 abc 中最宽的一个。在您的情况下,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;

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

c 一个值 -3,因为虽然乘法是使用 8 位完成的(abc 中最宽的) 并使用有符号算术(因为 ab 都是有符号的),结果为 189,当截断为 4 位有符号数时为 -3。

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

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