在 Verilog 中对负数求模

Applying Modulo To a Negative Number In Verilog

在一般的数学和软件编程中,-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

您的代码对 未签名 数据执行 % 操作。在此方案中,-412 无符号相同,模的结果为 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,正如 一般 编程规则所预期的那样。

您没有将变量声明为有符号,因此它们被视为无符号。 -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;

endmodule