【问题标题】:randomizing 32 bit value in systemverilog with xilinx vivado 2018.2使用 xilinx vivado 2018.2 在 systemverilog 中随机化 32 位值
【发布时间】: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); 吗?我的猜测是你会在042949672954294967294 之间得到随机数,如果是这样,这是一个错误,因为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_ffff32'hefff_ffff32'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


【解决方案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

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

【讨论】:

  • 感谢您进行实验。我会提交一份bu报告
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多