我已经为我的参数化设计编写了一个测试平台,其中需要对输入进行随机化。当我发现如果运行以下代码,我会为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模拟器。
答案 0 :(得分:1)
已使用Vivado 2017.2确认:
module tst_urandom;
reg [31:0] numb1,numb2,numb3;
integer i;
initial
begin
for (i=0; i<20; i=i+1)
begin
numb1 = $urandom_range(32'hFFFFFFFF,0);
numb2 = $urandom_range(32'hFFFFFFFE,1);
numb3 = $urandom();
#10;
$display("0x%08X 0x%08X 0x%08X",numb1,numb2,numb3);
end
end
endmodule
产生:
Vivado Simulator 2017.2
Time resolution is 1 ps
0x00000000 0xffffffff 0x8484d609
0xffffffff 0x00000000 0x46df998d
0xffffffff 0xfffffffe 0x00f3e301
0x00000000 0x00000000 0x1e8dcd3d
0x00000000 0x00000001 0x7cfde9f9
0xffffffff 0xffffffff 0xd513d2aa
0x00000000 0xfffffffe 0x8932d612
0x00000000 0x00000001 0xe77696ce
0xffffffff 0xffffffff 0x2e58495c
0xffffffff 0xfffffffe 0xb2a72665
0xffffffff 0x00000000 0xc03b2280
0x00000000 0x00000001 0xcecccc9d
0xffffffff 0xfffffffe 0x86bc380d
0xffffffff 0x00000000 0xeaa62ad5
0xffffffff 0xffffffff 0x0effe91d
0xffffffff 0x00000000 0x0509650a
我认为您应该提交错误报告。