【发布时间】:2018-07-05 21:34:29
【问题描述】:
我为我的参数化设计编写了一个测试平台,我需要在其中随机化输入。当我发现如果我运行以下代码时,我感到非常惊讶,我的 16 位 val 会得到一个不错的随机数:
val = $urandom_range(16'hffff, 0);
我使用下面的代码用 32 位数字 (val[31:0]) 测试我的设计:
val = $urandom_range(32'hffff_ffff, 0);
但是,在这种情况下,我总是得到 0 或 32'hffff_ffff。我不知道这是否是 xilinx 工具中的一个已知错误。我将我的测试代码减少到以下,我仍然得到相同的结果:
initial begin
static print_verbosity verbosity = VERB_LOW;
static int unsigned num_tests = 1000;
int unsigned val;
for (int test_id=0; test_id<num_tests; test_id++) begin
val = $urandom_range(32'hffff_ffff, 0);
`test_print("INFO", $sformatf("val=%0d", val), verbosity)
end
$finish();
end
我得到的输出是以下模式:
[ INFO] val=0
[ INFO] val=4294967295
[ INFO] val=4294967295
[ INFO] val=0
[ INFO] val=4294967295
[ INFO] val=0
[ INFO] val=4294967295
[ INFO] val=0
我将 urandom_range 的上限更改如下:
val = $urandom_range(32'hefff_ffff, 0);
这次我得到了随机数。我想知道是否有人可以帮助我找出我犯错的地方。我正在使用最新的 Vivado 2018.2 模拟器。
【问题讨论】:
-
虽然我没有 vivado 可以试用,你可以试试
$urandom_range(32'hFFFF_FFFE, 0);吗?我的猜测是你会在0、4294967295或4294967294之间得到随机数,如果是这样,这是一个错误,因为int unsigned在某处被强制转换为int。 (在 edaplayground 上使用各种模拟器进行测试表明它的 vivado 有问题) -
我用
iverilog测试了代码,得到了不同的结果。当我使用iverilog 时,我只得到零。我还用iverilog 测试了$urandom_range(32'hFFFF_FFFE, 0),结果一直为零。对我有用的最大上限是$urandom_range(32'h7FFF_FFFF, 0),这表明一旦符号位切换,urandom_range 代码中的某些地方就会出错。我还使用有符号和无符号输出变量(在我的代码val中)对其进行了测试,并得到了相同的结果。 -
1.
$urandom_range的实现没有被标准指定,它留给 EDA 供应商。 2. 如果第一个小于第二个,$urandom_range会自动反转它的参数。结论:32'hffff_ffff可能在内部被解释为 -1(这是一个错误)。 -
当使用
$urandom_range(32'hefff_ffff, 0)时,您是否有介于0 和32'hefff_ffff或32'hefff_ffff和32'hefff_ffff之间的真正随机值? -
这是我在约束
$urandom_range(32'hefff_ffff)时得到的:f43595ce,f6348641,fa8f1318,f6197b8c,f32c177b,f519261b,fb4d8296,fc7fd39a,f780a3a6,fc34c4c5,fccb9bae,f147c03c,fa4d9253,f71a657f,f6311d7f,fb656d54,f5deaaed,f797de03如果你仔细观察,所有的随机数都以 f 开头,这表明它仍然不是随机的
标签: verilog system-verilog xilinx vivado