史雷萌,左石凱,黃新棟,呂 鑫,周 犇,葉圣哲
(廈門理工學(xué)院光電與通信工程學(xué)院,福建 廈門 361024)
早期的集成電路(integrated circuit,IC)芯片開發(fā)工作復(fù)雜度較低,采用Verilog語言編寫測試激勵的方式能夠滿足大部分驗(yàn)證需求。隨著IC 芯片電路規(guī)模的增大,為了確保待驗(yàn)證模塊功能的正確性,需要使用更多激勵進(jìn)行測試,導(dǎo)致構(gòu)建Verilog 驗(yàn)證平臺耗時增加。同時,覆蓋率要求確保待測模塊所有可能情況都被測試,但使用Verilog 驗(yàn)證平臺收集會花費(fèi)大量的時間和精力,故驗(yàn)證覆蓋率的收集較為困難[1]。為了解決上述問題,學(xué)者們提出不同的解決方法:楊金鑫[2]使用Verilog語言驗(yàn)證系統(tǒng)級芯片內(nèi)的控制器模塊時,利用腳本文件語句定向約束參考模型的方式驗(yàn)證被測設(shè)備,該方法雖然能夠增加驗(yàn)證激勵,但并未對覆蓋率指標(biāo)進(jìn)行收集,導(dǎo)致驗(yàn)證項(xiàng)的遺漏。王凱等[3]通過Systemverilog 語言驗(yàn)證圖像采集芯片的功能,并劃分驗(yàn)證環(huán)境結(jié)構(gòu),同時遵循面向?qū)ο蟮乃枷氪罱?yàn)證平臺,雖然驗(yàn)證平臺的搭建速度增快,但平臺結(jié)構(gòu)繁瑣且重用性不高,無法提高驗(yàn)證的效率。為此,本文提出一種基于通用驗(yàn)證方法學(xué)(universal verification methodology,UVM)的報文驗(yàn)收濾波模塊驗(yàn)證方法,使用Python 腳本語言自動化搭建UVM 驗(yàn)證平臺以加快平臺搭建的速度,并采用可約束的隨機(jī)化測試技術(shù),利用隨機(jī)時間種子產(chǎn)生不同的測試激勵,提高測試的覆蓋率。
報文驗(yàn)收濾波(acceptance filter,AF)模塊是控制器局域網(wǎng)(controller area network,CAN)總線上處理報文數(shù)據(jù)的模塊,由CAN 規(guī)范ISO11898-1[4]可知,當(dāng)接收報文的識別位和預(yù)設(shè)定位值相同時,模塊即接收此幀信息[5]。AF模塊根據(jù)CAN規(guī)范分為基礎(chǔ)(basic)模式和擴(kuò)展(peli)模式[6],且在peli 模式中,根據(jù)濾波器的個數(shù)分為單濾波模式(single mode)和雙濾波模式(dual mode)。
本文需驗(yàn)證的報文驗(yàn)收濾波模塊由4個驗(yàn)收代碼寄存器(acceptance code register,ACR)與4 個驗(yàn)收掩碼寄存器(acceptance mask register,AMR)組成,且支持基礎(chǔ)和擴(kuò)展2 種工作模式。模塊接收到總線上的報文后,通過Mode信號進(jìn)入對應(yīng)工作模式,ACF_Mode 信號選擇不同濾波模式濾波驗(yàn)收報文。報文濾波驗(yàn)收模塊運(yùn)行流程圖如圖1所示。運(yùn)行過程中,首先,平臺通過Mode 信號高低電平判斷模塊進(jìn)入何種模式,若Mode 信號為0,進(jìn)入basic模式驗(yàn)收標(biāo)準(zhǔn)幀報文;若Mode信號為1,則進(jìn)入Peli 模式。其次,判斷ACF_Mode 信號的高低電平狀態(tài)。若ACF_Mode 信號為0,進(jìn)入dual 模式;若ACF_Mode 信號為1,進(jìn)入single 模式。最后,判斷報文的種類。對標(biāo)準(zhǔn)幀和擴(kuò)展幀報文采取不同的模式進(jìn)行濾波驗(yàn)收,并輸出ACF_Pass_o 信號的高低電平狀態(tài)作為濾波驗(yàn)收模塊的結(jié)果。模塊驗(yàn)收濾波結(jié)果波形示意圖如圖2 所示。圖2 中:紅色線段為高電平,表示通過驗(yàn)收;黃色線段為低電平,表示不通過驗(yàn)收。
圖1 報文濾波驗(yàn)收模塊運(yùn)行流程圖Fig.1 Workflow of message filtering acceptance module
圖2 模塊驗(yàn)收濾波結(jié)果波形示意圖Fig.2 Waveform of module acceptance filtering results
UVM 驗(yàn)證方法學(xué)引入類作為基礎(chǔ)單元,集成標(biāo)準(zhǔn)化模塊語句規(guī)范仿真流程。利用腳本語言幫助驗(yàn)證人員快速構(gòu)建驗(yàn)證平臺,縮短待測設(shè)備(DUT)移植時間[7-9]。
本文利用Python 腳本語言的mako 庫模板語句,自動化搭建UVM 驗(yàn)證平臺[10-12]。將UVM 驗(yàn)證平臺需要高重用度的部分提取出來,使用${agent_name}關(guān)鍵字動態(tài)替換。當(dāng)腳本運(yùn)行時,關(guān)鍵字通過render函數(shù)進(jìn)行替換。腳本運(yùn)行完畢后,在目錄文件夾下生成驗(yàn)證平臺代碼。
UVM 驗(yàn)證平臺的結(jié)構(gòu)示意圖如圖3 所示。頂層(Top)組件包括需要驗(yàn)證的DUT 和基礎(chǔ)測試(BaseTest)組件?;A(chǔ)測試組件內(nèi)包括環(huán)境(Env)組件、代理(Agent)組件和計分板組件。代理組件是驗(yàn)證的主要模塊,其中包含封裝監(jiān)視器(monitor)、激勵器(sequencer)和驅(qū)動器(driver)組件。為了加強(qiáng)組件之間的耦合性,通過接口(interface)組件連接DUT 和驅(qū)動器組件,并使用phase 機(jī)制管理任務(wù)執(zhí)行順序和時間,確保測試環(huán)境的正確運(yùn)行。
圖3 UVM驗(yàn)證平臺結(jié)構(gòu)示意圖Fig.3 UVM validation platform
驗(yàn)證DUT 的激勵由事務(wù)組件產(chǎn)生,在激勵器和驅(qū)動器之間通過seq_item_export 和seq_item_port 端口交換數(shù)據(jù)。當(dāng)激勵產(chǎn)生事務(wù)之后由激勵器同意傳遞給驅(qū)動器進(jìn)行驅(qū)動。
本文創(chuàng)建監(jiān)視器After 和監(jiān)視器Before 組件收集驅(qū)動器得到的激勵數(shù)據(jù),提高代理組件的利用率,增強(qiáng)驗(yàn)證平臺代碼耦合的能力。監(jiān)視器After 組件收集驅(qū)動器的輸入數(shù)據(jù),將收集的輸入數(shù)據(jù)施加到參考模型組件中,得到參考模型運(yùn)算的結(jié)果。其結(jié)果使用事務(wù)級建模通信機(jī)制經(jīng)過mon_ap 端口傳遞給計分板。監(jiān)視器Before組件則收集驅(qū)動器的輸出數(shù)據(jù),通過mon_ap端口直接傳遞給計分板。
計分板對比上文2個端口傳遞的數(shù)據(jù),由于監(jiān)視器Before需通過DUT產(chǎn)生數(shù)據(jù)結(jié)果,在計分板接收數(shù)據(jù)時會落后一個時鐘周期,因此代碼中存在2 個循環(huán)來收集監(jiān)視器After 和監(jiān)視器Before 的數(shù)據(jù)。通過UVM的域自動化(field_automation)機(jī)制,計分板對數(shù)據(jù)進(jìn)行比較,數(shù)據(jù)相同則是成功,不相同則是失敗。
模塊功能的正確與否是決定驗(yàn)證工作成功的關(guān)鍵,因此需要了解模塊工作原理,依照工作原理規(guī)劃驗(yàn)證激勵。本文遵循第1節(jié)所述原理,針對濾波驗(yàn)收模塊工作模式、濾波模式及幀種類的差異編寫驗(yàn)證激勵條目,如表1所示。
表1 驗(yàn)證激勵條目Table 1 Incentives to validate
使用VCS 編譯工具仿真驗(yàn)證激勵時,通過default_sequence 宏定義啟動不同驗(yàn)證激勵文件。即在編譯命令的關(guān)鍵字UVM_TESTNAME 后輸入表1 中對應(yīng)的激勵功能名。驗(yàn)證激勵運(yùn)行后,由starting_phase 提起進(jìn)程(raise_objection)。根據(jù)事務(wù)組件注入隨機(jī)事件種子,產(chǎn)生隨機(jī)數(shù)據(jù)。多次迭代后,再由starting_phase 結(jié)束進(jìn)程(drop_objection)。通過隨機(jī)事件種子約束數(shù)據(jù),運(yùn)行不同激勵,逐漸提高驗(yàn)證的完備性。
收集驗(yàn)證激勵的覆蓋率是檢測待測模塊功能是否完備的手段。本文根據(jù)2.2規(guī)劃的驗(yàn)證激勵,通過更新隨機(jī)事件種子的值并運(yùn)行仿真,收集驗(yàn)證激勵的覆蓋率。反復(fù)迭代此操作,直到達(dá)到驗(yàn)證目標(biāo)為止。
覆蓋率類型包括代碼覆蓋率和功能覆蓋率。代碼覆蓋率統(tǒng)計待測模塊的代碼執(zhí)行情況,包括行覆蓋率、分支覆蓋率和表達(dá)式覆蓋率。功能覆蓋率統(tǒng)計待測模塊的功能測試情況,通過功能覆蓋組中存在的功能覆蓋點(diǎn)數(shù)量來計算功能覆蓋率。功能覆蓋點(diǎn)包含事務(wù)組件的數(shù)據(jù)屬性,包括幀類型、幀標(biāo)識符等信號。仿真時,在同一時刻采樣信號并收集覆蓋率。
本文在VCS 仿真軟件的編譯命令中執(zhí)行-cm 語句進(jìn)行覆蓋率收集,編譯仿真結(jié)束后,使用dvefull64 -covdir *.vdb &命令通過DVE 圖形工具查看覆蓋率,并生成html 網(wǎng)頁記錄。此外,待測模塊中的MaskData0、MaskData1這2信號持續(xù)為低電平,無須收集覆蓋率,故編寫屏蔽文件取消收集。在每個激勵運(yùn)行結(jié)束后,覆蓋率統(tǒng)計信息會存入指定的文件夾內(nèi),當(dāng)所有激勵驗(yàn)證完畢后,通過merge命令合并覆蓋率結(jié)果。
利用字節(jié)統(tǒng)計命令wc -c *.sv 能夠收集驗(yàn)證平臺的代碼數(shù)據(jù)量,統(tǒng)計基于Verilog 語言的驗(yàn)證平臺和UVM驗(yàn)證平臺的代碼量數(shù)據(jù),并進(jìn)行驗(yàn)證平臺搭建速度分析。
使用不同值的隨機(jī)事件種子進(jìn)行多次重復(fù)仿真,直到覆蓋率數(shù)值趨于穩(wěn)定。圖4 為仿真輸出的log文件示意圖。
圖4 仿真輸出log文件示意圖Fig.4 Simulation output log file
編譯時更改隨機(jī)事件種子值并多次仿真、收集代碼覆蓋率和功能覆蓋率結(jié)果。表2為多次功能覆蓋率收集的結(jié)果,由表2可見,功能覆蓋率達(dá)到100%,覆蓋率收集結(jié)果均符合預(yù)期。
表2 功能覆蓋率收集結(jié)果Table 2 Functional coverage data collected 單位:%
仿真過程中,其中一次仿真的代碼覆蓋率為97.22%,行覆蓋率97.26%,分支覆蓋率98.3%,表達(dá)式覆蓋率94.2%。多次仿真后,逐漸提升至100%。如圖5 所示,代碼覆蓋率收集了待測模塊的覆蓋率程度,表明對濾波驗(yàn)收模塊已完成驗(yàn)證。同時,使用字節(jié)統(tǒng)計命令分別對Verilog驗(yàn)證平臺和UVM 驗(yàn)證平臺進(jìn)行代碼數(shù)據(jù)量統(tǒng)計發(fā)現(xiàn),基于Verilog 語言的驗(yàn)證平臺代碼數(shù)據(jù)量為806 114 B,而使用UVM驗(yàn)證方法搭建的驗(yàn)證平臺代碼數(shù)據(jù)量為46 514 B,后者減少94%的代碼數(shù)據(jù)量,能夠縮短驗(yàn)證平臺構(gòu)建時間。
圖5 代碼覆蓋率統(tǒng)計報告示意圖Fig.5 Statistics of the code coverage
針對Verilog 驗(yàn)證平臺搭建速度慢、驗(yàn)證覆蓋率收集困難的問題,本文提出一種基于UVM 的報文驗(yàn)收濾波模塊驗(yàn)證方法。該方法采用Python 腳本語言自動生成UVM 驗(yàn)證平臺,在驗(yàn)證平臺中使用接口組件整合模塊信號端口,并采用可約束的隨機(jī)化測試技術(shù),利用隨機(jī)時間種子產(chǎn)生不同的測試激勵。同時對驗(yàn)證模塊輸出數(shù)據(jù)進(jìn)行監(jiān)控,收集測試的覆蓋率。仿真結(jié)果表明,相比Verilog 搭建的驗(yàn)證平臺,本文提出的驗(yàn)證平臺能夠減少94%的代碼數(shù)據(jù)量,縮短驗(yàn)證平臺構(gòu)建時間,且收集模塊的覆蓋率為100%。