Verilog 如何重新设定静态进程的RNG种子?

Verilog 如何重新设定静态进程的RNG种子?,verilog,system-verilog,Verilog,System Verilog,我有一个总是进程在我的测试台上运行,它调用$uradom\u range()当我运行我的测试台时,是否可以重新设置种子 我猜它与srandom有关,但无法让它工作。可以通过调用带有整数参数的$uradom来为线程(即,$uradom等使用的)的随机数生成器设置种子,例如: $urandom(12345); 您提到的是srandom。这是与线程的随机数生成器交互的另一种方式,即使用进程类,该类是在std包中声明的类。这个进程类有一个名为srandom的方法,它从一个整数中为当前线程播种 要使用

我有一个
总是
进程在我的测试台上运行,它调用
$uradom\u range()
当我运行我的测试台时,是否可以重新设置种子


我猜它与srandom有关,但无法让它工作。

可以通过调用带有整数参数的
$uradom
来为线程(即,
$uradom
等使用的)的随机数生成器设置种子,例如:

 $urandom(12345);
您提到的是
srandom
。这是与线程的随机数生成器交互的另一种方式,即使用
进程
类,该类是在
std
包中声明的类。这个进程类有一个名为
srandom
的方法,它从一个整数中为当前线程播种

要使用
process
类,首先需要class
process
变量:

   std::process p;
然后您需要为这个变量分配一个进程类的静态方法的返回值,称为
self

   p = process::self(); 
如果你不熟悉面向对象的设计,别担心。相信我。这就是你需要做的。把这两行想象成某种魔法。一旦我们发出了这个魔法,我们就可以调用
srandom
方法来为线程的随机数生成器播种,例如:

  p.srandom(12345);
那么,
srandom
$urandom?
之间有什么区别呢,或者换一种说法:

如果我使用process类的
srandom
方法设置种子,这是否会将线程的随机数生成器设置为与使用
$uradom
设置相同种子相同的状态

没有区别。除了有

什么?让我们将一些代码(如本答案底部)放入EDA中:

让我们使用srandom为线程的随机数生成器设定种子:

   p.srandom(9);
然后让我们生成四个随机数:

   repeat(4) $display( $urandom ); 
看看我们得到了什么:

# KERNEL:  659167701
# KERNEL: 3562992094
# KERNEL: 2163162795
# KERNEL: 4088777565 
# KERNEL: 3562992094
# KERNEL: 2163162795
# KERNEL: 4088777565
# KERNEL: 3967046865 
然后让我们使用
$uradom:

   $urandom(9);
我们再生成四个随机数

  repeat(4) $display( $urandom ); 
再次让我们看看我们得到了什么:

# KERNEL:  659167701
# KERNEL: 3562992094
# KERNEL: 2163162795
# KERNEL: 4088777565 
# KERNEL: 3562992094
# KERNEL: 2163162795
# KERNEL: 4088777565
# KERNEL: 3967046865 
乍一看,我们似乎生成了不同的四个随机数。但是,仔细检查后,我们发现第二个(
$uradom
)系列的第一个编号与第一个系列的第二个编号相同(
srandom
)。为什么会这样?这是因为调用
$uradom
设置种子不仅设置了种子,还生成了一个随机数,而调用
srandom
只设置了种子



另请参见我的答案,其中包含有用的背景资料:


展示您的尝试,以及您看到的结果与预期的结果总是有帮助的。