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
类,首先需要classprocess
变量:
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
只设置了种子
另请参见我的答案,其中包含有用的背景资料:
展示您的尝试,以及您看到的结果与预期的结果总是有帮助的。