随笔 - 66  文章 - 0  评论 - 11  阅读 - 97495

谈一谈SystemVerilog的seed

在VCS中有编译选项+ntb_random_seed用来指定初始的seed值,当然你也可以参考vcs user guid,里面有+ntb_random_seed_automatic等有关的seed的一些设置。
现在回过头来查看绿皮书6.16.2和6.16.3的内容,理解就更加深刻了一些,但是绿皮书上的内容讲的有点浅,现在通过几个例子,可以再进一步体会一下。

参考链接:https://iksciting.com/random-stability/
https://bbs.eetop.cn/forum.php?mod=viewthread&tid=920774&page=1&extra=#pid10627196

对于command-line seed的初始化对象是module/interface/program/package。

Verilog在整个仿真过程中使用一个PRNG(伪随机数发生器),但是SystemVerilog中,每个对象和线程都有一个独立的PRNG。

  • 每个线程都有自己的RNG,这个RNG用创建线程的结构元素的下一个随机值初始化为种子。
  • 绿皮书6.16.3中说,把新增的对象和线程放在现有对象和线程之后,可以减少修改代码带来的随机稳定性问题。
  • 线程创建顺序,$random()/randomize(),如果不改变随机数生成的顺序,则可以保持对象的稳定性。

举个例子来看看:

initial 起三个进程
在head上加上个进程
在tail上加上一个进程
小结:如下图,虽然initial是并行起来的进程,但是#0的延迟的相对先后,PNG按照下图产生,所以新加的线程要放在后面对随机的稳定性影响最小。
  • 你会惊喜的发现a和x的值跟上一个例子的值是有相同之处的!!!
改变线程或者class的方法如下:

小结:如果是在一个线程里面,随机化的先后顺序是至关重要的!!!


顺带提一句:在UVM中有uvm_create_random_seed()的函数对随机花做进一步处理来提高随机的稳定性。保证不同的线程对应不同的seed。
posted on   猪肉白菜_125  阅读(2903)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示