碎碎念--淺談randomize()與pre_randomize()和post_randomize()


關於randomize()這個函數,發現我之前對它的理解有誤。對pre_randomize()和post_randomize()的理解更是糟糕,下面我們就來整理一下他們之間的關系。

在綠皮書的6.3.2中,對randomize()函數的描述如下:randomize()函數為類里面所有的rand和randc類型的隨機變量賦一個隨機值,並保證不違背所有有效約束。

在綠皮書的6.9中,對pre_randomize()和post_randomize()的描述如下:有時需要在調用randomize()之前或者之后立即執行一些操作,SystemVerilog可以使用兩個特殊的void類型的pre_randomize()和post_randomize()函數來完成這項功能。
也就是說在pre_randomize與post_randomize是在randomize的前后,並不參與solver的求解,而是在solver求解完以后對其進行隨機數的調整。
實際上,randomize()函數是自己去調用這兩個函數!!!!

案例分析:

  • randomize()會自己調用pre_randomize()和post_randomize()這兩個函數。
  • 如果沒有定義pre_randomize()和post_randomize()這兩個函數,那么就可以認為這兩個函數是什么也不做的。
  • 可以根據自身需要重寫pre_randomize()和post_randomize()這兩個函數。
  • 這兒可能會想到,對這些在pre_randomize()中設置的變量,也可以在別的地方設置,比如在自己另寫的function_x中對該變量進行設置。但是這樣每次進行randomize()之前都要手動調用一次function_x,這樣是很不方便的,而且也不容易遺忘或出錯。

補充

  • slover...before 不能用randc的類型
  • randomize(src) 里面有src和drc兩個變量的結果。()里面是誰,就僅僅對誰進行進行隨機,剩下的盡采用默認值(但是也會進行約束求解),也就是randmize(src) + drc==default ->滿足所有的約束。

  • 隨機只能產生0/1,所以可以在post_randomize()里面設置對隨后后的值設置x態等。
  • pre/post_randmize()其實並沒有做任何隨機的操作,只不過是在隨機的前后做一些function的操作而已,對隨機的結果進行調整。可以改變隨機的值。

上述例子進一步說明了,pre/post_randomize()並沒有參數隨機,就是在隨機前和隨機后,做了一些function的操作。


免責聲明!

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



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