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的补码方案中)?
谢谢!
i)Verilog中的乘法运算符导致所谓的上下文确定表达式.在自定义表达式中用于算术的宽度取决于操作数的宽度和结果.同
assign c = a*b;
Run Code Online (Sandbox Code Playgroud)
用于乘法的宽度将是最宽的a,b和c.在您的情况下,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,b和c)和符号的算术运算被使用(因为两个a和b被签名),其结果是189,当其截断为一个4位符号数是-3.
因此,您可以根据预期的操作数范围使用合适的宽度.
ii)在Verilog中,如果混合使用无符号和有符号操作数,则将使用无符号算术.因此,在您的情况下,由于两个操作数都已签名,因此将使用带符号的算术.(结果是否未签名或签名是无关紧要的.)