在一般的数学和软件编程中,-4 mod 5= 1。但是在Verilog中,答案是2。原因似乎是因为二进位的除法。我如何正确地处理这个计算?下面是再现此行为的Verilog代码。
module test (a,b,c);
input [0:3]a,b;
output [0:3]c;
assign a = -4'd4;
assign b = 4'd5;
assign c = a%b;
endmodule发布于 2022-01-29 16:41:45
您的代码对未签名的数据执行操作。在该方案中,-4与12完全相同,模的结果是2。
您需要使用签名的数据,如下所示:
module test (
input signed [0:3]a,b, // <<<< signed
output signed [0:3]c // <<<< signed
):
assign a = -4'd4;
assign b = 4'd5;
assign c = a%b;
always @*
$display(a,b,c);
endmodule结果是-4,正如一般编程规则所期望的那样。
发布于 2022-01-29 16:53:15
您没有将变量声明为已签名,因此它们被视为无符号。-4‘d4被解释为2的补体4’B12 (~4’b0100 + 1’b1 == 4’b1100)
您需要将signed关键字添加到信号定义中。
module test;
wire signed [3:0] a,b,c;
assign a = -4'd4;
assign b = 4'd5;
assign c = a%b;
endmodulehttps://stackoverflow.com/questions/70904695
复制相似问题