Systemverilog 隨機約束方法


參考博文: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建立決策樹
例:


免責聲明!

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



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