$display计算-3*3输出错误结果,求原因分析
Verilog乘法输出与预期不符的原因分析
问题代码
module te( input a ); reg clk; reg [1:0]d1=2'd3; reg signed [2:0]d2=-3'd3; reg signed [4:0]d3; always @(posedge clk) begin d3<=d1*d2; $display("%b",d3);//01111,how to know the exact value?the expect value is 1001 end initial begin clk = 1'b1; end always begin #1 clk = ~clk;//for clock IP,100MHZ end endmodule
问题描述
已知-3*3=-9,寄存器d3的预期值为1001,但使用$display("%b",d3)输出的结果为01111,请问导致该输出与预期不符的原因是什么?
原因解析
变量类型不匹配导致运算规则错误
d1是无符号类型的reg [1:0],d2是有符号类型的reg signed [2:0]。在Verilog中,当无符号数与有符号数进行乘法运算时,会默认按照无符号数运算规则执行——无符号数的运算优先级更高,整个运算会被强制提升为无符号类型。- 具体计算:
d1的二进制是11(无符号值为3),d2被当作无符号数时,二进制101对应的值是5,两者相乘3*5=15,二进制为01111,这就是$display输出的结果。
预期值的认知偏差
- 你预期的
1001是-9的4位有符号二进制,但d3是5位有符号寄存器,-9的5位有符号二进制应该是10111,而非1001。即使运算逻辑正确,输出也不会是1001。
- 你预期的
修正方案
将d1也声明为有符号类型,确保乘法按照有符号规则执行:
reg signed [1:0]d1=2'd3;
此时两个有符号数相乘,3*-3=-9,d3的5位有符号二进制为10111,$display("%b",d3)会输出正确结果。
内容的提问来源于stack exchange,提问作者kittygirl
相关产品推荐
相关产品推荐

