使用 xilinx vivado 2018.2 在 systemverilog 中随机化 32 位值
randomizing 32 bit value in systemverilog with xilinx vivado 2018.2
我已经为我的参数化设计编写了一个测试台,我需要在其中随机化输入。当我发现如果我 运行 以下代码时,我为我的 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 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
我认为你应该提交错误报告。
我已经为我的参数化设计编写了一个测试台,我需要在其中随机化输入。当我发现如果我 运行 以下代码时,我为我的 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 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
我认为你应该提交错误报告。