使用带有负数的系统函数$urandom_range(minval, maxval)时未定义的行为 &



当我尝试模拟下面的代码时,有一个非常奇怪的行为。regin实际显示的值比系统函数$urandom_range给出的范围大。我已经看到,当我尝试使用无符号reg并在给定函数的范围内使用负值时,会发生这种行为。代码如下:

注意:在下面的模拟结果中,我们可以看到大于8的值,如"15","12"。


`timescale 1ns/1ns
module test_tb();
parameter IN_SIZE = 5;

reg signed [IN_SIZE-1 : 0] in;
reg clk;
initial begin 
clk = 0;
forever clk = #5 ~clk ;
end
always @(posedge clk) begin  

in = $urandom_range(-16, 8);
$display("The generated number is %d ", in);
end
endmodule

#仿真结果

生成的号码为15

生成的数字是4

生成的数字是4

生成的数字是4

生成的数字是-16

生成的数字是15

生成的数字是-2

生成的数字是12

生成的数字是8

生成的数字是1

IEEE Std 1800-2017规定$urandom_range如下:

function int unsigned $urandom_range(int unsigned maxval, intUnsigned minval = 0);

这表明函数的输入必须是unsigned值。因此,-16是不合法的。这个函数返回意料之外的值是不足为奇的。不幸的是,我尝试的两个模拟器都没有生成错误或警告。

要获得-16到8范围内的带符号值,请使用正数,然后减去16。变化:

in = $urandom_range(-16, 8);

:

in = $urandom_range(24) - 16;

相关内容

  • 没有找到相关文章

最新更新