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);