本節內容:為什么使用隨機化,隨機化選項,隨機化的object等等
一:隨機化的目的
1:隨機測試與直接測試
激勵產生是驗證中很重要的一個組成部分,激勵產生有下面幾種可選方法。
1)直接測試
2)直接隨機測試
3)隨機測試
每種激勵產生策略所覆蓋的測試空間的范圍是不一樣的。如下圖所示:
直接測試比較適合簡單的設計,因為其測試空間小,可以通過一定數目的測試即可覆蓋到。直接測試也可以用來測試復雜設計中的簡單功能點,特別是某些可能潛在缺陷的邊界條件;可以單獨采用直接測試或者其他測試混合在一起。例如:復雜設計中的奇偶錯誤檢測功能可以通過用直接測試檢驗,可以獨立測試或者混合在頂層的隨機測試中。
隨機測試可以應用在任何類型的設計中, 特別是在設計具有比較大的測試空間或者數量較多的交互情景。 通過采用隨機測試可以擊中一些期望的功能點是很重要的一個功能, 因為驗證工程師未必都可以羅列出所有的功能點。 隨機測試可以創建一些異常並發或者異步的事件, 從而測試設計中的某些獨特、 復雜的行為 。
二:隨機化
1:生成機制
1)采用sv內置的系統函數來產生隨機數
2)randcase和randsequence結構來實現隨機的分支選擇
3)基於對象的隨機生成,隨機地初始化對象地數據成員的值
4)標准隨機函數std:randomize()可以隨時對任意變量進行隨機化並添加約束
2:隨機關鍵字
1)rand
rand bit[7:0] y; //隨機產生一個8bit無符號數據,0-255
2)randc:循環隨機給出
randc bit[1:0] y; //隨機產生一個2bit的無符號數據,0-3循環
3:randomize()
檢查隨機是否成功函數,rand成功,返回1,不成功,返回0;
4:關閉隨機:rand_mode
rand_mode(0) :關閉隨機
rand_mode(1): 打開隨機
三:對隨機數據進行約束(constraint)
1:簡單constraint塊如下所示:約束的變量必須是randm的,沒有順序性
2:隨機表達式
可以使用<,<=,==,>=,>符號,一句表達式里只能有一個操作符
3:inside操作符
范圍操作符,如下:
4:條件約束(->)
5:迭代約束
約束塊里可以使用foreach循環
6:函數約束
約束里可添加函數;函數不能包含輸出,ref;函數必須是automatic;
7:關閉約束: constraint_mode()
constraint_mode(0):關閉約束
constraint_mode(1):打開約束
四:隨機的概率與分配權重
1:權重
默認權重相同,可以使用 := 或者:/來分配權重;
:=與:/之間的區別,如下圖
2:概率
無約束時,隨機值出現的概率是相同的;加上約束時,隨機值出現的概率不同;條件約束時,條件與結果的不同,概率也是不同的(條件與結果既然有約束關系,則不獨立);