文獻(xiàn)標(biāo)識碼: A
DOI:10.16157/j.issn.0258-7998.2016.01.002
中文引用格式: 李皓,蘇秀紅. 基于UVM和Matlab搭建的DVB-S編碼調(diào)制系統(tǒng)驗證平臺[J].電子技術(shù)應(yīng)用,2016,42(1):15-18.
英文引用格式: Li Hao,Su Xiuhong. A DVB-S coding and modulation systems functional verification platform based on UVM and Matlab[J].Application of Electronic Technique,2016,42(1):15-18.
0 引言
隨著信號處理系統(tǒng)日益復(fù)雜,數(shù)字芯片的功能驗證已經(jīng)成為了影響芯片上市時間和成本的關(guān)鍵。然而信號處理芯片的系統(tǒng)級驗證仍面臨著諸多挑戰(zhàn)。盡管在測試驗證領(lǐng)域已經(jīng)發(fā)展出了很多自動驗證方法,但是目前在驗證復(fù)雜信號處理算法時,多數(shù)仍需要使用人工添加測試用例的方法進(jìn)行驗證,耗費(fèi)了大量人力物力。
驗證信號處理算法的難點(diǎn)主要集中在如何使用合適的方法搭建高效的參考模型。
信號處理系統(tǒng)中一般包含大量復(fù)雜的數(shù)學(xué)算法,使用硬件語言實現(xiàn)這些算法的驗證工作往往需要豐富的經(jīng)驗與技巧。如果使用硬件語言SystemVerilog來對這些算法進(jìn)行驗證,即便不考慮對驗證工程師經(jīng)驗與技巧的要求,也應(yīng)注意到使用硬件語言SystemVerilog來實現(xiàn)這些復(fù)雜算法很可能會使用與被測件相近的設(shè)計思路,產(chǎn)生類似的錯誤,從而遺漏一些致命錯誤。正是考慮到這一點(diǎn),本文提出了一種使用class="innerlink" href="http://ihrv.cn/tags/Matlab" title="Matlab" target="_blank">Matlab軟件與高級驗證方法學(xué)(Universal Verification Methodology,UVM)聯(lián)合搭建的功能驗證平臺。利用UVM提供的直接編程接口(Direct Programming Interface,DPI)在驗證平臺中通過C++連接Matlab,實現(xiàn)信號處理系統(tǒng)中復(fù)雜的算法部分的驗證,從而大幅提高了驗證平臺開發(fā)效率以及平臺的復(fù)用性,加快了仿真驗證時間。
1 DVB-S編碼調(diào)制系統(tǒng)
數(shù)字視頻廣播(Digital Video Broacasting)是歐洲電信標(biāo)準(zhǔn)協(xié)會(European Telecommunications Standards Institute,ETIS)制訂的關(guān)于數(shù)字電視衛(wèi)星業(yè)務(wù)中幀結(jié)構(gòu)、信道編碼和調(diào)制的標(biāo)準(zhǔn)[1],被包括我國在內(nèi)的絕大多數(shù)國家和地區(qū)所采用。該標(biāo)準(zhǔn)針對衛(wèi)星數(shù)字多節(jié)目電視以及高清電視節(jié)目在固定衛(wèi)星業(yè)務(wù)和廣播衛(wèi)星業(yè)務(wù)的一次發(fā)送和二次轉(zhuǎn)發(fā)作出的規(guī)定,其調(diào)制方式采用四位移相鍵控(Quaternary Phase Shift Keying,QPSK),并采用基于卷積碼和RS(Reed-Solomon)碼的級聯(lián)糾錯編碼。根據(jù)ETSI的ETS 300 421的規(guī)定,DVB-S的編碼調(diào)制原理框圖如圖1所示。
根據(jù)DVB-S標(biāo)準(zhǔn)規(guī)定并結(jié)合實際使用時對參數(shù)的配置以及數(shù)據(jù)實時監(jiān)測的需求,DVB-S的編碼調(diào)制系統(tǒng)結(jié)構(gòu)框圖如圖2所示。
2 UVM驗證平臺
2.1 驗證平臺概述
本平臺的驗證是系統(tǒng)級的功能驗證,主要目的是確保DVB-S編碼調(diào)制系統(tǒng)電路設(shè)計與功能規(guī)范定義功能吻合。在DVB-S編碼調(diào)制系統(tǒng)電路外圍搭建UVM驗證平臺,采用受約束的隨機(jī)測試方法將激勵施加到被測件的輸入,最后通過輸出進(jìn)行自動比較,檢查是否正確,同時也要查看覆蓋率是否達(dá)到了目標(biāo)要求,如果沒有達(dá)到,應(yīng)該開發(fā)新的有效驗證場景,通過迭代完成驗證收斂[2]。其代碼覆蓋率和功能點(diǎn)覆蓋率要求均為100%。平臺使用的UVM庫版本為1.1c,Matlab版本為2008b。
2.2 基于UVM的驗證平臺設(shè)計與實現(xiàn)
2.2.1 驗證平臺結(jié)構(gòu)
通用驗證方法學(xué)UVM是基于SystemVerilog開發(fā)的一套開源類庫,起源于OVM驗證方法學(xué)[3]。UVM類庫中定義了一系列的標(biāo)準(zhǔn)類,并結(jié)合標(biāo)準(zhǔn)接口、Factory 機(jī)制、Phase機(jī)制、分層結(jié)構(gòu)以及面向?qū)ο蟮脑O(shè)計思想使整個平臺具有靈活配置、可重用、可擴(kuò)展升級等優(yōu)點(diǎn)[4]。本文提出的驗證平臺成功地應(yīng)用于DVB-S編碼調(diào)制系統(tǒng)的仿真驗證,其最主要的特點(diǎn)就是將Matlab與UVM相融合,從而解決了僅用硬件語言難以驗證的復(fù)雜數(shù)字處理算法。該驗證平臺的結(jié)構(gòu)如圖3所示。
除了在典型UVM驗證平臺結(jié)構(gòu)之外,本驗證平臺在參考模型(Reference model)中增加了外部接口連接到Matlab程序,對相應(yīng)數(shù)據(jù)進(jìn)行處理。
2.2.2 驗證平臺頂層組件設(shè)計
本驗證平臺中的頂層主要是連接頂層Test_top和環(huán)境類Environment。在Test_top中主要完成6個主要功能:被測件的例化,測試環(huán)境(主要指環(huán)境類)的例化,接口的例化,被測件、測試環(huán)境和接口之間的相互連接,整個測試環(huán)境時鐘和復(fù)位的產(chǎn)生,驗證平臺的啟動。
在環(huán)境類(Environment)中,主要完成5項工作:例化代理類,例化參考模型,例化記分板,連接以上三個部分,完成驗證平臺的通用設(shè)置。在驗證平臺中,組件在環(huán)境類中的相互鏈接通過UVM中的fifo鏈接,這樣可以方便地實現(xiàn)各組件間的異步接收。環(huán)境類處于驗證平臺的頂層,因此在環(huán)境類中同時也完成了一些與整個驗證平臺相關(guān)的設(shè)置工作,如設(shè)置平臺可接受的最大錯誤數(shù)量,信息輸出等級等。
2.2.3 測試組件的設(shè)計
測試組件是驗證平臺的最重要也是核心設(shè)計,完成了驗證平臺的主要功能。其主要設(shè)計思想是盡可能地將對被測件單一功能項測試的組件進(jìn)行封裝,使組件能夠盡可能少地依賴外部控制。主要包括7類關(guān)鍵組件:
(1)代理(agent):測試組件的頂層。由于DVB-S編碼調(diào)制系統(tǒng)的輸入輸出關(guān)系相對簡單,因此在本驗證平臺中只使用了一個agent對測試組件進(jìn)行封裝。agent主要完成sequencer、驅(qū)動器(driver)、監(jiān)視器(monitor)的例化和連接。
(2)驅(qū)動器(driver):主要實現(xiàn)驗證平臺向被測件間輸出的接口協(xié)議。在這里事物級的數(shù)據(jù)流將被轉(zhuǎn)換為比特流,還有一個重要功能是將正在發(fā)送數(shù)據(jù)放到uvm_analysis_port端口上,供驗證平臺使用。在本驗證平臺中主要有兩個driver,分別是向參數(shù)寄存器組發(fā)送參數(shù)的driver_parameter以及發(fā)送串行數(shù)據(jù)的driver_data。
(3)監(jiān)視器(monitor):主要實現(xiàn)驗證平臺接收被測件輸出的接口協(xié)議。這里將輸出總線上的比特流轉(zhuǎn)換為數(shù)據(jù)幀放到uvm_analysis_port,供驗證平臺使用。在本驗證平臺中也設(shè)置了兩個監(jiān)視器monitor_data和monitor_source,用來分別監(jiān)視輸出的數(shù)據(jù)流以及對監(jiān)測數(shù)據(jù)進(jìn)行讀取。
(4)transaction類:是傳入數(shù)據(jù)的主要載體。在驗證平臺中,共設(shè)置了3個不同的transaction類,用于發(fā)送參數(shù)和原始數(shù)據(jù)的transaction_source,用于接收結(jié)果的transaction_data以及后面將提到的transaction_case。
(5)sequence類:主要功能是將測試用例傳來的測試場景轉(zhuǎn)換為transaction中數(shù)據(jù)。在本驗證平臺中sequence類主要將測試用例傳來的參數(shù)傳入Matlab程序,并由Matlab產(chǎn)生真正的原始數(shù)據(jù)寫入到transaction_source中。
(6)參考模型(reference model):主要是模擬被測件的行為,通過uvm_blocking_get_port接收驅(qū)動器driver_parameter和driver_data傳來的數(shù)據(jù),并將這些數(shù)據(jù)傳入Matlab進(jìn)行處理,然后將處理結(jié)果通過uvm_analysis_port傳給記分板。
(7)記分板(scoreboard):主要功能是比對參考模型和被測件產(chǎn)生的數(shù)據(jù),以確定是否存在問題。記分板(scoreboard)通過uvm_blocking_get_port接收來自監(jiān)視器monitor_data、monitor_source以及參考模型的數(shù)據(jù)。
2.3 C++、Matlab接口的設(shè)計
2.3.1 UVM驗證平臺與C++的接口
SystemVerilog提供了方便的DPI接口來連接C++代碼,只需SV文件中進(jìn)行簡單的聲明并在腳本中進(jìn)行相應(yīng)的編譯鏈接即可以使用[5]。在本驗證平臺中首先在參數(shù)文件中加入了對計算函數(shù)compute的聲明如下:
import "DPI-C" context task compute(input int data[S_NUM], output int I[NUM], output int Q[NUM]);
然后在model_data中直接調(diào)用函數(shù)compute。在驗證平臺中C++與驗證平臺的接口主要是用于將驗證平臺與Matlab程序相連接,因此沒有用到復(fù)雜的功能,僅僅是將數(shù)據(jù)以合適的類型傳入。這樣設(shè)計的目的是有效利用用于原理驗證的Matlab仿真程序。盡管Matlab仿真程序的運(yùn)行效率遠(yuǎn)低于C++程序,但相對于HDL的仿真來說,這個效率問題往往可以忽略,而且Matlab仿真程序擁有的多種算法資源加快了驗證平臺的搭建。
2.3.2 C++與Matlab的接口
下面以compute函數(shù)為例說明在C++中調(diào)用Matlab函數(shù)的過程。其中函數(shù)聲明如下。
int compute(const svOpenArrayHandle source_bit,svOpenArrayHandle data_i, const svOpenArrayHandle data_q)
在函數(shù)中,首先使用以下代碼啟動Matlab,其中頭文件engine.h可在Matlab的安裝目錄下找到。
…
#include "engine.h"
Engine *ep;
engSetVisible(ep, 0);
…
使用自建函數(shù)input_arry將UVM傳入C++的數(shù)據(jù)data進(jìn)一步變換格式傳入Matlab中成為數(shù)據(jù)x代碼如下:
input_arry (ep, x, S_NUM , data);
其中自建函數(shù)input_arry如下:
void input_arry(Engine *ep, char *name, int num, const svOpenArrayHandle data_in)
{
/*
* 輸入: ep,打開matlab的句柄
* num,數(shù)組長度
* name,寫入matlab的變量名
* data_in,寫入的向量
* 輸出:無
*/
int *input_i;
double *input_d= new double[num];;
mxArray *input = NULL;
input_i=(int *) svGetArrayPtr(data_in);
for(int i=0;i<num; i++)
{
input_d[i] = (double)input_i[i];
}
input = mxCreateDoubleMatrix(1, num, mxREAL);//數(shù)據(jù)格式生成
memcpy((void *)mxGetPr(input),(void *)input_d,num*sizeof(input_d[0]));//數(shù)據(jù)轉(zhuǎn)換
engPutVariable(ep, name, input);//向matlab寫數(shù)據(jù)
mxDestroyArray(input);
}
從Matlab到C++的轉(zhuǎn)換程序與此過程類似,僅作反向處理即可,這里就不再討論。最后將C++代碼編譯為動態(tài)鏈接庫(dll)文件compute.dll,然后在腳本文件加入vsim-sv_lib./TestBench/c/compute即可完成整個連接過程。
3 測試結(jié)果與分析
仿真驗證用例運(yùn)行完成后,對代碼進(jìn)行了回歸測試并對覆蓋率進(jìn)行統(tǒng)計?;貧w測試后代碼覆蓋率的統(tǒng)計結(jié)果為,DUT的代碼覆蓋率為99.72%,分支覆蓋率為98.63%。剩余未覆蓋到的情況如default語句很難覆蓋到,并對這種情況進(jìn)行了人工代碼走查。因此達(dá)到上述代碼覆蓋率百分比的情況可以認(rèn)為滿足了目標(biāo)覆蓋率要求。
UVM與Matlab聯(lián)合仿真驗證平臺和完全使用硬件語言編寫的仿真驗證平臺的仿真驗證時間對比如圖4。從圖中可以看出使用純硬件語言驗證平臺的測試用例平均運(yùn)行時間為5.192 4小時,而使用UVM與Matlab聯(lián)合仿真驗證平臺測試用例平均運(yùn)行時間為2.646 6小時,平均節(jié)約了近50%的時間。
4 總結(jié)
本文采用基于UVM和Matlab聯(lián)合搭建的仿真驗證平臺對DVB-S編碼調(diào)制系統(tǒng)進(jìn)行了功能驗證,高效快速地達(dá)到了覆蓋率要求。該平臺與純硬件語言仿真驗證平臺相比節(jié)約了近50%仿真驗證時間,而且可以使用Matlab中成熟的工具箱對各種數(shù)字處理算法進(jìn)行編程,極大地降低了驗證平臺開發(fā)難度,節(jié)約了開發(fā)時間并且提高了平臺的復(fù)用性。
文中構(gòu)建的平臺結(jié)構(gòu)移植性強(qiáng),對其他類似的信號處理系統(tǒng)驗證開發(fā)具有非常大的借鑒意義。通過對UVM與Matlab聯(lián)合仿真環(huán)境的運(yùn)用,顯著提高了仿真驗證效率,為復(fù)雜數(shù)字處理SoC驗證提供了一條有意義的途徑。
參考文獻(xiàn)
[1] ETSI.EN 300 421.Digital Video Broacasting(DVB).Framing structure,channel coding and modulation for 11/12GHz satellite services[S].1997.
[2] 鐘文楓.SystemVerilog與功能驗證[M].北京:機(jī)械工業(yè)出版社,2010:5-7.
[3] Accdlera.Universal verification methodology 1.1 user′s guide[M].Cadence Design Systems Inc.,Mentor Graphics Corp.,Synopsys Inc.,2011,5:2
[4] 田勁,王小力.基于UVM驗證方法學(xué)的AES模塊級驗證[J].微電子學(xué)與計算機(jī),2012(8).
[5] Chris Spear.System verilog for verification[M].Synopsys Inc.,2008:329.