0 引言
近幾十年來,集成電路事業發展迅速,設計與工藝技術不斷發展,更多和更復雜的功能被集成到一塊芯片上。SoC的集成度和復雜度大大提高,在IC設計中就容易引入錯誤,所以驗證工作將變得艱巨。隨著IC設計規模的增大以及設計周期的壓縮,傳統驗證技術已經不能再滿足日益增長的驗證需求,驗證方法學應運而生,目前,UVM驗證方法學已經成為應用最廣泛的方法學。
本文目的在于為數字基帶處理單元中標簽發送鏈路的編碼模塊搭建一個適當的、完善的驗證平臺,用來驗證RTL代碼的正確與否。運用面向對象思想的UVM驗證方法學和C語言進行平臺的設計與實現,它能有效地縮短驗證周期,提高驗證效率,加大芯片的面試可能性。
1 UVM驗證方法學
目前,主流的驗證方法學有VMM、OVM和UVM。UVM基于System Verilog語言,具有VMM、OVM等諸多驗證方法學的優點,是一套高效、開源的驗證方法學。UVM由Accellera標準組織推出,并得到了三大主流EDA供應商支持。
通用驗證方法學(Universal Verification Methodology,UVM)是一個以SystemVerilog類庫為主體的驗證平臺開發框架,可以利用其可重用組件構建具有標準化層次結構和接口的功能驗證環境。
UVM平臺架構主要是由通用驗證組件(Universal Verification Component,UVC)構成。每個UVC都是功能完備、可配置、封裝好的驗證環境。根據UVC功能的不同,可分為接口UVC(Interface UVC)和模塊UVC(Module UVC)等。
由圖1可知構成UVM環境的常見組件類如下:
(1)uvm_driver類:是從uvm_sequencer中獲取事務(transaction),經過轉化在接口中對DUT進行時序激勵。diver類與sequencer類之間的通信就是為了獲取新的事務對象,這一操作通過pull方式實現:
driver.seq_item_port.connect(sequencer.seq_item_export);
driver.rsp_port.connect(sequencer.rsp_export);
(2)uvm_monitor類:用來監測數據。
(3)uvm_sequencer類:就像一個管道,從中傳送連續的激勵事務,并最終通過TLM端口送至driver一側。
(4)uvm_agent類:用來封裝一個driver、一個monitor和一個sequencer。
(5)reference_model:用于完成和DUT相同的功能。reference model的輸出被scoreboard接收,用于和DUT的輸出相比較。
(6)uvm_scoreboard:用來進行數據比對和報告。
(7)uvm_env:是一個結構化的容器,用來容納各組件。
(8)uvm_test:是驗證環境的唯一入口,只有通過它才能正常運轉uvm的phase機制。
2 DUT介紹
圖2中的DUT實現了FM0和Miller副載波調制編碼。在ISO/IEC18000-6C協議標準中,標簽發送鏈路主要采用是FM0編碼和Miller編碼。編碼方式的選擇由m[1:0]來決定,只有當m值為2′b00時才會選擇FM0編碼,m為2′b01、2′b10、2′b11時選擇Miller編碼。
FM0編碼是通過電平翻轉的方式來實現編碼,數據碼元-0和-1翻轉的次數不同。碼元-0在碼元周期中間會發生一次電平翻轉,而碼元-1只在每個碼元起始處發生電平翻轉。從圖3所示FM0編碼的狀態跳轉圖可以看出FM0編碼的碼元-0和-1的波形,而且在FM0編碼結束后需要在碼元數據的尾端添加結束標志,結束標志會以固定碼流來結束。碼元波形和結束符如圖4所示。
Miller編碼又稱為副載波調制編碼,也是通過電平翻轉的方式來實現編碼。編碼方式和狀態跳轉如圖5所示。
根據Miller編碼規則,按照m[1:0]值不同,每個數據可能被編碼成4位、8位16位碼元。如果m值為01,對應M值為2,每個數據編碼為4位碼元;m值為10,對應M值為4,每個數據編碼為8位碼元;m值為11,對應M值為8,每個數據編碼為16位碼元。Miller編碼序列如圖6所示,每個編碼序列分別對應M值為2、4、8。由圖可知數據編碼時,只有在數據-0和-0邊界電平不發生翻轉跳變以外其他數據邊界處都會發生電平的翻轉跳變。
與FM0編碼類似,Miller除了采用電平翻轉實現編碼外,編碼結束后在數據的尾部同樣需要添加結束標志。FM0采用固定碼流作為結束標志,即保持持續碼元電平。但是Miller編碼的結束標志相對會復雜一些,如圖7所示。
3 驗證架構
本文設計UVM平臺如圖8所示。
v 組件搭建描述:
(1)interface:聲明接口。
(2)transaction(數據包):繼承于uvm_sequence_item,利用隨機化和相關約束約束產生隨機數據,創建兩個transaction對象,transaction_in在DUT輸入端輸入,transaction_out在DUT輸出與參考模型的輸出相比較。
(3)sequence類:繼承于uvm_sequence,加入objection機制來控制驗證平臺的關閉,利用repeat( )來控制執行的次數。
(4)sequencer:繼承于uvm_sequencer,連接driver,實現數據的發送。
(5)driver類:繼承于uvm_driver,與sequencer連接,用來請求數據。
(6)monitor類:繼承于uvm_monitor,創建monitor_before和monitor_after,前者用來收集driver發送的數據,后者用來監測DUT的輸出,分別在monitor_after和monitor_before中設置covergroup用來收集功能覆蓋率。
(7)agent類:繼承于uvm_agent,創建i_agent和o_agent,前者用來封裝driver和monitor_before,后者用來封裝monitor_after,聲明并例化sequencer、driver、monitor,利用端口將它們連接起來。
(8)reference_model:繼承于uvm_component,將外部C_Model通過DPI調入,并將數據存儲,用來與monitor監測到的DUT的輸出做比較。
設計FM0編碼的C_Model。模型輸入包括了m參數、data,輸出編碼后數據及編碼后的數據長度。首先需要將數據讀入模型,根據數據電平編碼。編碼算法主要設置一個變量data_tmp,在編碼開始時設置為1,如果是編碼-0,則輸出碼元~data_tmp和data_tmp,data_tmp值保持不變。如果是編碼-1,則輸出碼元~data_tmp和~data_tmp,data_tmp值取反。通過不斷更新data_tmp值來實現數據的編碼輸出,編碼完成后添加結束標識符。
設計Miller副載波調制編碼的C_Model,模型輸入包括了m參數、data,結合副載波調制類型和數據類型,將編碼后的數據及長度輸出,另外,由于Miller前同步碼最后一位碼元電平為低,因此其初始data_tmp應為0,結合m的值進行編碼,編碼完成后添加結束標識符。
(9)Scoreboard類:繼承于uvm_scoreboard,將monitor_after檢測到的輸出與reference_model得到的輸出做比較。
(10)env類:繼承于uvm_env,聲明并例化agent,reference_model,scoreboard,利用端口將它們連接起來。
(11)Test類:繼承于uvm_test,聲明并例化env,設置default_sequence來啟動sequence。
(12)Top模塊:聲明接口,實現DUT和平臺互連,設置時鐘信號。
4 仿真結果
環境搭建完畢后用QuestaSim進行仿真驗證,根據輸出的波形和驗證信息比較DUT功能的正確與否,并查看輸出的功能覆蓋率來檢測各功能點的實現狀況。
由圖9所示可以發現,UVM計分板中顯示驗證通過,DUT的輸出和模型的輸出是一致的,DUT的設計滿足功能實現。
由圖10可知,m=0時,執行FM0編碼,m=1時,即執行miller編碼,每個數據分別編碼為2和4個碼元,由圖可知:m=0,data=3′b000,得到編碼后的數據為01010100,數據長度為8位,最后2位是結束標識符00,根據FM0編碼原則結果是正確的;而m=1,data=3′111,得到的編碼后數據為1001_0110_1001_0110,數據長度為16位,最后4位0110是結束標識符,根據miller編碼原則結果是正確的。
由圖11可知,m=2和3時,即執行miller編碼,每個數據分別編碼為8和16個碼元,由圖可知:m=2,data=3′b110,得到編碼后的數據為1010_0101_0101_1010_1010_1010_1010_0101,數據長度為32位,最后8位是結束標識符1010_0101,根據miller編碼原則結果是正確的;而m=3,data=3′011,得到的編碼后數據為0101_0101_0101_0101_0101_0101_1010_1010_1010_1010_0101_0101_0101_0101_1010_1010,數據長度為64位,最后16位0101_0101_1010_1010是結束標識符,根據miller編碼原則結果也是正確的。
圖12是一個由覆蓋率驅動并且受約束的隨機分層測試平臺所產生的整個FM0、Miller編碼仿真波形圖,由圖可見,平臺跑了很多個testcase。
圖13描述此DUT的功能覆蓋率,FM0編碼以及Miller編碼的3種模式都覆蓋到了,各功能點的覆蓋率達到了100%。
5 結論
UVM驗證方法學作為目前主流的IC驗證方法學,盡管在前期搭建驗證平臺的的時間較長,但是執行效率很高,可以縮短整個研發的驗證時間。本文介紹了基于DPI-C接口和UVM相結合的驗證環境,實現了C程序與基于UVM環境的接口對接,使用受約束的隨機激勵以及覆蓋率驅動,使驗證平臺中程序開發方便且調試方便,縮短了驗證周期,保證了驗證的完備性,有效地縮短了驗證周期,提高了驗證效率,加大了芯片的面試可能性。
參考文獻
[1] 張強.UVM實戰[M]。北京:機械工業出版社,2014.
[2] 劉斌。芯片驗證漫游指南[M]。北京:電子工業出版社,2018.
[3] 程剛,蔡敏。基于SystemVerilog的SoC功能驗證方法研究[J]。科學技術與工程,2009(22):6814-6818.
[4] 克里斯·斯皮爾.SystemVerilog驗證[M]。張春,譯。北京:科學出版社,2009.
[5] 徐偉俊,楊鑫,陳先勇,等。針對功能覆蓋率的驗證過程[J]。中國集成電路,2007(7):58-62.
[6] 克里斯·斯皮爾.SystemVerilog驗證:測試平臺編寫指南[M]。張春,麥宋平,趙益新,譯。北京:科學出版社,2009.
[7] 李璐,周春良,馮曦,等。基于DPI-C接口的可擴展SOC驗證平臺[J]。電子設計工程,2018,26(4):136-140.
[8] Michael Keating.Reuse methodology manual for system-on-a-chip design[M].Third Edition.Kluwer Academic Publishers,2002.
評論