談一談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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM