使用xilinx vivado 2018.2随机化systemverilog中的32位值

时间:2018-07-05 21:34:29

标签: verilog system-verilog xilinx vivado

我已经为我的参数化设计编写了一个测试平台,其中需要对输入进行随机化。当我发现如果运行以下代码,我会为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模拟器。

1 个答案:

答案 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

我认为您应该提交错误报告。