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