劉光宇,馬 盼,劉肖婷,孟博洋,林子明
(1.北京全路通信信號(hào)研究設(shè)計(jì)院集團(tuán)有限公司,北京 100070;2.北京市高速鐵路運(yùn)行控制系統(tǒng)工程技術(shù)研究中心,北京 100070)
國(guó)內(nèi)鐵路技術(shù)飛速發(fā)展,鐵路運(yùn)營(yíng)里程不斷攀升,各種復(fù)雜的運(yùn)行環(huán)境對(duì)列車(chē)控制技術(shù)的要求也更為嚴(yán)格。當(dāng)前,由于可移植性高及便于開(kāi)發(fā)等特點(diǎn),現(xiàn)場(chǎng)可編程邏輯門(mén)陣列(Field Programmable Gate Array,F(xiàn)PGA)得到了廣泛應(yīng)用。隨著列控邏輯功能的不斷增加,對(duì)其驗(yàn)證的要求也在不斷提高。傳統(tǒng)的FPGA 開(kāi)發(fā)工具仿真的方式已逐漸不能完成其全序功能的測(cè)試[1]。
近年來(lái),驗(yàn)證技術(shù)的不斷發(fā)展,通用驗(yàn)證方法學(xué)(Universal Verification Methodology,UVM)憑借其標(biāo)準(zhǔn)化、層次化和可重用性等特點(diǎn)開(kāi)始占據(jù)主導(dǎo)地位。同時(shí)借助服務(wù)器端高并行度的特點(diǎn),可實(shí)現(xiàn)更快速的測(cè)試和迭代。本文針對(duì)列控應(yīng)答器傳輸模塊中的解碼板FPGA 邏輯,實(shí)現(xiàn)了以SystemVerilog 語(yǔ)言構(gòu)建的UVM 驗(yàn)證平臺(tái),可實(shí)現(xiàn)對(duì)待測(cè)設(shè)計(jì)(Design Under Test,DUT)的快速迭代和功能覆蓋。
應(yīng)答器傳輸模塊(Balise Transmission Module,BTM)主要實(shí)現(xiàn)對(duì)編碼報(bào)文的譯碼功能,其總體設(shè)計(jì)框架如圖1 所示。輸入的編碼長(zhǎng)報(bào)文或短報(bào)文FSK_in 信號(hào)首先進(jìn)入先入先出數(shù)據(jù)緩存器(First In First Out,F(xiàn)IFO),控制模塊(control)檢測(cè)到FIFO 非空情況,開(kāi)始讀取其內(nèi)部數(shù)據(jù),并在達(dá)到其判定條件后開(kāi)始在解碼模塊(decode)中進(jìn)行譯碼過(guò)程。譯碼完成后的結(jié)果送入隨機(jī)存儲(chǔ)器(Random Access Memory,RAM)模塊,等待CPU 總線(xiàn)進(jìn)行讀取。
圖1 BTM硬件設(shè)計(jì)結(jié)構(gòu)Fig.1 BTM hardware design structure
BTM 內(nèi)置通信模塊信箱(Mailbox),含發(fā)送FIFO Tx 與接收FIFO Rx,可方便與其他設(shè)備進(jìn)行數(shù)據(jù)通信。同時(shí)為保證設(shè)備運(yùn)行的可靠性,BTM 還內(nèi)置自檢模塊,定時(shí)進(jìn)行報(bào)文自檢和天線(xiàn)自檢處理,以保證設(shè)備的正常運(yùn)行。同時(shí),其內(nèi)部還有豐富的地址映射,方便對(duì)速度、距離、時(shí)間戳等進(jìn)行配置或讀取。
UVM 面向所有數(shù)字設(shè)計(jì),涵蓋從模塊級(jí)到芯片級(jí),從ASIC 到FPGA,從控制邏輯、數(shù)據(jù)通路到處理器的全部場(chǎng)景[2]?;谄潇`活的環(huán)境類(lèi),可方便實(shí)現(xiàn)組件的層次結(jié)構(gòu)化擴(kuò)展。
典型的驗(yàn)證平臺(tái)如圖2 所示。其主要包含激勵(lì)序列(sequence)、主代理(i_agent)、參考模型(reference model)、計(jì)分板(scoreboard)、從代理(o_agent)5 大部分[3]。事務(wù)級(jí)激勵(lì)序列經(jīng)由序列生成器送入驅(qū)動(dòng)器,轉(zhuǎn)化成信號(hào)級(jí)激勵(lì)序列后驅(qū)動(dòng)DUT,主監(jiān)視器檢測(cè)DUT 端口激勵(lì),將其轉(zhuǎn)為事務(wù)級(jí)激勵(lì)后送入?yún)⒖寄P?,參考模型?jì)算得到的參考結(jié)果(golden result)送入計(jì)分板,與從監(jiān)視器采集到的DUT 輸出進(jìn)行比較,從而判定DUT執(zhí)行結(jié)果的正確性。
圖2 BTM驗(yàn)證平臺(tái)結(jié)構(gòu)Fig.2 BTM verification platform structure
BTM 報(bào)文的編碼及解碼主要依據(jù)歐洲編碼規(guī)范,其實(shí)現(xiàn)較為復(fù)雜,測(cè)試采用的編碼后報(bào)文部分源于《應(yīng)答器傳輸系統(tǒng)測(cè)試規(guī)范》(TB/T 3544-2018),尤其針對(duì)特定錯(cuò)誤報(bào)文的輸入,需遵循嚴(yán)格的編碼規(guī)則,測(cè)試所需的異常報(bào)文均由規(guī)范中獲取。針對(duì)此類(lèi)情況,本測(cè)試對(duì)平臺(tái)進(jìn)行了優(yōu)化,取消參考模型的數(shù)據(jù)通路(如圖2 虛線(xiàn)箭頭所示),改由驅(qū)動(dòng)器直接將參考結(jié)果送入計(jì)分板(如圖2 空心箭頭所示)。
驗(yàn)證平臺(tái)的控制主要采用python 語(yǔ)言實(shí)現(xiàn),測(cè)試用例的所有參數(shù),含標(biāo)號(hào)、測(cè)試序列、頂層模塊指定、波形使能和覆蓋率使能等,均在表格中呈現(xiàn),使平臺(tái)的控制更為簡(jiǎn)單直觀。依托圖表工具集pandas,可方便實(shí)現(xiàn)對(duì)表格進(jìn)行讀取,生成所需的編譯命令和仿真命令。同時(shí)依據(jù)進(jìn)程池工具集multiprocessing,可在服務(wù)器資源允許的情況下實(shí)現(xiàn)對(duì)任意數(shù)量案例的并行仿真。
隨機(jī)激勵(lì)[4]主要采用報(bào)文編碼生成器,生成可譯碼的報(bào)文。由于產(chǎn)生的報(bào)文都是典型報(bào)文,其嚴(yán)格符合編碼規(guī)范,大規(guī)模隨機(jī)測(cè)試對(duì)功能覆蓋及代碼覆蓋影響較小[5]。對(duì)隨機(jī)仿真仍難以覆蓋的情況,可通過(guò)大量報(bào)文生成后再進(jìn)行軟件篩選的方式進(jìn)行實(shí)現(xiàn)。
報(bào)文編碼生成器主要采用C 語(yǔ)言實(shí)現(xiàn),可將830 bit 長(zhǎng)報(bào)文編碼為1 023 bit,或?qū)?10 bit 短報(bào)文編碼為341 bit。為保證編碼的完備性和正確性,生成器還內(nèi)置了譯碼模塊,對(duì)編碼后的長(zhǎng)短報(bào)文進(jìn)行譯碼并判定其正確性。SystemVerilog引入的直接編程接口(Direct Programming Interface,DPI),可方便進(jìn)行SystemVerilog 語(yǔ)言與C/C++語(yǔ)言間的相互調(diào)用。為方便實(shí)現(xiàn)各種報(bào)文的組合情況測(cè)試,本文沒(méi)有采用DPI 模式,而是將長(zhǎng)短報(bào)文分別進(jìn)行生成,組合后送入測(cè)試平臺(tái)。針對(duì)長(zhǎng)短報(bào)文編解碼長(zhǎng)度不一致情況,同時(shí)兼顧異常報(bào)文無(wú)法解碼的情況,將報(bào)文設(shè)計(jì)為“編碼+分隔符號(hào)+解碼/異常標(biāo)號(hào)”組合,并按字符串模式進(jìn)行讀取。在檢測(cè)到指定分隔符號(hào)后,將編碼報(bào)文送入驅(qū)動(dòng)器,將解碼報(bào)文送入計(jì)分板,驅(qū)動(dòng)器依據(jù)編碼報(bào)文字符串長(zhǎng)度選用對(duì)應(yīng)位寬變量進(jìn)行接收,計(jì)分板對(duì)正常解碼報(bào)文同樣按字符串長(zhǎng)度選用對(duì)應(yīng)位寬變量進(jìn)行接收,并進(jìn)行相應(yīng)比對(duì)。
定向測(cè)試[6]主要完成BTM 中特定場(chǎng)景的測(cè)試,如報(bào)文異常注入、自檢、Mailbox 通信、邊界溢出等情況。通過(guò)在定向用例中添加小規(guī)模隨機(jī)的情況,可實(shí)現(xiàn)覆蓋率的迅速提升。
定向常規(guī)報(bào)文測(cè)試主要針對(duì)選定的報(bào)文進(jìn)行測(cè)試。報(bào)文按其功能可劃分為正常長(zhǎng)報(bào)文、正常短報(bào)文、異常長(zhǎng)報(bào)文、異常短報(bào)文,不同類(lèi)型的報(bào)文編碼長(zhǎng)度和解碼長(zhǎng)度均不相同。為便于進(jìn)行混合測(cè)試,激勵(lì)序列中生成的報(bào)文同樣為字符串形式。驅(qū)動(dòng)器得到激勵(lì)序列后,將其進(jìn)行分割,編碼報(bào)文驅(qū)動(dòng)DUT,解碼后報(bào)文或異常標(biāo)號(hào)通過(guò)UVM 的config 機(jī)制直接送入計(jì)分板中。DUT 解碼后的報(bào)文或異常標(biāo)號(hào)與計(jì)分板中的參考結(jié)果進(jìn)行比對(duì),即可迅速對(duì)結(jié)果正確性進(jìn)行比對(duì),同時(shí)對(duì)錯(cuò)誤情況可實(shí)現(xiàn)迅速定位。
BTM 運(yùn)行過(guò)程中需進(jìn)行定期自檢,自檢含天線(xiàn)自檢和報(bào)文自檢兩大部分。對(duì)于天線(xiàn)自檢,其會(huì)占用報(bào)文輸入端口;對(duì)于報(bào)文自檢,其會(huì)占用CPU總線(xiàn)接口。為最大限度檢測(cè)自檢功能正確性,與實(shí)際相比,仿真中顯著縮短了自檢間隔。設(shè)計(jì)中引入uvm_event 方法,當(dāng)檢測(cè)到總線(xiàn)忙時(shí)則處于等待狀態(tài),直至總線(xiàn)空閑時(shí)占用總線(xiàn),讀取報(bào)文輸出結(jié)果或相應(yīng)地址空間,并在使用結(jié)束后釋放總線(xiàn),如此可方便解決接口調(diào)用時(shí)的沖突問(wèn)題。
針對(duì)譯碼過(guò)程中尋找報(bào)文頭模塊覆蓋率低的情況,采取將報(bào)文依次移位譯碼的方法,并依據(jù)仿真速度對(duì)用例進(jìn)行拆分。針對(duì)11 轉(zhuǎn)10 譯碼模塊覆蓋率低的情況,可生成大量隨機(jī)報(bào)文并篩選符合要求的情況,有效地減少仿真時(shí)間,提高仿真效率。
典型定向用例對(duì)行覆蓋率和分支覆蓋率的影響如圖3 所示,其中橫軸表示的定向用例為同類(lèi)型用例的整合??梢钥闯觯槍?duì)性的添加定向測(cè)試用例,可以實(shí)現(xiàn)代碼覆蓋率的快速提升,并迅速達(dá)到99%以上,針對(duì)未覆蓋情況,設(shè)計(jì)補(bǔ)充案例,即可實(shí)現(xiàn)代碼的全覆蓋。
圖3 典型定向用例對(duì)代碼覆蓋率的影響Fig.3 Impact of typical cases on code coverage
本次仿真在linux 平臺(tái)下進(jìn)行,采用VCS 仿真工具實(shí)現(xiàn)。使用隨機(jī)加定向的測(cè)試模式,可實(shí)現(xiàn)覆蓋率的快速收斂。在保證功能覆蓋完備性的前提下,本文共設(shè)計(jì)定向案例48 個(gè)(含為加速仿真而拆分的24個(gè)案例),即可實(shí)現(xiàn)指定的覆蓋率。經(jīng)設(shè)計(jì)人員確認(rèn),排除無(wú)效和冗余情況,指定的行和分支情況代碼可實(shí)現(xiàn)100%完全覆蓋,代碼覆蓋率如圖4 所示。
圖4 BTM代碼覆蓋率Fig.4 BTM code coverage
以BTM 解碼板作為驗(yàn)證對(duì)象,基于UVM 的驗(yàn)證平臺(tái),采用隨機(jī)驅(qū)動(dòng)加定向測(cè)試的組合模式,實(shí)現(xiàn)了對(duì)代碼功能的仿真測(cè)試。與傳統(tǒng)FPGA 驗(yàn)證模式相比,驗(yàn)證平臺(tái)可以實(shí)現(xiàn)不同功能的測(cè)試場(chǎng)景,并可實(shí)現(xiàn)組合情況的覆蓋,同時(shí)可對(duì)疑問(wèn)或錯(cuò)誤情況進(jìn)行快速定位。而自動(dòng)化的測(cè)試方法,可大大縮短前期測(cè)試與后期迭代的時(shí)間成本,從而保證驗(yàn)證周期和功能覆蓋的完備性。