我无法理解这个$ random(种子)代码的结果

时间:2016-03-03 16:38:59

标签: verilog

module random;

 reg[31:0] addr;
 integer seed;

 initial begin
 seed = 5;
 $monitor("%t->%d", $time, addr);
 #30 $stop;
 end

 always #5 addr = $random(seed);

 endmodule

在这段代码中,如果我在上面的代码中显示带有整数的'seed',那么'seed'值会每隔#5更改一次。但如果我用reg [3:0]声明'种子','seed'值连续为5。我不明白为什么会这样。

2 个答案:

答案 0 :(得分:0)

您的代码生成非常小的样本大小(5)。你应该生成更多随机数。当我这样做时,我在master看到了多个值。例如,将SELECT DB_NAME()更改为reg [3:0] seed;

当我使用#30时,我获得与使用#300时相同的分发类型。对于reg [31:0] seed;,我在IEEE Std 1800-2012中没有看到对此行为的任何解释,但是第20.15.2节"分布函数"提到:

  

对于每个系统函数,seed参数是一个inout参数;那   是,将值传递给函数,并且值不同   回。系统函数应始终返回相同的值   同样的种子。

每次通话都应该看到integer更改。

$random

答案 1 :(得分:0)

我强烈建议您开始使用$ urandom而不是$ random。它可以轻松地从命令行控制种子而无需重新编译,并且您也可以获得更好的随机稳定性。

seed到$ random应该至少是一个32位整数(尽管在LRM中没有解释,$ random的代码在附加中)。 32位种子并不意味着您将获得2 ** 32-1个随机数。缩短种子的宽度时,可以缩短重复随机数循环所需的随机数。当你下降到4位时,特定种子的循环变为1的概率非常高。

相关问题