汪永峰,卜 剛
(南京航空航天大學(xué) 電子信息工程學(xué)院,江蘇 南京 211106)
當(dāng)下芯片驗(yàn)證技術(shù)已經(jīng)逐漸跟不上芯片設(shè)計(jì)的步伐,在完整的芯片研發(fā)過程中,芯片驗(yàn)證往往要占據(jù)整個(gè)芯片研發(fā)周期的70%以上[1]??梢姡诓唤档万?yàn)證要求的情況下,縮短驗(yàn)證時(shí)間可以有效地縮短芯片研發(fā)周期,加快芯片上市時(shí)間。
該文旨在以超高頻(ultra high frequency,UHF)射頻識(shí)別(radio frequency identification,RFID)數(shù)字基帶處理單元中讀寫器發(fā)送鏈路為例,設(shè)計(jì)一款可復(fù)用的驗(yàn)證平臺(tái)。由于SystemC語(yǔ)言可以用來(lái)搭建事務(wù)級(jí)、高抽象級(jí)的虛擬原型,并且其與SystemVerilog語(yǔ)言均支持事務(wù)級(jí)建模(transaction level models,TLM)通信機(jī)制,這為SystemC和UVM之間的通信提供了可能[2]。這里選用SystemC建模作為參考模型接入U(xiǎn)VM驗(yàn)證平臺(tái),將參考模型的輸出和寄存器傳輸級(jí)(register transformation level,RTL)設(shè)計(jì)的輸出進(jìn)行比對(duì)。SystemC語(yǔ)言更注重算法級(jí)的設(shè)計(jì),與更偏向于物理級(jí)的RTL相比擁有更快的仿真速度。并且將具有可重用、激勵(lì)隨機(jī)化等優(yōu)點(diǎn)的UVM與SystemC語(yǔ)言結(jié)合起來(lái),不僅提高了驗(yàn)證的全面性,還縮短了驗(yàn)證所需要花費(fèi)的時(shí)間。
通用驗(yàn)證方法學(xué)(university verification methodology,UVM)是一個(gè)以SystemVerilog類庫(kù)為主體的驗(yàn)證平臺(tái)開發(fā)框架,為驗(yàn)證人員提供了一系列通用驗(yàn)證組件(university verification component,UVC),例如uvm_driver、uvm_monitor、uvm_agent等[3]??偟膩?lái)說,UVM之所以能夠得到廣大驗(yàn)證人員的青睞,是由于UVM驗(yàn)證方法學(xué)相比于其他的驗(yàn)證方法包含以下幾點(diǎn)優(yōu)勢(shì):
(1)UVM擁有自己的基類庫(kù),驗(yàn)證工程師可以利用繼承功能復(fù)用這些通用驗(yàn)證組件來(lái)構(gòu)建需要的驗(yàn)證環(huán)境,為驗(yàn)證平臺(tái)的搭建提供了便利,縮短了搭建驗(yàn)證平臺(tái)所需要的時(shí)間[4]。
(2)UVM搭建出來(lái)的驗(yàn)證平臺(tái)具有特有的結(jié)構(gòu),使得整個(gè)平臺(tái)層次清晰,代碼可讀性大大增加,也省去了工程師自己構(gòu)建驗(yàn)證結(jié)構(gòu)的時(shí)間[5]。
(3)UVM擁用屬于自己的運(yùn)行機(jī)制,通過phase機(jī)制使得仿真階段也變得層次化,不僅僅指的是不同phase之間的層次順序,也包含了不同組件中相同phase的層次化關(guān)系[6]。
(4)UVM擁有獨(dú)特的傳輸機(jī)制。TLM通信機(jī)制增強(qiáng)了UVM各個(gè)組件之間的獨(dú)立性,其端口種類繁多,為滿足不同的通信需求提供了基礎(chǔ)。同時(shí)由于SystemC同樣支持TLM通信,這為UVM與System C之間的通信提供了基礎(chǔ)[7]。
(5)UVM擁有自己獨(dú)特的重載和覆蓋機(jī)制,極大地提高了代碼的可重用性。
本次待測(cè)設(shè)計(jì)采用由Verilog編寫的UHF_RFID數(shù)字基帶處理單元中的讀寫器發(fā)送鏈路。該設(shè)計(jì)從ISO/IEC 18000-6C協(xié)議標(biāo)準(zhǔn)出發(fā),實(shí)現(xiàn)了讀寫器處理并發(fā)送,標(biāo)簽接收并處理的功能。如圖1所示,閱讀器發(fā)送側(cè)主要由七個(gè)模塊構(gòu)成,分別為時(shí)鐘模塊、計(jì)數(shù)模塊、并串轉(zhuǎn)換模塊、CRC校驗(yàn)碼生成模塊、異步FIFO模塊、PIE編碼模塊以及同步碼添加模塊。發(fā)送數(shù)據(jù)時(shí),首先需要通過計(jì)數(shù)模塊計(jì)算發(fā)送數(shù)據(jù)位數(shù)并判斷數(shù)據(jù)類型,為并串轉(zhuǎn)換及數(shù)據(jù)編碼做準(zhǔn)備,接著將并行數(shù)據(jù)轉(zhuǎn)換成串行數(shù)據(jù),傳遞到CRC校驗(yàn)碼生成模塊,生成數(shù)據(jù)的循環(huán)冗余校驗(yàn)(cyclic redundancy check,CRC)碼添加在數(shù)據(jù)尾部。根據(jù)數(shù)據(jù)類型的不同,閱讀器發(fā)送模塊的CRC校驗(yàn)分為CRC5和CRC16兩種類型,當(dāng)發(fā)送數(shù)據(jù)為Query命令類型時(shí),進(jìn)行CRC5校驗(yàn),其他類型則進(jìn)行CRC16校驗(yàn)。之后再將數(shù)據(jù)送入異步FIFO進(jìn)行緩存,接著對(duì)FIFO讀出的數(shù)據(jù)進(jìn)行PIE編碼,最后為其添加同步碼發(fā)送給標(biāo)簽[8]。
圖1 待測(cè)設(shè)計(jì)電路模型
而標(biāo)簽接收側(cè)主要由四個(gè)模塊構(gòu)成,分別為同步碼檢測(cè)模塊、PIE解碼模塊、CRC檢驗(yàn)碼檢測(cè)模塊以及串并轉(zhuǎn)換模塊。標(biāo)簽接收側(cè)完成的功能則和讀寫器發(fā)送側(cè)功能相反,數(shù)據(jù)首先通過同步碼檢測(cè)模塊,確定數(shù)據(jù)的位置并提取緊接在同步碼之后的正確數(shù)據(jù),隨后將接收到的數(shù)據(jù)傳遞到PIE解碼模塊進(jìn)行PIE解碼操作,將解碼后的數(shù)據(jù)按照接收數(shù)據(jù)命令類型的不同,分別進(jìn)行CRC5和CRC16校驗(yàn),校驗(yàn)成功后將串行數(shù)據(jù)恢復(fù)成并行數(shù)據(jù)。
協(xié)議規(guī)定讀寫器發(fā)送鏈路的編碼方式為脈沖寬度編碼(pulse interval encoding,PIE)。通過定義數(shù)據(jù)-0和數(shù)據(jù)-1編碼后不同的碼元長(zhǎng)度來(lái)實(shí)現(xiàn),PIE編碼方式如圖2所示,編碼后0或1碼元的長(zhǎng)度主要取決于Tari和PW兩個(gè)參數(shù)。讀寫器對(duì)標(biāo)簽發(fā)信的基準(zhǔn)時(shí)間間隔為Tari,為一個(gè)0碼元持續(xù)的時(shí)間。這個(gè)值可以根據(jù)實(shí)際情況適當(dāng)修改,最佳讀寫器對(duì)標(biāo)簽Tari值如表1所示。PW的參數(shù)可以在0到Tari之間選取。從圖上可以看出碼元1的長(zhǎng)度為Tari+x,x的取值范圍為0.5tari到tari。
圖2 PIE編碼
表1 最佳讀寫器對(duì)標(biāo)簽Tari值
為方便編碼,在下面的設(shè)計(jì)和驗(yàn)證中,取x的值為Tari。因此,在PIE編碼中,0碼元被編碼為“10”序列,而1碼元被編碼為“1110”序列。
在PIE編碼模塊開始工作之前,首先要判斷CRC校驗(yàn)?zāi)K是否已經(jīng)開始工作并將校驗(yàn)后的數(shù)據(jù)寫入FIFO進(jìn)行數(shù)據(jù)緩沖,根據(jù)FIFO中有效數(shù)據(jù)的狀態(tài)決定是否進(jìn)行編碼操作,若FIFO已經(jīng)寫入超過一半數(shù)據(jù),則PIE編碼模塊開始工作,從異步FIFO中讀取數(shù)據(jù)并進(jìn)行編碼直到FIFO為空,表示已對(duì)全部數(shù)據(jù)進(jìn)行編碼。PIE編碼算法流程如圖3(1)所示。
圖3 PIE編解碼算法流程
根據(jù)協(xié)議可知,在解碼時(shí),最重要的參數(shù)是RTcal,其值為一個(gè)數(shù)據(jù)-0與一個(gè)數(shù)據(jù)-1的長(zhǎng)度之和。由于數(shù)據(jù)-0和數(shù)據(jù)-1均由高電平和低電平兩個(gè)部分構(gòu)成,當(dāng)接收到的數(shù)據(jù)為有效數(shù)據(jù)時(shí),采用頻率高于碼元速率的時(shí)鐘分別對(duì)接收到數(shù)據(jù)的高低電平進(jìn)行采樣,得到數(shù)據(jù)a和數(shù)據(jù)b,并取RTcal值的一半為常量pivot,與a和b之和進(jìn)行對(duì)比,若a與b的和小于pivot,則接收到的數(shù)據(jù)為數(shù)據(jù)-0,反之接收到的數(shù)據(jù)為數(shù)據(jù)-1[9]。PIE解碼流程如圖3(2)所示。
根據(jù)協(xié)議標(biāo)準(zhǔn),在解碼時(shí),若接收到比4*RTcal長(zhǎng)的符號(hào)為不良數(shù)據(jù),因此在解碼時(shí),a與b還需滿足下列兩個(gè)條件:
(1)a+b<4*RTcal,即a+b<8*pivot
(2)0.625*Tari3 驗(yàn)證平臺(tái)設(shè)計(jì)
3.1 實(shí)現(xiàn)基礎(chǔ)
SystemC和UVM驗(yàn)證平臺(tái)的搭建,其實(shí)現(xiàn)基礎(chǔ)是UVM Connect(UVMC)通信包,這個(gè)包集成了已有的SystemC和UVM的TLM通信標(biāo)準(zhǔn),使得UVM和SystemC之間TLM模型可以方便地實(shí)現(xiàn)通信并且不需要修改原本已有的代碼,降低了SC和UVM的TLM模型復(fù)用的難度。原有的TLM模型不再需要繼承其他的基類,而是通過外部代理的模式解決了這一問題,同時(shí)UVM一側(cè)的transaction類并不要求在factory中注冊(cè),減少了對(duì)factory機(jī)制的依賴。SV和SC兩側(cè)的transaction類并不要求完全一致,數(shù)據(jù)在SV和SC之間可以由各自的converter函數(shù)完成數(shù)據(jù)轉(zhuǎn)換,這樣的方式進(jìn)一步提高了原有TLM模型的復(fù)用性。
UVMC庫(kù)不僅提供了SystemC和SystemVerilog模型與組件之間的TLM1.0和TLM2.0連接方法,它還將UVM命令A(yù)PI方法輸出到SystemC一側(cè),用于從SystemC(C或C++)控制和訪問UVM仿真[10],這些API主要有以下幾個(gè)方面:
(1)等待UVM到一個(gè)特定的仿真階段。
(2)掛起或放下objection來(lái)控制UVM測(cè)試進(jìn)程。
(3)通過UVM config_db設(shè)置或得到配置的對(duì)象。
(4)通過config_db覆蓋類或?qū)嵗念愋汀?/p>
(5)打印UVM環(huán)境組件的拓?fù)浣Y(jié)構(gòu)。
對(duì)于SV和SC,在代碼中分別利用UVMC庫(kù)提供的類似的函數(shù)來(lái)完成相應(yīng)的TLM port的注冊(cè),在本設(shè)計(jì)中的注冊(cè)代碼如下:
SV TLM2:
uvmc_tlm#(my_transaction)::connect(mdl.out,“reader2tag”);
SC TLM2:
uvmc_connect(cons.in,“reader2tag”);
reader2tag是用來(lái)注冊(cè)該端口的字符串,在使用這些函數(shù)時(shí),UVMC會(huì)在SV和SC兩側(cè)都注冊(cè)端口的句柄和名字(reader2tag),而在后期連接階段,只要注冊(cè)端口的名字匹配,UVMC就會(huì)將這兩個(gè)端口連接起來(lái),而并不關(guān)心它們是什么語(yǔ)言。
驗(yàn)證平臺(tái)的結(jié)構(gòu)框架如圖4所示,該驗(yàn)證平臺(tái)主要包含的組件及其對(duì)應(yīng)的功能如下所示:
圖4 驗(yàn)證平臺(tái)結(jié)構(gòu)
(1)interface:接口聲明,主要包含讀寫器需要發(fā)送的數(shù)據(jù)和命令接口,用于實(shí)現(xiàn)待測(cè)設(shè)計(jì)(design under test,DUT)和testbench之間的通信[11]。
(2)transaction:產(chǎn)生組件之間通信最基本的數(shù)據(jù)包,本設(shè)計(jì)中包含讀寫器需要發(fā)送的命令和數(shù)據(jù),由于需要預(yù)留8 bit用于儲(chǔ)存data_size,因此在transaction內(nèi)需要限制發(fā)送數(shù)據(jù)位寬不能超過120 bit,因此在transaction添加如下約束:
constraint data_cons{
data_in[127:120]== 8'h0;
}
(3)sequence:用于產(chǎn)生transaction,可以控制transaction的數(shù)量,以及對(duì)transaction進(jìn)行約束從而產(chǎn)生符合預(yù)期的激勵(lì)等[12]。
(4)sequencer:用于將sequence產(chǎn)生的數(shù)據(jù)包傳遞給driver。
(5)driver:負(fù)責(zé)驅(qū)動(dòng)transaction,將激勵(lì)分別通過virtual interface和seq_item_port送到DUT和reference model,本設(shè)計(jì)在driver中定義了一個(gè)覆蓋組,用于功能覆蓋率的統(tǒng)計(jì),主要包含對(duì)隨機(jī)輸入數(shù)據(jù)可能存在情況的覆蓋,由于傳輸數(shù)據(jù)位寬較大,用隨機(jī)的方法全部遍歷不太方便,因此對(duì)數(shù)據(jù)范圍進(jìn)行了劃分,設(shè)置各個(gè)范圍的最低覆蓋次數(shù)為1,并且對(duì)一些特殊情況、邊界情況進(jìn)行了覆蓋,確保DUT在所有情況下都能完成正常的功能[13]。覆蓋組定義代碼如下:
covergroup trans_cg;
data_cov: coverpoint req.data_in{
bins all1={18'h3ffff};
bins special1={18'h15555};
bins special2={18'h2aaaa};
bins data_0={[0:18'h03fff]};
bins data_1={[18'h04000:18'h07fff]};
bins data_2={[18'h08000:18'h0bfff]};
……
}
endgroup
(6)monitor:本設(shè)計(jì)中包含兩個(gè)monitor,一個(gè)從輸入虛接口獲取數(shù)據(jù)包,用于監(jiān)測(cè)driver發(fā)送給DUT的數(shù)據(jù)包,確保讀寫器接收到的數(shù)據(jù)包正確無(wú)誤,另一個(gè)從輸出虛接口獲取數(shù)據(jù)包,用于監(jiān)測(cè)標(biāo)簽最終輸出的數(shù)據(jù)包,并將其通過uvm_analysis_port傳遞給scoreboard進(jìn)行數(shù)據(jù)比對(duì)。monitor關(guān)鍵代碼如下:
task my_monitor::main_phase(uvm_phase phase);
while(1) begin
tr=new("tr");
collect_one_pkt(tr);
ap.write(tr);
end
endtask
task my_monitor::collect_one_pkt(my_transaction tr);
while(1) begin
@(posedge vif.clk);
if(vif.valid) break;
end
…
while(vif.valid) begin
tr.data_in=vif.data_in;
@(posedge vif.clk);
end
…
endtask
(7)agent:將driver和monitor以及sequencer封裝在一起,可以通過配置is_active和is_passive參數(shù)來(lái)選擇是否使用driver和sequencer[14],并在connect_phase中建立driver和sequencer之間的連接。
(8)scoreboard:分別接收out_agent和reference model傳遞來(lái)的數(shù)據(jù)作為期望結(jié)果和實(shí)際結(jié)果,并在scoreboard中將期望結(jié)果和實(shí)際結(jié)果進(jìn)行自動(dòng)比對(duì),若兩者一致,則數(shù)據(jù)傳輸正確,打印“Compare SUCCESSFULLY”表示數(shù)據(jù)對(duì)比成功,若兩者不一致,則數(shù)據(jù)傳輸錯(cuò)誤,打印“Compare FAILED”表示數(shù)據(jù)對(duì)比失敗,并分別打印出期望的結(jié)果和實(shí)際的結(jié)果以作對(duì)比。和driver類似,在scoreboard中也定義了一個(gè)覆蓋組,用于對(duì)接收到的數(shù)據(jù)統(tǒng)計(jì)功能覆蓋率。
(9)reference_model:該類在本設(shè)計(jì)中自身不對(duì)數(shù)據(jù)進(jìn)行任何操作,僅用于和SystemC語(yǔ)言編寫的真正參考模型進(jìn)行數(shù)據(jù)通信以及控制與SystemC參考模型間的事務(wù)數(shù)量。UVM側(cè)實(shí)現(xiàn)通信的關(guān)鍵代碼如下:
my_transaction pkt=new();
delay.set_abstime(3,1e-4);
port.get(pkt);
pkt.print();
out.b_transport(pkt,delay);
pkt.print();
ap.write(pkt);
(10)env:封裝in_agent、out_agent、scoreboard、reference_model并將它們?cè)赾onnect_phase中進(jìn)行連接,實(shí)現(xiàn)組件之間的數(shù)據(jù)通信。
(11)testbench:例化env,啟動(dòng)sequence。
(12)top:連接testbench和DUT,運(yùn)用config機(jī)制配置頂層接口連接,啟動(dòng)testcase。
(13)DUT:由Verilog語(yǔ)言編寫的UHF_RFID數(shù)字基帶處理單元讀寫器發(fā)送鏈路設(shè)計(jì),根據(jù)testbench送來(lái)的激勵(lì)產(chǎn)生相應(yīng)的輸出結(jié)果,并送往scoreboard做比對(duì)[15]。
(14)SC Ref Model:由SystemC編寫的UHF_RFID數(shù)字基帶處理單元讀寫器發(fā)送鏈路模型,由UVM Connect包將其接入testbench,根據(jù)testbench送來(lái)的激勵(lì)產(chǎn)生標(biāo)準(zhǔn)的輸出結(jié)果,并送往scoreboard做比對(duì)。SC側(cè)實(shí)現(xiàn)數(shù)據(jù)通信的關(guān)鍵代碼如下:
virtual void b_transport(T& t, sc_core::sc_time& delay) {
cout << sc_time_stamp() << " SC consumer executing packet:"
<< endl << " " << t << endl;
data_in=t.data_in;
cnt_en=1;
wait(40,SC_NS);
cnt_en=0;
wait(s2p_done.posedge_event());
t.data_in=data_out;
cout << sc_time_stamp() << " SC consumer packet executed:"
<< endl << " " << t << endl;
delay=SC_ZERO_TIME;
}
本設(shè)計(jì)使用synopsys公司的VCS軟件進(jìn)行最后的仿真驗(yàn)證,查看波形和計(jì)分板的打印輸出來(lái)判斷DUT的功能實(shí)現(xiàn)情況,并根據(jù)代碼覆蓋率和功能覆蓋率來(lái)判斷驗(yàn)證的完整性。
圖5為發(fā)送50個(gè)隨機(jī)數(shù)據(jù)產(chǎn)生的DUT頂層波形圖。在圖中隨機(jī)選取一時(shí)間點(diǎn)分析數(shù)據(jù),如圖所示,選取時(shí)間為82418316451ns,在此時(shí)間點(diǎn)讀寫器發(fā)送數(shù)據(jù)data_in為128’h008d_7334_626e_67ad_60db_4cb6_d1d3_536f,標(biāo)簽接收到數(shù)據(jù)寄存在rx_buf中,可見接收到的數(shù)據(jù)為128’h8d73_3462_6e67_ad60_db4c_b6d1_d35d_6f78,接收數(shù)據(jù)末八位8’h78指的是發(fā)送數(shù)據(jù)長(zhǎng)度,換算成10進(jìn)制為120,其余位為發(fā)送數(shù)據(jù),經(jīng)對(duì)比數(shù)據(jù)及數(shù)據(jù)長(zhǎng)度與實(shí)際發(fā)送數(shù)據(jù)一致,DUT功能正確。
圖5 仿真波形
任意截取一個(gè)數(shù)據(jù)包的仿真對(duì)比結(jié)果報(bào)告如圖6所示。圖中expect pkt是由SC參考模型輸出的數(shù)據(jù),其數(shù)值為128’he005_30e2_8907_2fa5_7f0a_0e90_f420_4078,actual pkt是由輸出數(shù)據(jù)monitor監(jiān)測(cè)DUT標(biāo)簽接收模塊輸出最終傳遞到scoreboard的數(shù)據(jù),其數(shù)值為128’h e005_30e2_8907_2fa5_7f0a_0e90_f420_4078,可見DUT得到的數(shù)據(jù)和參考模型相同。經(jīng)過scoreboard自動(dòng)比對(duì),最終通過并在報(bào)告中打印Compare SUCCESSFULLY,DUT功能正確。
圖6 仿真報(bào)告
仿真的代碼覆蓋率如圖7所示,可以看出DUT各個(gè)模塊的行(Line)覆蓋率、狀態(tài)機(jī)(FSM)覆蓋率、分支(Branch)覆蓋率均達(dá)到100%,滿足驗(yàn)證要求。
圖7 代碼覆蓋率
圖8為仿真的整體功能覆蓋率圖,功能覆蓋率達(dá)到100%,在該驗(yàn)證環(huán)境中共包含兩個(gè)覆蓋組,分別是發(fā)送數(shù)據(jù)功能覆蓋組trans_cg和接收數(shù)據(jù)功能覆蓋組rcv_cg。由于發(fā)送數(shù)據(jù)位寬較大,覆蓋所有可能的數(shù)據(jù)比較困難,所以在覆蓋組中,對(duì)數(shù)據(jù)的范圍進(jìn)行了劃分,共分為16個(gè)倉(cāng),并添加特殊數(shù)據(jù)情況下的覆蓋,16個(gè)倉(cāng)以及特殊數(shù)據(jù)均被覆蓋,覆蓋率達(dá)到100%。功能覆蓋組rsv_cg中共包含三個(gè)覆蓋點(diǎn),覆蓋點(diǎn)均被覆蓋,覆蓋率達(dá)到100%,滿足了功能驗(yàn)證要求。
圖8 功能覆蓋率
隨著芯片產(chǎn)業(yè)的快速發(fā)展,打造越來(lái)越多的中國(guó)芯是歷史的必然選擇,其中芯片驗(yàn)證的作用不可忽視。該文提出了一種基于SystemC和UVM的驗(yàn)證平臺(tái)設(shè)計(jì)方法,實(shí)現(xiàn)了SystemC和SystemVerilog之間的聯(lián)合仿真。選用高層次的System C語(yǔ)言進(jìn)行建模,建模時(shí)間短,仿真速度快,雖然前期搭建驗(yàn)證平臺(tái)可能需要耗費(fèi)的時(shí)間較長(zhǎng),但相對(duì)于整個(gè)驗(yàn)證周期,無(wú)疑極大地縮短了驗(yàn)證時(shí)間,提高了驗(yàn)證效率。設(shè)計(jì)的復(fù)雜程度越高,就越能看出該文提出的驗(yàn)證平臺(tái)設(shè)計(jì)方法所帶來(lái)的便利。