潘國騰,歐國東,晁張虎,李夢君
(國防科技大學(xué)計(jì)算機(jī)學(xué)院,長沙410073)
(?通信作者電子郵箱gtpan@nudt.edu.cn)
在摩爾定律驅(qū)動下,單顆芯片的邏輯門數(shù)增長迅速,更多的功能模塊集成到片上,同時引入更多寄存器,通用片上系統(tǒng)(System-on-Chip,SoC)芯片面臨的情況尤為突出[1]。SoC芯片擁有數(shù)量龐大的各類寄存器,寄存器驗(yàn)證已成為SoC芯片研發(fā)過程中的重要驗(yàn)證項(xiàng)。根據(jù)SoC芯片分層驗(yàn)證理念[2-3],模塊級的設(shè)計(jì)規(guī)模小、功能簡單、激勵構(gòu)造相對容易,但模塊數(shù)量較多[4];子系統(tǒng)級的設(shè)計(jì)規(guī)模適中、功能相對獨(dú)立、接口清晰,而驗(yàn)證的完備性卻是最大的挑戰(zhàn)[5];系統(tǒng)級的設(shè)計(jì)規(guī)模龐大,功能復(fù)雜,對仿真資源的需求比較大[6]。無論在模塊級、子系統(tǒng)級或系統(tǒng)級驗(yàn)證中,寄存器都是驗(yàn)證的重心之一。如何更高效、更完備地完成芯片的寄存器驗(yàn)證,成為芯片驗(yàn)證工程師必須解決的問題。
目前,業(yè)界在芯片的寄存器驗(yàn)證中更多采用C語言或者匯編語言開發(fā)測試激勵,芯片寄存器初始化配置過程經(jīng)過取值、譯碼、執(zhí)行,然后逐層傳輸?shù)郊拇嫫魉谀K。單個寄存器的配置過程通常需要幾百個時鐘周期,芯片的初始化過程通常需要配置成千上萬個寄存器,配合軟件模擬緩慢的仿真速度,使得整個寄存器配置過程需要很長時間。裸機(jī)環(huán)境下的寄存器通路測試遇到的問題更加嚴(yán)重。寄存器通路驗(yàn)證通常需要覆蓋整個芯片的所有寄存器,其數(shù)量是初始過程需要配置寄存器數(shù)量的數(shù)倍,急需一種更加高效的驗(yàn)證方法。
通用驗(yàn)證方法學(xué)(Universal Verification Methodology,UVM)的高可重用性、帶約束的隨機(jī)激勵生成、完善的UVM庫以及覆蓋率驅(qū)動驗(yàn)證(Coverage Driven Verification,CDV)理念非常貼合模塊級和子系統(tǒng)級的驗(yàn)證需求[7-9],逐漸成為業(yè)界的主流。UVM里的RAL(Register Abstraction Layer)方案[10]是一套完整的寄存器驗(yàn)證解決方案,在模塊級和子系統(tǒng)級的UVM驗(yàn)證環(huán)境中發(fā)揮著重要作用,但在系統(tǒng)級驗(yàn)證中卻極少被使用,原因是UVM庫代碼繁復(fù),仿真運(yùn)行時消耗內(nèi)存較大,對驗(yàn)證的仿真資源有非常高的要求;同時,UVM的RAL方案要求寄存器模型和RTL代碼均符合電子知識產(chǎn)權(quán)(IP-XACT)標(biāo)準(zhǔn)[11-12],UVM內(nèi)建的寄存器測試用例不對“只讀(Read Only,RO)”“只寫(Write Only,WO)”等屬性的寄存器進(jìn)行Access檢查,導(dǎo)致UVM寄存器模型在系統(tǒng)級驗(yàn)證中難以得到推廣。
針對以上問題,本文提出一種Lite寄存器模型,實(shí)現(xiàn)更小的運(yùn)行時內(nèi)存消耗,可以更廣泛地應(yīng)用于各種驗(yàn)證場景。Lite寄存器模型保留UVM寄存器模型前/后門訪問等功能,采用前/后門訪問結(jié)合的方法進(jìn)行寄存器通路驗(yàn)證,不僅可以提高仿真驗(yàn)證的速度,同時實(shí)現(xiàn)對地址映射的驗(yàn)證。Lite寄存器模型配合內(nèi)建測試用例,實(shí)現(xiàn)對所有訪問屬性(包括“RO”和“WO”屬性)寄存器的Access檢查,使功能驗(yàn)證更加高效完備。該模型可以在UVM或非UVM的模塊級、子系統(tǒng)級或系統(tǒng)級仿真驗(yàn)證環(huán)境中使用,并針對系統(tǒng)級寄存器通路驗(yàn)證進(jìn)行加強(qiáng);同時,開發(fā)寄存器模型自動生成工具,提供Lite寄存器模型內(nèi)建測試用例,形成完整的寄存器模型解決方案。
Lite寄存器模型使用SystemVerilog語言實(shí)現(xiàn),支持對多種讀寫屬性的寄存器進(jìn)行建模,提供各類方法滿足不同的寄存器訪問需求。
Lite寄存器模型分3層:Field層、Register層、Regmodel層;外加用于寄存器前門訪問的Adaptor,構(gòu)成寄存器模型的主體。
1)Field層:負(fù)責(zé)描述寄存器內(nèi)各域段的基本屬性(期望值、映射值、復(fù)位值、讀寫屬性、位寬等),是寄存器模型的最小單元。
2)Register層:負(fù)責(zé)處理寄存器各Fields遍歷/拼接、寄存器讀寫操作(前門/后門),記錄寄存器的后門訪問路徑、地址等信息,是寄存器模型的基本單元。
3)Regmodel層:寄存器模型的頂層,配置模型包含的各寄存器基地址、頂層后門訪問路徑等屬性,設(shè)置寄存器模型的Adaptor,建立集成管理方法,為內(nèi)建測試激勵提供接口。
4)Adaptor:處理寄存器模型與待測設(shè)計(jì)(Design Under Test,DUT)之間的接口協(xié)議適配,使用SystemVerilog的Callback機(jī)制實(shí)現(xiàn)靈活重構(gòu)。
該寄存器模型的主要功能如下:
1)支持寄存器前門訪問和后門訪問:后門訪問通過SystemVerilog提供的直接編程接口(Direct Programming Interface,DPI)[13]接 口 實(shí) 現(xiàn) ;前 門 訪 問 使 用 接 口 適 配 器Adaptor完成事務(wù)級與信號級的相互轉(zhuǎn)換,實(shí)現(xiàn)寄存器模型與設(shè)計(jì)接口的解耦,接口協(xié)議變化后只需重新實(shí)現(xiàn)Adaptor,已實(shí)現(xiàn)的寄存器模型無需改動,增強(qiáng)寄存模型的可重用性。
2)每個寄存器模型包含3個值:復(fù)位值、期望值、映射值。復(fù)位過程中,有復(fù)位值的寄存器,其模型內(nèi)的期望值被初始化為復(fù)位值;期望值是寄存器模型對設(shè)計(jì)中寄存器值的預(yù)期值;映射值是寄存器模型發(fā)起同步操作時,從設(shè)計(jì)中得到的寄存器的真實(shí)值。期望值在前、后門寫訪問成功后更新,映射值在前、后門讀訪問成功后更新。讀訪問成功后會觸發(fā)模型內(nèi)部期望值和映射值的比對,檢查寄存器值的變化是否正確。
3)支持READ操作、WRITE操作、讀等待(Wait READ,WREAD)操作和強(qiáng)制寫(Force WRITE,F(xiàn)WRITE)操作四種寄存器訪問操作:READ和WRITE操作分別有前門訪問和后門訪問兩種模式;WREAD操作能夠檢查“WO”類屬性寄存器的前門寫操作是否正確;FWRITE操作能夠檢查“RO”類屬性寄存器的前門讀訪問是否正確。WREAD操作和FWRITE操作僅支持后門訪問。
4)支持對25種讀寫屬性的寄存器建模:只讀、讀寫、讀清零、讀置位、可寫讀復(fù)位、可寫讀清零、寫清零、寫置位、寫置位讀清零、寫清零讀置位、寫1清零、寫1置位、寫1反轉(zhuǎn)、寫0清零、寫0置位、寫0反轉(zhuǎn)、寫1置位讀清零、寫1清零讀置位、寫0置位讀清零、寫0清零讀置位、只寫、只寫清零、只寫置位、一次寫、一次只寫。
5)該模型不依賴UVM庫(DPI函數(shù)庫除外),但可應(yīng)用于UVM環(huán)境和非UVM環(huán)境中。
6)內(nèi)建寄存器通路驗(yàn)證測試用例,包括寄存器復(fù)位值檢查、寄存器讀寫功能檢查和寄存器后門訪問路徑檢查。
圖1 Lite寄存器模型的總體結(jié)構(gòu)Fig.1 Overall structure of Lite register model
UVM寄存器模型底層庫歷經(jīng)OVM(Open Verification Methodology)、VMM(Verification Methodology Manual)、UVM 的不斷演進(jìn),歷史包袱沉重,源碼結(jié)構(gòu)復(fù)雜,多有冗余。業(yè)界各主要電子設(shè)計(jì)自動化(Electronics Design Automation,EDA)工具編譯出的Database格式各異,為便于調(diào)試均往UVM源碼庫中添加大量代碼,使得UVM源碼庫更加繁雜。Lite寄存器模型重新設(shè)計(jì)底層源碼庫,結(jié)構(gòu)清晰簡約,有效減少對內(nèi)存的損耗。
Lite寄存器模型庫由4部分內(nèi)容組成:
1)宏定義模塊。集中配置模型內(nèi)部的數(shù)據(jù)結(jié)構(gòu),針對具體目標(biāo)調(diào)整,可有效減小運(yùn)行時內(nèi)存消耗。
2)接口協(xié)議適配器。處理模型與DUT之間事務(wù)級與信號級的相互轉(zhuǎn)換,同時兼具接口協(xié)議BFM功能;
3)寄存器模型基類。描述寄存器的各類屬性,建立相關(guān)的函數(shù)和方法。
4)內(nèi)建測試激勵。用于寄存器通路驗(yàn)證。
Lite寄存器模型庫單元完整Package包含如下文件:
packagelite_regmodel;
'include"lite_reg_macros.svh"
'include"dpi/uvm_hdl.svh"
'include"dpi/uvm_svcmd_dpi.svh"
'include"dpi/uvm_regex.svh"
'include"lite_adaptor.sv"
'include"lite_field.sv"
'include"lite_reg.sv"
'include"lite_regmodel.sv"
'include"lite_reset_check_tc.sv"
'include"lite_hdl_path_check_tc.sv"
'include"lite_access_check_tc.sv"
endpackage
庫單元中主要類模塊的層次結(jié)構(gòu)如圖2所示,其中Lite_adaptor為virtual類,Lite_regmodel和Lite_reg中均有其句柄,用戶創(chuàng)建Lite_adaptor的子類后注冊到Lite_reg中(SystemVerilog的callback機(jī)制),實(shí)現(xiàn)每個Lite_reg與adaptor的連接,打開寄存器的前門訪問通道。
圖2 寄存器模型庫單元類模塊層次結(jié)構(gòu)Fig.2 Hierarchical structure of register model library cell class module
Lite_regmodel類中new函數(shù)和build函數(shù)為virtual函數(shù),由用戶在子類中實(shí)現(xiàn)具體內(nèi)容。add_reg函數(shù)將模型中所有的Lite_reg句柄存入寄存器池內(nèi),以便進(jìn)行遍歷操作。
Lite_reg類中new函數(shù)和configure函數(shù)為virtual函數(shù),其余函數(shù)封裝在類內(nèi)。hdl_check函數(shù)、access_check函數(shù)和reset_check函數(shù)負(fù)責(zé)寄存器通路檢查,fwrite函數(shù)、wread函數(shù)、read函數(shù)和write函數(shù)處理前/后門讀寫訪問,add_field函數(shù)將所有的field存入fields池內(nèi)。
圖3 Lite_reg類構(gòu)成Fig.3 Composition of Lite_reg
Lite_adaptor類是virtual類,bus2reg任務(wù)和reg2bus任務(wù)根據(jù)具體接口協(xié)議在其子類中實(shí)現(xiàn),wread任務(wù)解決了“RO”類寄存器的通路檢查問題。
圖4 Lite_adaptor類構(gòu)成Fig.4 Composition of Lite_adaptor
Lite_field類中new函數(shù)和configure函數(shù)為virtual函數(shù),其余函數(shù)封裝在類內(nèi)。被封裝的函數(shù)分別負(fù)責(zé)寄存器field的mirror值和desire值的維護(hù)、為通路驗(yàn)證提供底層支持、前/后門讀寫訪問等。force_wr函數(shù)和release_wr函數(shù)解決了“WO”類寄存器的通路檢查問題。
Lite寄存器模型內(nèi)建寄存器后門訪問路徑檢查、寄存器復(fù)位值檢查和寄存器讀寫功能檢查3個測試用例。內(nèi)建測試用例使用foreach遍歷Lite_regmodel中的寄存器池進(jìn)行寄存器復(fù)位值檢查和后門訪問路徑檢查,根據(jù)讀寫屬性采用不同的方式進(jìn)行寄存器讀寫功能檢查。
圖5 Lite_field類構(gòu)成Fig.5 Composition of Lite_field
寄存器讀寫功能檢查測試用例對每個寄存器進(jìn)行兩種模式的檢查:前門寫+后門讀檢查、后門寫+前門讀檢查。前門寫+后門讀檢查將寄存器模型中的映射值按位取反后從前門寫入DUT,同時更新寄存器模型中的期望值。隨后通過后門讀配合模型中的期望值,檢查前門寫訪問是否正確。后門寫+前門讀檢查采用相反的操作,檢查前門讀訪問是否正確。
UVM源碼庫內(nèi)建的寄存器讀寫功能檢查測試用例不對寄存器模型中具有“RO”屬性和“WO”屬性的寄存器進(jìn)行讀寫功能檢查:“RO”屬性寄存器值的變化僅由設(shè)計(jì)內(nèi)部邏輯決定,驗(yàn)證環(huán)境對其不可預(yù)期;“WO”屬性寄存器在進(jìn)行前門寫后,寫入的值可能在很短的時間被設(shè)計(jì)內(nèi)部邏輯清除,后門讀操作的時機(jī)無法控制,但是在子系統(tǒng)級、系統(tǒng)級對這兩類寄存器進(jìn)行讀寫通路驗(yàn)證同樣很有必要。
為解決這兩個難題,Lite寄存器模型內(nèi)建讀寫功能測試用例,處理“RO”屬性寄存器時,調(diào)用Lite寄存器模型的fwrite函數(shù),采用force操作完成后門寫,前門讀訪問完成后再release;處理“WO”屬性寄存器時,調(diào)用Lite寄存器模型的wread方法,在前門寫訪問完成后逐拍進(jìn)行后門讀訪問,直到讀出期望的值。在寄存器模型中設(shè)置寄存器訪問最大延遲周期,當(dāng)后門訪問持續(xù)拍數(shù)大于該最大周期數(shù)后報(bào)訪問超時錯。
芯片中的寄存器數(shù)量龐大,通過手工編碼實(shí)現(xiàn)對所有寄存器的建模耗時長且容易出錯。Lite寄存器模型自動生成工具,可以極大地減少編碼的工作量且避免人為錯誤的引入。
寄存器描述文檔作為《詳細(xì)設(shè)計(jì)文檔》的重要組成部分,在整個芯片研發(fā)周期中幾乎貫穿始終。
圖6給出工程實(shí)踐中寄存器描述文檔的規(guī)范格式,表頭包括項(xiàng)目名稱、寄存器所在模塊名、寄存器通路位寬、寄存器最大訪問周期數(shù)和文檔版信息。正文描述每個寄存器的詳細(xì)屬性。
表頭中的“protocal”決定 adaptor的實(shí)現(xiàn),“hdl_path”與寄存器中每個field的hdl_path拼接構(gòu)成寄存器的后門訪問路徑。每個寄存器中各field可能擁有不同的讀寫屬性,前門訪問使用寄存器地址,將同一個寄存器內(nèi)各fields作為整體進(jìn)行讀寫,后門訪問以field為單位調(diào)用DPI接口實(shí)現(xiàn)。
本文使用Python語言[14]編寫寄存器模型生成腳本,從寄存器描述文檔中提取信息,對寄存器進(jìn)行分層建模。腳本采用模塊化開發(fā)方式,主要包括以下模塊:Excel信息掃描模塊、Fields生成模塊、Register生成模塊、Regmodel生成模塊。模塊化開發(fā)增加腳本的可擴(kuò)展性和可重用性,例如寄存器文檔格式變化后只需要修改Excel信息掃描模塊,其他模塊可完全重用。
圖6 寄存器描述文檔規(guī)范Fig.6 Register description document specification
不同寄存器建立的模型之間存在大量的“共性”,比如都包含new函數(shù)、configure函數(shù)、read/write task等;同時不同寄存器之間也存在著明顯的“差異”,如圖6中描述的地址、讀寫屬性、復(fù)位值、寄存器名等。因此,腳本使用gen_reg函數(shù)生成寄存器模型的“共性”部分,同時提取圖6中的“差異”信息生成“個性”部分,建立完整的寄存器模型。
最后,腳本根據(jù)寄存器文檔表頭信息生成寄存器模型的頂層文件,將已完成建模的所有寄存器逐一在頂層文件中例化。
首先選取工程實(shí)踐中具有代表意義的寄存器,使用硬件描 述 語 言 Verilog[15]做 寄 存 器 傳 輸 級(Register Transaction Level,RTL)編碼,作為實(shí)驗(yàn)的DUT。然后運(yùn)行寄存器模型生成工具對DUT中實(shí)現(xiàn)的寄存器進(jìn)行Lite寄存器模型建模。最后采用業(yè)界主流模擬仿真工具進(jìn)行仿真,評估寄存器模型的功能和性能。
執(zhí)行寄存器模型生成腳本,生成test_regmodel.sv文件,test_regmodel.sv中單個寄存器模型:
classclr extends lite_reg;
rand lite_field clr;
function void build();
clr=new("clr");
clr.configure(32,0,"WO",0,'h33333333,1,0,0);
add_field(clr);
endfunction
endclass
寄存器模型頂層模塊:
classtest_regmodel extendslite_regmodel;
function new(string name="test_regmodel",virtual interface
apb_if avif);
adaptor=new("adaptor",20);
this.avif=avif;
endfunction
rand clr clr;
…
function void build();
adaptor.avif=avif;ctl=new("ctl");
ctl.build();
ctl.configure("top_tb.dut.rg_ctl",'h00);
ctl.adaptor.push_back(adaptor);add_reg(ctl);
…
endfunction
…
endclass
Lite寄存器模型設(shè)計(jì)實(shí)現(xiàn)底層庫單元,支持前門訪問和后門訪問,寫訪問時更新寄存器模型的值,讀訪問時進(jìn)行返回值的正確性檢查。該模型兼容UVM模擬仿真環(huán)境和非UVM模擬仿真環(huán)境。
為驗(yàn)證Lite寄存器模型讀寫訪問功能是否正確,分別在非UVM模擬環(huán)境頂層top_tb的Initial塊和UVM模擬環(huán)境的sequence中添加基于Lite寄存器模型的內(nèi)建測試激勵和自建測試激勵,模擬實(shí)際工程項(xiàng)目驗(yàn)證項(xiàng)對DUT進(jìn)行寄存器驗(yàn)證。實(shí)驗(yàn)中分別使用Lite寄存器模型的前門/后門訪問方式結(jié)合READ、WRITE、FWRITE和WREAD操作方法,對DUT中寄存器進(jìn)行訪問。內(nèi)建測試激勵包括寄存器后門路徑檢查、寄存器復(fù)位值檢查和寄存器讀寫功能檢查,內(nèi)建測試用例;自建測試激勵覆蓋Lite寄存器模型的所有寄存器訪問方式。仿真結(jié)果如圖7、8所示。
圖7 仿真運(yùn)行波形Fig.7 Waveformof simulation
圖8 仿真運(yùn)行終端打印結(jié)果Fig.8 Output result of simulation terminal
//create regmodel
regmodel=new("regmodel",apb_if);
regmodel.build();
//createreset valuecheck testcase
reset_check=new("reset_check");
reset_check.rgm=regmodel;
reset_check.start_test();
//create hdl path check testcase
hdl_check=new("hdl_check");
hdl_check.rgm=regmodel;
hdl_check.start_test();
//createaccesscheck testcase
access_check=new("access_check");
access_check.rgm=regmodel;
access_check.start_test();
為驗(yàn)證Lite寄存器模型對錯誤的檢測功能是否正常,在自建測試激勵中通過force操作注入錯誤。仿真過程中該模型準(zhǔn)確檢查出注入的錯誤并打印錯誤報(bào)告。
自建測試用例:
//add testcase
regmodel.ctl.read(FRONTDOOR,value);
regmodel.status.read(FRONTDOOR,value);
regmodel.clr.read(FRONTDOOR,value);
regmodel.ctl.write(FRONTDOOR,'h7ffffff5);
regmodel.status.write(FRONTDOOR,'hffff0000);
regmodel.clr.write(FRONTDOOR,'hcccccccc);
regmodel.clr.wread('hcccccccc);
//inject error force dut.rg_ctl.lock=1'b1;
regmodel.ctl.read(BACKDOOR,value);
regmodel.status.read(BACKDOOR,value);
regmodel.clr.read(BACKDOOR,value);
releasedut.rg_ctl.lock;
@(posedgeclk);
regmodel.ctl.write(BACKDOOR,'h7ffffff5);
regmodel.status.write(BACKDOOR,'hffff0000);
regmodel.clr.write(FRONTDOOR,'h33333333);
regmodel.status.fwrite('h55555555);
regmodel.ctl.read(FRONTDOOR,value);
regmodel.status.read(FRONTDOOR,value);
regmodel.clr.read(FRONTDOOR,value);
仿真結(jié)果證明,Lite寄存器模型通過前門/后門對寄存器發(fā)起READ、WRITE、FWRITE和WREAD操作,能夠進(jìn)行數(shù)據(jù)正確性比對,實(shí)現(xiàn)預(yù)期功能;Lite寄存器模型的內(nèi)建測試用例能夠?qū)Πā癛O”屬性和“WO”屬性等特殊寄存器在內(nèi)的所有寄存器進(jìn)行寄存器通路驗(yàn)證,解決了UVM寄存器模型在此方面的問題。
為分析Lite寄存器模型仿真時對內(nèi)存的消耗,實(shí)驗(yàn)中分別使用Lite寄存器模型和UVM寄存器模型對同一個DUT做寄存器建模,如圖9所示。在仿真過程中加入-memxprof選項(xiàng)(仿真工具中收集仿真性能的選項(xiàng))收集內(nèi)存消耗,得到結(jié)果如圖9所示。
圖9 模型內(nèi)存消耗分析報(bào)告Fig.9 Analysisreport of model memory consumption
通過分析報(bào)告可知,得益于精簡的底層庫實(shí)現(xiàn)及配置化處理,Lite寄存器模型的運(yùn)行時內(nèi)存消耗是UVM寄存器模型運(yùn)行時內(nèi)存消耗的21.65%,極大地減小了仿真所需的內(nèi)存資源消耗,在實(shí)際工程應(yīng)用,尤其在系統(tǒng)級寄存器通路驗(yàn)證中意義較大。
本文針對實(shí)際工程應(yīng)用中UVM寄存器模型的不足,設(shè)計(jì)實(shí)現(xiàn)Lite寄存器模型,并配套開發(fā)內(nèi)建測試激勵和Lite寄存器模型自動生成工具。實(shí)驗(yàn)結(jié)果表明,Lite寄存器模型能夠替代UVM寄存器模型完成寄存器驗(yàn)證,且對運(yùn)行時內(nèi)存的消耗更??;同時,可兼容UVM和非UVM的模擬驗(yàn)證環(huán)境,配合自動生成工具和內(nèi)建測試用例形成完整的集成電路寄存器驗(yàn)證方案,在實(shí)際工程項(xiàng)目中發(fā)揮重要作用。