verilog - 使用带负数的系统函数 $urandom_range(minval, maxval) 时的未定义行为
问题描述
当我尝试模拟以下代码时,有一个非常奇怪的行为。实际上显示的reg
in
值大于系统函数中给定的范围$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
如下:
函数 int unsigned $urandom_range( int unsigned maxval, int unsigned minval = 0 );
这表明函数的输入必须是无符号值。因此,-16 是非法的。函数返回意外的值也就不足为奇了。不幸的是,我试过的模拟器都没有产生错误或警告。
要获得 -16 到 8 范围内的有符号值,请使用正值并减去 16。更改:
in = $urandom_range(-16, 8);
至:
in = $urandom_range(24) - 16;
推荐阅读
- node.js - 如何在另一个 Docker 容器中提供/更新内容
- regex - 在 Google 表格的一行中的单独列中显示每个数字
- java - 如何通过给出年份来获取字符串类型或时间戳类型
- ios - 结合@Published 属性:在更新期间从其他地方获取当前值
- html - 难以理解如何删除一些填充
- node.js - 在客户端存储 JWT 令牌的位置以及如何保护它?
- r - 如何使用 R str_interp 或 str_glue 处理未分配的变量
- asp.net - 将 asp.net 代码推送到 azure devops 时出现 vsbuild 错误
- zip - 将文件夹存储到单个文件中,而不使用外部库或数据库
- ios - Swiftui Form View 跳转错误