,,, ,
(上海航天電子技術(shù)研究所,上海 201109)
目前數(shù)字系統(tǒng)設(shè)計中應(yīng)用最為廣泛且最為有效的驗證方法就是仿真。除了驗證單個模塊功能的正確性、接口交互以及整個系統(tǒng)功能的正確性,還可以模擬邊界測試、故障測試等,而硬件測試上往往是不能進(jìn)行的。但是隨著FPGA功能趨于復(fù)雜以及實現(xiàn)算法復(fù)雜度提高,其輸入信號可能是通過復(fù)雜模型產(chǎn)生的,比如信號的調(diào)制,傅里葉變換等。驗證人員受專業(yè)限制,無法理解和模擬該類輸入信號,只能向設(shè)計師要數(shù)據(jù)源。那么誰來保證數(shù)據(jù)源的正確性?如果使用該數(shù)據(jù)源出錯,那么問題是出在數(shù)據(jù)源,還是FPGA設(shè)計呢?很顯然,這樣無法保證驗證工作的獨立性。即使是明白專業(yè)的驗證人員通過Verilog或VHDL來實現(xiàn)復(fù)雜的輸入模型,同樣存在致命的缺點。比如調(diào)用Verilog和VHDL的IP來實現(xiàn)正弦函數(shù),由于HDL并行化的特點,在仿真中將占用大量的內(nèi)存,極大的影響仿真的速度。此外,如何在一個獨立的驗證平臺中驗證FPGA算法功能是否正確。比如計算一幅圖像的方差,通常方法是額外編寫一個C程序,然后人工的比對雙方的結(jié)果,以驗證該算法是否正確,沒有進(jìn)行實時比對,仍然存在測試有效性的問題。
本文提出了一種新的驗證解決方案,利用仿真工具中的SV DPI技術(shù),實現(xiàn)了在SV仿真驗證平臺中調(diào)用C或C++編程語言[1],利用高級語言可以更加方便的實現(xiàn)激勵讀取、參考模型構(gòu)建等功能。本文就該類解決方法進(jìn)行相關(guān)的闡述和討論,這對于提高FPGA驗證充分性和驗證的獨立性,以及驗證的靈活性都有著重要意義。
Verilog是現(xiàn)有航天FPGA驗證中最常用的語言。Verilog使用編程語言接口PLI(Programming Language Interface)來跟C語言程序交互。使用PLI可以生成延遲計算器,以連接和同步多個仿真器,并增加諸如波形顯示等調(diào)試工具。但是PLI非常繁瑣,即使通過PLI連接一個簡單的C程序,都需要編寫大量的代碼,并需理解很多概念,這些概念包括多個仿真階段的同步、調(diào)用段、實例指針等等。此外,PLI給仿真帶來了額外的負(fù)擔(dān),因為為了保護(hù)Verilog數(shù)據(jù)結(jié)構(gòu),仿真器必須不斷地在Verilog和C語言域之間復(fù)制數(shù)據(jù)。所以現(xiàn)有的FPGA驗證過程中,F(xiàn)PGA驗證人員基本不會去使用PLI。
而新一代的驗證語言SystemVerilog引入了直接編程接口DPI[2-3],它能更加簡單地連接C、C++編程語言。一旦你聲明或者使用import語言“導(dǎo)入”了一個C子程序,你就可以像調(diào)用SystemVerilog中的子程序一樣來調(diào)用它,使用起來非常方便。首先,通過高級語言實現(xiàn)復(fù)雜模型比使用hdl語言要輕松很多,且仿真速度快。比如C語言已經(jīng)提供了很多庫函數(shù),直接調(diào)用即可,無須重新編寫。這樣既保證了激勵編寫的正確性,又提高了可重用性。同時C語言目標(biāo)代碼的執(zhí)行速度比hdl仿真速度要至少提高一個數(shù)量級。其次,F(xiàn)PGA中實現(xiàn)的算法都有可靠的高級語言模型,基于DPI技術(shù)的FPGA仿真驗證平臺可以直接調(diào)用該模型,實現(xiàn)同一份激勵輸入到FPGA設(shè)計和高級語言模型,然后比對兩個結(jié)果,以判斷FPGA設(shè)計實現(xiàn)正確性。通過該方法,驗證人員可以不受專業(yè)限制,將FPGA設(shè)計完全看做是一個黑盒,保證驗證方的獨立性。再次將C函數(shù)連入驗證平臺,容易實現(xiàn)驗證平臺的完整性,為自動測試創(chuàng)造了條件。最后,利用SystemVerilog的受限制隨機(jī)激勵生成功能、斷言和功能覆蓋率功能可以大大提高測試的效率和質(zhì)量。
要使用SV DPI驗證技術(shù)順利將SystemVerilog和C聯(lián)合起來仿真,應(yīng)按照下面4個步驟進(jìn)行。
1)編寫C代碼實現(xiàn)算法。DPI包括兩個完全獨立的層次,分別是SystemVerilog和C,在C代碼中需要聲明包含頭文件svdpi.h,因為在svdpi.h中包含了SystemVerilog DPI結(jié)構(gòu)和方法的定義[4]。
2)實現(xiàn)C與SystemVerilog通信。SystemVerilog平臺中通過導(dǎo)入函數(shù)和任務(wù)來調(diào)用C代碼,DPI也允許在C代碼中通過導(dǎo)出函數(shù)和任務(wù)來調(diào)用SystemVerilog中的方法[5]。被調(diào)用的SystemVerilog方法可以是一個保存C函數(shù)操作結(jié)果的簡單任務(wù),或者是一個實現(xiàn)部分硬件模型的耗時任務(wù)[6]。
SystemVerilog平臺中導(dǎo)入函數(shù)和任務(wù)的定義如下:
import “DPI” [c_identifier =][pure][context]function type name(args);
import “DPI” [c_identifier =] [context]task type name(args);
SystemVerilog平臺中導(dǎo)出函數(shù)和任務(wù)的定義如下:
export “DPI” [C_identifier =]function type name;
export “DPI” [C_identifier =]task type name;
3)匹配數(shù)據(jù)類型映射。由于SystemVerilog數(shù)據(jù)類型和C語言數(shù)據(jù)類型差異比較大,SystemVerilog3.1語言手冊定義了通過DPI傳遞的每個數(shù)據(jù)類型的匹配模式。具體見表1[4]。
表1 SystemVerilog和C語言之間的數(shù)據(jù)類型映射
其中對于bit和logic類型匹配在svdpi.h文件中有專門的指定。使用者需根據(jù)svdpi.h文件中的定義來選擇匹配的數(shù)據(jù)類型。另外需要注意的是:DPI不會檢查數(shù)據(jù)類型的兼容性,需要使用者自己保證數(shù)據(jù)匹配的正確性。
4)利用仿真工具編譯C程序的方法,生成最終的目標(biāo)碼,并和SystemVerilog混合運(yùn)行。
某FPGA產(chǎn)品根據(jù)采集到的多音組合調(diào)頻信號,依據(jù)一定的解調(diào)算法實現(xiàn)最終的解碼[9]。驗證人員在VCS環(huán)境搭建基于DPI技術(shù)的FPGA仿真驗證平臺如圖1所示。解出的密碼包括m個碼元,每個碼元為n位。每個碼元都是由n個單音(正弦波)中的4個疊加而成,而每個單音的頻率是不一樣的,若m個碼元解密出的數(shù)據(jù)與存儲密碼一致,則解密成功。每個多音組合調(diào)頻信號指令格式如圖2所示。
圖1 某FPGA產(chǎn)品驗證架構(gòu)
圖2 多音組合調(diào)頻信號指令格式
該FPGA產(chǎn)生AD芯片的采樣的時鐘和讀控制信號,AD芯片根據(jù)相應(yīng)的時序采集外圍的模擬信號,AD芯片將其轉(zhuǎn)換為數(shù)字信號輸出給FPGA設(shè)計?;趫D1的驗證架構(gòu),驗證人員根據(jù)DPI驗證流程按照以下步驟,實現(xiàn)整個FPGA驗證架構(gòu)。
1)編寫C程序模擬完成多個單音數(shù)據(jù)(正弦波)疊加后的數(shù)字化采樣。在SystemVerilog驗證架構(gòu)中隨機(jī)挑選4個單音進(jìn)行疊加,生成多種單音組合序列,SystemVerilog將這些序列指令碼元的組合情況通知C程序,C程序根據(jù)輸入的參數(shù)實現(xiàn)AD采樣數(shù)據(jù)的模擬。C程序先根據(jù)參數(shù)頻率計算15組碼元數(shù)據(jù)的角速度值和導(dǎo)頻音角速度值,利用角速度值和幅值參數(shù)生成16組標(biāo)準(zhǔn)的2048個點精度的二進(jìn)制偏移正弦波,然后根據(jù)輸入的單音組合序列,當(dāng)有組合序列對應(yīng)位置為1時,將對應(yīng)的正弦波疊加,再根據(jù)組合情況,按照時間順序,前10 ms輸出導(dǎo)頻音正弦波,5 ms輸出第一組疊加的多音組合,下個5 ms輸出第二組多音組合,依次輸出7個。
圖3 C程序模擬AD輸入數(shù)據(jù)生成代碼
2)在SystemVerilog中調(diào)用C程序,實現(xiàn)數(shù)據(jù)的相互通信。在SystemVerilog中,通過import “DPI-C”聲明定義C函數(shù)的原型[7],接著在SystemVerilog的任務(wù)或者進(jìn)程中就可以調(diào)用C函數(shù)MaYuan。為了提高仿真的效率,應(yīng)盡量減少SystemVerilog和C函數(shù)的通訊,所以在該平臺中,將C函數(shù)計算出的7個碼元對應(yīng)的數(shù)字化采樣數(shù)據(jù)一次性寫入到文件中,SystemVerilog平臺通過Read_file過程使用讀取文件的方式來實現(xiàn)AD數(shù)據(jù)的注入,而不是通過C函數(shù)返回的方式,這樣可以適當(dāng)提高仿真的效率。
圖4 在SV中調(diào)用C程序
3)注意匹配SystemVerilog的數(shù)據(jù)類型和C語言的數(shù)據(jù)類型的兼容性映射。在 該應(yīng)用實例中SystemVerilog傳遞給C程序的接口包括指令組合(ZhiLing[0:6])、幅值(DaoPin_FUZHI)、頻率(PinLv)。SystemVerilog的數(shù)據(jù)類型和C語言的數(shù)據(jù)類型的兼容性如表2所示。
表2 SystemVerilog的數(shù)據(jù)類型和C語言的數(shù)據(jù)類型映射
4)完成解調(diào)出的密碼與輸入的指令碼元自動比對功能。圖1的解調(diào)模塊將根據(jù)時鐘收集解調(diào)出的碼元,同時將其按照特定的格式轉(zhuǎn)換為指令,與傳遞給C程序的指令組合(ZhiLing[0:6])進(jìn)行比較,完成自動比對功能,以確認(rèn)FPGA設(shè)計的解調(diào)功能是否正確。
5)利用仿真工具VCS編譯[8]C程序的方法,從而生成最終的目標(biāo)碼。該FPGA仿真工具采用了linux環(huán)境下的VCS仿真工具,VCS調(diào)用linux下的gcc編譯器,可以實現(xiàn)在對FPGA代碼編譯的同時,也完成對C程序的編譯以及目標(biāo)碼的生成,如圖5所示。
圖5 仿真工具VCS編譯C程序
對于復(fù)雜算法類 FPGA設(shè)計,怎樣自動生成測試用例數(shù)據(jù)、怎樣進(jìn)行測試用例數(shù)據(jù)注入和進(jìn)行結(jié)果分析是測試驗證工程師面臨的一大難題。傳統(tǒng)的仿真驗證方法只能通過matlab生成數(shù)據(jù)源,利用時鐘導(dǎo)入的方式進(jìn)行仿真驗證,只能進(jìn)行正常的功能測試,更無法進(jìn)行結(jié)果比對。利用3.1節(jié)描述的仿真模型,驗證人員通過ZhiLing、DaoPin_FUZHI和PinLv參數(shù)的配置以及MaYuan函數(shù)的靈活調(diào)用,實現(xiàn)了表3中的11個測試用例,并發(fā)現(xiàn)當(dāng)預(yù)令碼元不是由四個單音組成時,解碼結(jié)果不正常的問題。而使用傳統(tǒng)的仿真驗證或者硬件測試方法要實現(xiàn)表3中的所有測試用例非常麻煩,耗時巨大,因此之前一直沒有發(fā)現(xiàn)問題。
由此可知,通過上述方法搭建的基于DPI技術(shù)的FPGA仿真驗證平臺,具備如下幾個優(yōu)點:
1)由高級語言C編寫的激勵輸入,相比Verilog中的IP調(diào)用[10],無疑極大的提高了仿真效率。
2)驗證人員通過C代碼編寫的激勵向量,無須向設(shè)計師索取激勵輸入數(shù)據(jù),保證了驗證工作的獨立性。
3)依據(jù)隨機(jī)產(chǎn)生的指令組合,然后根據(jù)C代碼產(chǎn)生的AD數(shù)據(jù)作為FPGA輸入,再對FPGA解碼出的指令組合與隨機(jī)產(chǎn)生的指令組合進(jìn)行自動比對,提高了測試的自動化和測試的完備性。
復(fù)雜算法FPGA仿真驗證的有效性一直是FPGA驗證的熱點問題,本文提出的利用SV DPI仿真技術(shù)實現(xiàn)在SV仿真驗證平臺中調(diào)用C或C++的驗證方案。經(jīng)工程應(yīng)用論證,利用SV DPI技術(shù)在SV仿真驗證平臺中調(diào)用C或C++編程語言,可以更加方便的實現(xiàn)激勵讀取、參考模型構(gòu)建、測試結(jié)果自動比對等功能。基于SystemVerilog的FPGA驗證平臺,可以通過DPI實現(xiàn)SystemVerilog平臺與高級語言(C、C++等)的通信,讓Systemverilog的強(qiáng)大驗證能力能夠在事物處理級模型的驗證工作中充分發(fā)揮[11],相對于傳統(tǒng)的純verilog驗證平臺,大大提高了仿真效率和驗證的靈活性,同時也為算法級FPGA設(shè)計的確認(rèn)測試提供了新的驗證思路。
表3 調(diào)頻和多音組合解調(diào)功能測試表
參考文獻(xiàn):
[1] 虞致國,魏敬和. 基于SystemVerilog DPI的ARM SoC虛擬調(diào)試驗證平臺的設(shè)計[J].微電子學(xué)與計算機(jī),2009(11): 117-119.
[2] 閆 沫,張 媛. 基于SystemVerilog語言的設(shè)計驗證技術(shù)[J].現(xiàn)代電子技術(shù),200806:8-11.
[3] 耿 介,于治樓,畢研山.一種UVM驗證環(huán)境中復(fù)用C程序測試向量的方法: CN104899138A[P]. 2015-09-09.
[4] Synopsys VCS MX/VCS MXi User Guide [S] .Version E-2011.03-SP1 August 2011.
[5] 李 璐,周春良,馮 曦,等.基于 DPI-C 接口的可擴(kuò)展 SOC 驗證平臺[J].電子設(shè)計工程,2018,26(4):136-140.
[6] 王 紀(jì),馮志華.SOC多語言協(xié)同驗證平臺技術(shù)研究[J].電子設(shè)計工程,2015,23(20):130-133.
[7] Synopsys.Reference Verification Methodology User Guide[S].September, 2004.
[8] Synopsys.Design Ware AHB Verification IP Databook[S].March 24,2003.
[9] 王俊蕊,李艷斌.短波多音并行信號全數(shù)字解調(diào)算法設(shè)計[J].無線電工程, 2016 (1):76-79.
[10] 鮑曉利, 馮永新. 寬帶掃頻式干擾的仿真與FPGA實現(xiàn)[J].沈陽理工大學(xué)學(xué)報,2008, 27(3):61-64.
[11] Schutten R.基于ESL并采用SystemC和SystemVerilog的設(shè)計流程[J].電子設(shè)計技術(shù),2006 ,13(4) :142-142.