urandom_range(), urandom(), verilog 中的随机()
urandom_range(), urandom(), random() in verilog
我对这三个函数感到困惑,想得到一些解释。如果我设置范围,我该如何使范围成为独占或包含范围?如果我不指定范围,范围是包含还是排除?
您应该只使用 $urandom
和 $urandom_range
。这两个函数提供了比 $random
质量更好的随机数和更好的种子初始化和稳定性。 $urandom_range 指定的范围始终包含在内。
虽然 $random
为每次调用生成完全相同的随机数序列,但一旦对设计或测试平台进行任何更改,就很难保持相同的调用顺序。当多个线程同时生成随机数时更加困难。
除了@dave_59的回答外,还有其他重要区别:
i) $random
returns 一个带符号的 32 位整数; $urandom
和 $urandom_range
return 无符号 32 位整数。
ii) $random
的随机数生成器在 IEEE Std 1800-2012 中指定。使用相同的种子,您将在任何 SystemVerilog 模拟器中获得完全相同的随机数序列。 $urandom
和 $urandom_range
的情况并非如此,其中随机数生成器的设计取决于 EDA 供应商。
iii) 每个线程都有自己的 $urandom
和 $urandom_range
随机数生成器,而 $random
只有一个随机数生成器在所有线程之间共享(即只有一个对于整个模拟)。这非常重要,因为每个线程都有单独的随机数生成器可以帮助您模拟提高 属性 称为 随机稳定性 。假设您正在使用随机数生成器来生成随机刺激。假设你发现了一个错误并修复了它。这很容易改变线程(即 initial
和 always
块)的执行顺序。如果该更改改变了生成随机数的顺序,那么您将永远不知道错误是因为您修复了它还是因为刺激因素发生了变化而消失了。如果每个线程都有一个随机数生成器,那么您的测试台就不会那么容易受到这种影响——您可以更加确定错误已经消失,因为您修复了它。那属性就叫随机稳定.
所以,正如@dave_59所说,你应该只使用$urandom
和$urandom_range
。
我对这三个函数感到困惑,想得到一些解释。如果我设置范围,我该如何使范围成为独占或包含范围?如果我不指定范围,范围是包含还是排除?
您应该只使用 $urandom
和 $urandom_range
。这两个函数提供了比 $random
质量更好的随机数和更好的种子初始化和稳定性。 $urandom_range 指定的范围始终包含在内。
虽然 $random
为每次调用生成完全相同的随机数序列,但一旦对设计或测试平台进行任何更改,就很难保持相同的调用顺序。当多个线程同时生成随机数时更加困难。
除了@dave_59的回答外,还有其他重要区别:
i) $random
returns 一个带符号的 32 位整数; $urandom
和 $urandom_range
return 无符号 32 位整数。
ii) $random
的随机数生成器在 IEEE Std 1800-2012 中指定。使用相同的种子,您将在任何 SystemVerilog 模拟器中获得完全相同的随机数序列。 $urandom
和 $urandom_range
的情况并非如此,其中随机数生成器的设计取决于 EDA 供应商。
iii) 每个线程都有自己的 $urandom
和 $urandom_range
随机数生成器,而 $random
只有一个随机数生成器在所有线程之间共享(即只有一个对于整个模拟)。这非常重要,因为每个线程都有单独的随机数生成器可以帮助您模拟提高 属性 称为 随机稳定性 。假设您正在使用随机数生成器来生成随机刺激。假设你发现了一个错误并修复了它。这很容易改变线程(即 initial
和 always
块)的执行顺序。如果该更改改变了生成随机数的顺序,那么您将永远不知道错误是因为您修复了它还是因为刺激因素发生了变化而消失了。如果每个线程都有一个随机数生成器,那么您的测试台就不会那么容易受到这种影响——您可以更加确定错误已经消失,因为您修复了它。那属性就叫随机稳定.
所以,正如@dave_59所说,你应该只使用$urandom
和$urandom_range
。