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。我不明白为什么会这样。
答案 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的概率非常高。