參考博文:https://blog.csdn.net/qq_31935691/article/details/54985461
隨機化
通過隨機化可以通過利用CPU的時間來換取人工檢查的時間,提高效率,提供足夠的激勵。
采用受約束的隨機測試法(CRT)產生測試集:使用隨機的數據流為DUT產生輸入的測試代碼。改變偽隨機數發生器(PRNG)的種子(seed)。
一般會在測試設計時考慮設計規范的邊界處,甚至測試設計規范之外的行為。
1、 簡單的隨機變量的簡單類
例:
Randc表示周期隨機性,即所有的可能的值都賦值后隨機值才可能重復
Randomize()函數在遇到約束方面的問題時返回0.
2、 權重分布的約束
Dist操作符允許產生權重分布。
:=操作符表示值范圍內的每一個值的權重是相同的。
:/操作符表示權重要均分到值范圍內的每一個值。
例:
3、 集合成員和inside運算符
用inside運算符產生一個值的集合,還可以求反!,用$代表最大值和最小值
例:
4、 條件約束
支持->和if-else,其中->操作等價於case產生的效果
例:
5、 高效的約束辦法
例:
6、 帶關系操作的約束辦法
例:
7、 帶關系操作和約束的類
例:
當x==0時,y==0,但y==0時,對x沒有約束。
8、 使用slove••••before約束引導概率分布
slove••••before約束不會改變解的個數,只會改變各個值的概率分布。
例:
9、 控制多個約束塊
可以使用內建constraint_mode()函數打開或者關閉約束。
可以用handle.constrain.constraint_mode()控制一個約束塊。
用handle.constraint_mode()控制對象的所有約束。
例:
10、內嵌約束(randomize() with)
通過randomize() with來增加額外的約束
例:
11、pre_randomize和post_randomize函數
構建浴缸分布的例子:
12、常用的隨機函數
13、約束技巧和技術
1)使用變量設定上限的約束
2)帶權重變量的dist約束
14、隨機化中常見的錯誤
1)小心使用有符號變量(除非必要,不要在隨機約束里使用有符號類型):錯誤的例子如下
例:
2)使用無符號32位變量隨機化也將產生錯誤。
如:randm bit[31:0] pkt1_len.•••••••••••••••錯誤
15、約束數組或者隊列的大小
Size()函數可以約束動態數組或隊列的元素個數。Inside約束數組大小的上限和下限
例:
16、約束數組和隊列的每一個元素
1)可以用foreach對數組的每一個元素進行約束。
例:
2)產生具有唯一元素值的數組
例:
17、使用randcase和$urandom_range()隨機控制
例:
$urandom_range函數返回一個指定范圍的隨機數,若只用一個參數,則當做(0,最大值)對待。
使用randcase建立決策樹
例: