Verilog中%运算符的范围是多少?在C中,我知道如果我写了数字%10,那么输出在0到9之间。但我尝试在Verilog中得到的结果是在-9和9之间?这是为什么?
enter code here
module testbench;
integer i;
reg signed [15:0] a,b;
initial
begin
for(i = 0; i < 9; i = i + 1)
begin
a= $random%10;
b= $random%20;
$display("A: %d and B : %d",a,b);
end
end
endmodule
答案 0 :(得分:4)
模数可以返回负数,如Verilog的IEEE Std1364-2001§4.1.5算术运算符以及SystemVerilog的IEEE Std 1800-2012§11.4.3算术运算符< / em>的
模数运算的结果应采用第一个操作数的符号。
两个LRM(语言参考手册)也举例说明。
要保证正数,您可以使用$unsigned()
。例如:
a = $unsigned($random) % 10;
如果您启用了SystemVerilog,则可以将$unsigned($random)
替换为$urandom
,或将$unsigned($random) % 10
替换为$urandom_range(9, 0)
;见IEEE Std 1800-2012§18.13随机数系统函数和方法
仅供参考:C / C ++对负数做同样的事。请参阅之前已回答的问题:Modulo operation with negative numbers和Modulo operator with negative values