systemverilog學習(8)randomization隨機化


本節內容:為什么使用隨機化,隨機化選項,隨機化的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:概率

  無約束時,隨機值出現的概率是相同的;加上約束時,隨機值出現的概率不同;條件約束時,條件與結果的不同,概率也是不同的(條件與結果既然有約束關系,則不獨立);

  


免責聲明!

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



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