Verilog 我能';我无法理解此$random(seed)代码的结果
在这段代码中,如果我用Verilog 我能';我无法理解此$random(seed)代码的结果,verilog,Verilog,在这段代码中,如果我用integer声明seed,则seed值每5秒更改一次。但是,如果我使用reg[3:0]声明seed,则seed值连续为5。我不明白为什么会发生这种情况。您的代码生成的样本量非常小(5)。你应该生成更多的随机数。当我这样做时,我看到了多个带有reg[3:0]种子的值。例如,将#30更改为#300 当我使用reg[31:0]种子时,得到的分布类型与使用integer时的分布类型相同。我在IEEE标准1800-2012中没有看到任何关于$random的解释,但第20.15.2节
integer
声明seed
,则seed
值每5秒更改一次。但是,如果我使用reg[3:0]
声明seed
,则seed
值连续为5。我不明白为什么会发生这种情况。您的代码生成的样本量非常小(5)。你应该生成更多的随机数。当我这样做时,我看到了多个带有reg[3:0]种子的值代码>。例如,将#30
更改为#300
当我使用reg[31:0]种子时代码>,得到的分布类型与使用integer
时的分布类型相同。我在IEEE标准1800-2012中没有看到任何关于$random
的解释,但第20.15.2节“分布函数”提到:
对于每个系统函数,seed参数都是inout参数;那个
即,一个值被传递给函数,另一个值被传递
返回。系统功能应始终返回相同的值
给同样的种子
每次通话时,您都会看到seed
发生变化
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
我强烈建议您开始使用$URADOM而不是$random。它可以很容易地从命令行控制种子,而无需重新编译,并且还可以获得更好的随机稳定性
$random的种子
应该至少是一个32位整数(虽然LRM中没有解释,但$random的代码在附加中)。32位种子并不意味着您将获得2**32-1随机数。随着种子宽度的缩短,重复随机数循环所需的随机数也随之缩短。当降到4位时,特定种子的周期变为1的概率相当高 你能展示一下两种形式之间的区别吗?使用always#5addr=$random(seed)代码>您每5个时间步调用random,如果random可以更新其种子,这就是它每5个时间步更改一次的原因。
$monitor("addr=%d seed=%d", addr, seed);