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

Verilog 使用带有负数的系统函数$urandom_range(minval,maxval)时的未定义行为,verilog,system-verilog,test-bench,Verilog,System Verilog,Test Bench,当我尝试模拟以下代码时,出现了一个非常奇怪的行为。中的reg实际显示的值大于系统函数$uradom\u range中给定的范围。当我尝试使用unsignedreg并在给定的函数范围内使用负值时,我看到了这种行为。代码如下所示 注:在下面的模拟结果中,我们可以看到有大于8的值,如“15”和“12” #模拟结果 生成的数字是15 生成的数字是4 生成的数字是4 生成的数字是4 生成的数字是-16 生成的数字是15 生成的数字是-2 生成的数字是12 生成的数字是8 生成的数字是1 IEEE标准180

当我尝试模拟以下代码时,出现了一个非常奇怪的行为。中的
reg
实际显示的值大于系统函数
$uradom\u range
中给定的范围。当我尝试使用unsigned
reg
并在给定的函数范围内使用负值时,我看到了这种行为。代码如下所示

注:在下面的模拟结果中,我们可以看到有大于8的值,如“15”和“12”

#模拟结果

生成的数字是15

生成的数字是4

生成的数字是4

生成的数字是4

生成的数字是-16

生成的数字是15

生成的数字是-2

生成的数字是12

生成的数字是8

生成的数字是1


IEEE标准1800-2017声明如下:

函数int unsigned$uradom_range(int unsigned maxval,int 无符号最小值=0)

这表明函数的输入必须是无符号的值。因此,-16是非法的。函数返回意外的值也就不足为奇了。不幸的是,我尝试的模拟器都没有产生错误或警告

要获得-16到8范围内的有符号值,请使用正值,然后减去16。更改:

in = $urandom_range(-16, 8);
致:

$uradom_range()
函数应在指定范围内返回一个值(maxval和minval都是无符号的)-IEEE1800-2017,第18.13.2章。我想说,否定参数的行为可能依赖于工具,或者参数的值被强制转换为无符号。
in = $urandom_range(-16, 8);
in = $urandom_range(24) - 16;