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

使用xilinx vivado 2018.2随机化systemverilog中的32位值,verilog,system-verilog,xilinx,vivado,Verilog,System Verilog,Xilinx,Vivado,我已经为我的参数化设计编写了一个测试台,其中我需要随机输入。当我发现如果我运行以下代码,我会为我的16位val得到一个很好的随机数时,我感到非常惊讶: val = $urandom_range(16'hffff, 0); 我使用以下代码使用32位数字(val[31:0])测试我的设计: 但是,在这种情况下,我总是得到0或32'hffff\u ffff。我不知道这是否是xilinx工具中已知的错误。我将测试代码缩减为以下内容,但仍然得到相同的结果: initial begin stati

我已经为我的参数化设计编写了一个测试台,其中我需要随机输入。当我发现如果我运行以下代码,我会为我的16位val得到一个很好的随机数时,我感到非常惊讶:

val = $urandom_range(16'hffff, 0);
我使用以下代码使用32位数字(val[31:0])测试我的设计:

但是,在这种情况下,我总是得到0或32'hffff\u 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  
我将Uradom_范围的上边界更改如下:

    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

我想你应该提交一份bug报告。

虽然我没有vivado可以试用,但你能试试
$uradom\u range(32'hFFFF\u FFFE,0)?我猜你会得到
0
4294967295
4294967294
之间的随机数,如果是这样,这是一个错误,因为
int unsigned
在某个地方被转换为
int
。(在EDA上用各种模拟器进行测试表明vivado出了问题)我用
iverilog
测试了代码,得到了不同的结果。当我使用iverilog时,我只得到零。我还用iverilog测试了
$uradom\u范围(32'hFFFF\u FFFE,0)
,一路上都得到了零。适用于我的最大上限是
$uradom\u范围(32'h7FFF\u FFFF,0)
,它指示一旦符号位切换,uradom\u范围代码中的某些位置就会出错。我还使用有符号和无符号输出变量(在我的代码
val
中)对其进行了测试,得到了相同的结果。标准中没有指定
$urandom\u范围的实现,而是留给EDA供应商。2. <如果第一个参数小于第二个参数,则code>$uradom_range
会自动反转其参数。结论:可能是
32'hffff\u ffff
在内部被解释为-1(这是一个bug)
你是否有介于0和
32'hefff\ufff
之间或介于
32'hefff\ufff
32'hefff\ufff
之间的真实随机值?这里是我在约束
$uradom\u范围(32'hefff\ufff)时得到的结果:
f43595ce、f6348641、fa8f1318、f6197b8c、f32c177b、f519261b、fb4d8296、FD39A、780FCA36、FCC49C5、FCC09E、,fa4d9253、f71a657f、f6311d7f、fb656d54、F5DEAED、f797de03
如果仔细观察,所有随机数都以f开头,这表明它仍然不是随机的。感谢您做了这个实验。我将提交一份bu报告
    val = $urandom_range(32'hefff_ffff, 0);
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