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