【发布时间】:2016-12-15 14:00:30
【问题描述】:
有没有办法在范围内使用 $urandom/$random?
我通过以下方式成功使用最大范围(在这种情况下 11 是最大范围):
temp = (($urandom(9)%11));
但是我怎样才能做到最大值和最小值,例如 max=11, min =8。
【问题讨论】:
标签: random system-verilog
有没有办法在范围内使用 $urandom/$random?
我通过以下方式成功使用最大范围(在这种情况下 11 是最大范围):
temp = (($urandom(9)%11));
但是我怎样才能做到最大值和最小值,例如 max=11, min =8。
【问题讨论】:
标签: random system-verilog
你需要$urandom_range,例如:
temp = $urandom_range(maxVal,minVal);
minVal 是可选的;如果你忽略它,最小值将为零。
【讨论】:
$urandom_range 的播种方式与 $urandom 相同。如何完成是特定于供应商的。 $random 是如何播种的在 Verilog 标准中定义,但是如果您使用 $random,您只会得到一个随机数生成器,因此您的随机稳定性很差。
$urandom、$urandom_range 或 randomize(),每个线程将有自己的随机数生成器 (RNG),并且该 RNG 是从父线程中播种的。因此,每个线程的种子取决于父线程在生成线程时的 RNG 状态。因此,当您随机化事务时,RNG 使用执行 $urandom、$urandom_range 或 randomize() 的线程的种子,这通常是 sequencer 中的代码正在使用的线程(或任何你想叫它的名字)。
另请注意,$urandom_range 的参数是 int 无符号的,因此 -1 将被视为一个非常正数,如果 minVal 大于 maxVal,它们会自动交换。
$urandom_range 非常方便,但您也可以查看 std::randomize() 并使用“内部”进行内联约束,例如:
ok = std::randomize(a) with {a inside {0, [12:23], 42}; };
【讨论】: