關於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的操作。