在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。