在使用verilog testbench产生随机数时碰到如下疑问:
testbench中的代码:
read_times = $random;
vcs命令为:
vcs -full64 -sverilog -debug_pp
simv +ntb_random_seed_automatic
尽管每次产生的seed不同,但每次跑vcs得到的read_times都是相同的。
如果把testbench中的代码改成如下:
read_times = $urandom;
则每次跑vcs可以得到不同的read_times。
从systerverilog的标准中也看不出$random和$urandom有什么区别(除了$urandom产生无符号数外)。
1、随机系统函数包括$random(seed),$urandom(seed),$urandom_range(min,max),$srandom(seed),其中$random(seed)是verilog2001的语法,后面3个是sv的语法。
2、$random与$urandom除了有无符号的区别还有其他不同。sv语法中有提到线程稳定性的区别。
3、$random如果不带种子会使用系统缺省的种子产生随机数,这可能是每次不变的原因,你带上种子参数试试看是是否改变。
4、$urandom不带种子也可以随机,我猜测可能是因为verilog与sv对其处理机制不一样,且也不能排除不同编译仿真器对其理解的不同而导致的。
多谢回答!
$urandom不带种子可以随机,是因为simv加了这个option:+ntb_random_seed_automatic
表示加入以日期和服务器ID组合成的种子,即每次仿真的种子不同。
$random我试过带不同的种子,但每次仿真仍然是相同的。使用simv+ntb_random_seed_automatic
也仍然没有效果。
看来我没有说清楚,你使用ntb_random_seed_automatic这个只是产生了随机的种子而已,但随机序列发生器需要用不同的种子进行初始化才会得到不同的随机数。
可以使用$srandom(seed)来,也可以直接使用$random(seed).系统函数必须带种子的参数,否则使用缺省种子,即种子不会改变。
你说的是对的。
$random必须通过$random(seed)的方式指定seed,seed不同则得到的随机数不同。
$urandom可以通过$urandom(seed)的方式指定seed,此时:simv+ntb_random_seed_automatic
不起作用。
$urandom也可以不指定seed,通过simv+ntb_random_seed_automatic得到随机的seed值,此时也可以得到随机数。