在 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
您的代码对 未签名 数据执行 %
操作。在此方案中,-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
,正如 一般 编程规则所预期的那样。
您没有将变量声明为有符号,因此它们被视为无符号。 -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
在一般的数学和软件编程中,-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
您的代码对 未签名 数据执行 %
操作。在此方案中,-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
,正如 一般 编程规则所预期的那样。
您没有将变量声明为有符号,因此它们被视为无符号。 -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