2014-02-14 676 views
2

我每次运行下面的代码时都会得到相同的输出。SystemVerilog数组随机种子Shuffle函数

module array_shuffle; 
    integer data[10]; 

    initial begin 
     foreach (data[x]) begin 
     data[x] = x; 
     end 

     $display("------------------------------\n"); 
     $display("before shuffle, data contains:\n"); 

     foreach (data[x]) begin 
     $display("data[%0d] = %0d", x, data[x]); 
     end 

     data.shuffle(); 
     $display("------------------------------\n"); 
     $display("after shuffle, data contains:\n"); 

     foreach (data[x]) begin 
     $display("data[%0d] = %0d", x, data[x]); 
     end 

    end 
endmodule 

输出:

------------------------------ 

before shuffle, data contains: 

data[0] = 0 
data[1] = 1 
data[2] = 2 
data[3] = 3 
data[4] = 4 
data[5] = 5 
data[6] = 6 
data[7] = 7 
data[8] = 8 
data[9] = 9 
------------------------------ 

after shuffle, data contains: 

data[0] = 8 
data[1] = 6 
data[2] = 7 
data[3] = 9 
data[4] = 5 
data[5] = 0 
data[6] = 1 
data[7] = 4 
data[8] = 2 
data[9] = 3 

有没有办法播种随机播放功能的随机化?

回答

3

Shuffle每次都会返回相同的结果,因为您可能使用相同的种子运行模拟器。这是预期的行为,因为当你运行一个模拟并找到一个bug时,无论任何设计(以及某种程度上的测试平台)变化,你都希望能够重现它。要查看不同的输出,请尝试在模拟器命令行上设置种子。对于精辟是这样的:

irun -svseed 1 // sets the seed to 1 
irun -svseed random // will set a random seed 

它也可以操纵使用set_randstate随机数发生器的种子,但我不会乱用那个。

+0

这是供应商特定的解决方案,但我认为没有标准方法。 – e19293001

+0

不确定你的意思。所有模拟器都有一个机制来控制命令行中的种子。由于该标准没有明确定义随机化引擎的实现,所以基于该种子生成的随机值将是供应商特定的,当然, –