于清華,高賽軍
(上海航天電子通訊設備研究所,上海 201109)
隨著信息量的飛速爆炸,FPGA(Field Programmable Gate Array,現場可編程門陣列)作為提升電子產品速度性能的重要手段,其應用層面越來越廣泛面,復雜程度日益提高,FPGA軟件的質量和魯棒性也越來越受到大家的重視,FPGA驗證尤其是功能仿真變得尤為重要。特別是航空航天產品,基于FPGA 的應用系統在運行過程中因異常情況發(fā)生導致FPGA功能錯誤,使得下行到地面的數據錯誤或者丟失,甚至導致單次試驗任務失敗[1],需要對系統重新上電復位。如果在地面測試或者仿真驗證過程中[2],針對各種正常和異常的測試場景進行全面測試,則會提前發(fā)現軟件缺陷,從而降低故障的發(fā)生概率。
隨著FPGA設計功能繁雜度增加,其門數和復雜度也日益增加,驗證難度越來越大,驗證充分性和驗證效率的提升是驗證的致命瓶頸,也是驗證設計的主攻方向[3]。傳統定向仿真驗證方法由于存在抽象層次低、效率低、驗證不充分、驗證平臺重用性差的缺點,難以滿足驗證的需求。面向對象的驗證方法學的產生,能夠很好解決傳統驗證方法的上述痛點,可解決大規(guī)模FPGA的驗證平臺重用性問題,有效的提升驗證效率和驗證完備性。
基于SV(System Verilog)的驗證方法學從VMM發(fā)展到OVM,最后進階到成為整個電子行業(yè)統一驗證標準通用驗證方法學[4]UVM(Universal Verification Methodology)[5]。該方法學由于采用了較佳的驗證框架實現覆蓋率驅動的驗證,并配有受約束的隨機驗證方法,可有效實現可重用仿真驗證環(huán)境,大大縮短了驗證時間,提高驗證效率。
本文以航天某衛(wèi)星型號遠程控制FPGA為驗證對象,采用UVM驗證方法學搭建一體化閉環(huán)仿真驗證平臺,采用動態(tài)數組方法實現了三級激勵數據包的嵌套,驗證遠程控制FPGA功能的正確性。
UVM有一套System Verilog的語法和語義定義的具備面向對象編程的類庫[6],使用者通過使用這些類庫創(chuàng)建包括驅動器、監(jiān)視器和記分板等可重用組件,從而提高驗證效率和質量[7]。此外,這些類庫還包括各種任務和函數,能夠完成驅動器的驅動與被測件(DUT-Device Under Test)通信功能,以及實現監(jiān)視器的監(jiān)測DUT輸入輸出接口功能等。最后,UVM還可通過phase、factory等高級機制和寄存器模型等功能,實現了驗證平臺的高安全性和可重用性[7]。
圖1是一個典型的UVM驗證平臺結構示意圖,由1個驗證環(huán)境env組成,1個env包括2個代理器Agent:In_Agent和Out_Agent,參考模型(reference model)和記分板(Scoreboard)[8]。In_Agent負責驅動和監(jiān)測總線,Out_Agent負責監(jiān)測DUT的響應。在In_Agent中,Sequencer負責產生[9]隨機測試隊列傳送給驅動器Driver。
圖1 UVM驗證平臺結構示意圖
圖1中,in_Agent包含3個組件Sequencer、driver和[10]Monitor,其主要功能是在序列發(fā)生器Sequencer調度下產生根據傳輸協議生成的隊列[11],再由根據約定時序由驅動其Driver驅動到DUT輸入端口上。同時,監(jiān)視器Monitor將產生的隊列發(fā)送至參考模型reference model[12]。參考模型通常根據需求模擬被測件的行為,產生期望結果并壓到期望堆棧中。out_Agent的Monitor[13]用于監(jiān)測DUT輸出,并將實測結果發(fā)送至記分板Scoreboard。Scoreboard在收到實測結果后,自動提取來自參考模型的數據堆棧中的期望結果和實測數據進行比較,自動化比對結果。
1)序列產生器(Sequencer):
主要自動產生受約束的[14]隨機化激勵數據。
2)驅動器(driver):
主要負責向Sequencer請求隊列,將隊列根據特定的傳輸協議和接口時序轉化為輸入信號發(fā)送到DUT的輸入端口。
3)監(jiān)控器(Monitor):
負責從驅動器driver輸出采集數據,傳送到參考模型并轉換成期望隊列發(fā)送給記分板(Scoreboard),從而完成功能數據結果的比對和覆蓋率信息的收集。
4)代理器(Agent):
通常用于發(fā)送端,可封裝序列產生器(Sequencer)、驅動器(Driver)、監(jiān)視器(Monitor)。
5)參考模型(reference model):
reference model用于完成和DUT相同的功能。reference model的輸出發(fā)送給Scoreboard,用于和DUT的輸出相比較。
6)記分板(Scoreboard):
比較reference model和Monitor采集到的DUT輸出信號,并給出比較結果。
7)驗證環(huán)境(env):
UVM驗證環(huán)境,使用UVM機制將代理器(Agent)、參考模型(reference model)和記分板(Scoreboard)配置在一起。
8)測試用例(test case):
test case用于例化env,不同的test case用于對DUT的不同功能進行驗證。
UVM是基于System Verilog語言開發(fā)的一套開源類庫,包括了一系列標準類,如uvm_sequence、uvm_driver、uvm_monitor、uvm_sequencer、uvm_agent、uvm_env等,通過對這些基本類進行繼承和重載,結合TLM標準接口和各種機制,可構造多層次可重用的高效驗證平臺。
1)factory機制:
factory機制是UVM非常重要的一個機制,采用UVM中的宏注冊實現factory機制。當某個類經過注冊并且實例化后,其main_phase會自動調用。使用factory機制可以在不改變原代碼的基礎上,調用UVM內部封裝的大量功能,實現驗證平臺組件的重用,提高整個驗證平臺的重用性。
2)phase機制:
UVM通過phase機制實現了驗證流程的細分,在不同的phase中實現相應的任務,或者在不同的phase之間進行跳轉,可以更加容易地控制驗證的進程,使得驗證平臺中各組件按照各自的需求自動階段性執(zhí)行。
按照是否需要消耗仿真時間,phase可以分成兩大類:function phase和task phase,function phase包括build_phase、connect_phase等,不會消耗仿真時間;task phase包括run_phase和main_phase等,通過任務實現,需要消耗仿真時間。整個驗證平臺按照phase的執(zhí)行順序,執(zhí)行完一個狀態(tài),自動跳轉到下一個狀態(tài)。build_phase完成UVM中各個類成員的實例化工作,connect_phase將UVM中各個功能組件實例化對象進行連接,run_phase則運行整個驗證平臺,按照事務生成器順序驅動整個平臺運行。
3)sequence機制:
sequence機制用來產生激勵,包括sequence和sequencer。sequence不屬于驗證平臺組件,但對于驗證平臺來說處于特殊位置,sequencer只有在sequence出現的情況下才有價值,sequence通過sequencer才能將它產生的sequence傳送到驅動器。
sequence指定了DUT需要的transaction類型數據,每一個sequence類都有一個body函數,啟動一個sequence時,body函數會自動執(zhí)行。實際使用時經常使用以下4個宏`uvm_do、`uvm_do_with、`uvm_do_pri、`uvm_do_pri_with來創(chuàng)建transaction的實例,同時對transaction進行約束和隨機,并把這些數據通過端口發(fā)送到sequencer。當sequencer同時檢測到driver和sequence的請求時,將sequence產生的transaction發(fā)送給driver。實際程序中通過default_sequence方式啟動sequence。
通常采用virtual sequence實現sequence之間的同步。使用virtual sequencer[15]來使用virtual sequence,virtual sequencer里面包含了指向其他sequencer的指針。
4)objection機制:
objection機制通過raise_objection和drop_objection對驗證平臺組件內部的phase進程進行控制,用于開啟和關閉驗證平臺。
5)TLM機制:
TLM(transaction level model)即事務級建模,是System C的一種通信標準。transaction是把具有某一特定功能的一組信息封裝在一起形成的一個類。UVM中內置了各種port,用于實現各組件之間transaction級別的通信。
6)config_db機制:
通過config_db機制,可以修改驗證平臺的參數,對接口和寄存器進行配置。UVM通過set和get函數實現這一過程。config_db機制可以在不同的層次對同一個參數進行配置。
7)field_automation機制:
field_automation機制是使用UVM中定義好的宏對transaction數據成員進行注冊,transaction可以直接調用UVM中特有的內部函數,如比較、復制、打印等。
在設計好驗證平臺之后,當定義好一個test case后,通過在命令行中添加+UVM_TESTNAME指令要啟動執(zhí)行的test_case。仿真器首先進入頂層模塊top,當執(zhí)行到run_test后,啟動UVM驗證平臺。驗證平臺首先根據+UVM_TESTNAME后的字符創(chuàng)建一個類的實例,然后自動執(zhí)行該實例的build_phase,創(chuàng)建env,當build_phase執(zhí)行完畢后,接下來自動執(zhí)行env中的build_phase,創(chuàng)建env中的驗證組件。如此循環(huán),自上而下執(zhí)行所有component中的build_phase,建立UVM樹。執(zhí)行完build_phase后,執(zhí)行connect_phase,之后再執(zhí)行main_phase等phase。當所有的phase執(zhí)行完畢后,結束仿真。
圖2 UVM驗證平臺工作流程圖
遠程控制產品是衛(wèi)星的重要組成部分,主要完成衛(wèi)星對地面上傳數據的處理、直接指令執(zhí)行和數據轉發(fā)。遠程控制FPGA是遠程控制產品的核心,其主要功能框圖如圖3所示。首先對輸入的遠程控制上行數據進行BCH解碼、解擾、CRC校驗,CRC校驗正確后將遠程控制上行數據中包含的傳送幀寫入SRAM緩存,然后再從SRAM讀出傳送幀進行傳送幀解析,當傳送幀中數據域為重要指令時,將傳送幀包含的內部指令數據指令碼和PROM預先存儲的指令碼表進行比對,比對正確后譯碼輸出相應的48條指令控制信號,傳送給外部的BM2711器件進行指令驅動輸出;當傳送幀中數據域為遠程數據包時,根據VCID值的不同,選擇將傳送幀中包含的遠程數據包通過異步串行接口或者兩線制通信接口進行轉發(fā)。
圖3 遠程控制FPGA功能框圖
輸入遠程控制上行數據幀格式示意圖如圖4所示,按照執(zhí)行終端和處理途徑分,可以分為遙控包和內部指令。
圖4 遠程控制FPGA輸入遠程控制上行數據幀格式圖
遠程控制FPGA是航天產品中的一種重要工作軟件,安全關鍵等級高,需要測試大量的測試用例,采用傳統的定向驗證方法耗時耗力,無法進行隨機指令組合,無法確保不同數據幀長均測試全面,故很[16]難保證測試的充分性。采用UVM高級驗證方法學搭建驗證平臺,能隨機產生符合幀協議的測試隊列,并自動比對測試結果,提高測試效率和[17]測試質量,有助于保證航天型號試驗任務的順利完成。
為了保證遠程控制FPGA驗證的完備性和高效性,在搭建驗證平臺前,需要制定驗證策略和計劃,確定平臺應該具有的基本要求和功能。
1)提取驗證功能點:
根據遠程控制FPGA需求規(guī)格說明,需要測試遠程控制48條指令執(zhí)行功能和4種遠程控制數據(直接指令、間接指令、直接注數和軟件數據)轉發(fā)功能。
2)設計驗證平臺架構:
根據遠程控制FPGA需求規(guī)格說明,DUT需要接受2種格式的輸入遠程控制上行數據,對應2種數據協議,將驗證環(huán)境ykzd_env劃分為2個Agent:遠程控制指令執(zhí)行代理器Agent和遠程控制數據轉發(fā)代理器Agent。
本文設計的遠程控制FPGA驗證平臺如圖5所示。ykzd_env與DUT之間采用虛擬接口ykzd_if進行數據通信。采用自底向上創(chuàng)建代理中的各組件。
圖5 遠程控制FPGA的UVM驗證平臺
ykzd_env主要由遠程控制數據包代理器主ykzd_master_agent和遠程控制指令代理器ykzd_zl_agent組成。如圖5所示,利用UVM機制,2個代理器分別封裝了相應的序列生成器sequencer、驅動器driver和監(jiān)控器monitor。驗證平臺各組件之間的通信以字節(jié)為單位,ykzd_if和DUT之間的引腳通信以bit為單位。
遠程控制數據包代理器的driver用于隨機不定時驅動遠程控制數據幀發(fā)送給DUT,同時利用ykzd_master_monitor監(jiān)控驅動隊列數據根據隊列數據的VCID將傳輸數據幀數據域提取出來,分別送各自的參考模型rs422_ref和lvds_ref生成期望動態(tài)數組堆棧傳輸給相應記分板rs422_scoreboard和lvds_scoreboard;遠程控制指令代理器ykzd_zl_agent用于隨機不定時驅動遠程控制指令幀發(fā)送給DUT,同時利用ykzd_zl_monitor監(jiān)控驅動隊列數據將傳輸指令幀數據域提取出來,傳輸給參考模型cmd_ref根據指令匹配生成期望動態(tài)數組堆棧傳輸給相應記分板cmd_scoreboard。3個接收monitor分別監(jiān)控DUT連接的接口模型產生的實測數據并分別送記分板進行比對,實現整個仿真驗證平臺的一體化閉環(huán)驗證。
3)測試激勵產生方案:
受約束的隨機激勵可以根據軟件功能需求設置輸入數據的約束范圍,實現正常情況測試和故障情況測試,本驗證平臺設置遠程控制數據包占空比為直接指令∶間接指令∶直接注數∶軟件數據=10∶5∶2∶1,驗證平臺的ykzd_master_sequencer序列發(fā)生器會自動調用數據包transasction按照隊列方式產生遠程控制數據包。遠程控制指令包數據值約束按照PROM與設置的48路指令數據和異常數據指令進行隨機分配,驗證平臺的ykzd_zl_sequencer序列發(fā)生器會自動調用指令包transasction按照隊列方式產生遠程控制指令。
4)結果檢查:
通過仿BM2711模塊用1 ms時鐘頻率分別對48路通道輸出的指令脈沖信號進行計數,并將通道號和計數器值組成結構作為實測結果傳輸給cmd_scoreboard,cmd_scoreboard會自動查詢期望動態(tài)數組,驗證指令通道是否匹配,根據計數值檢查是否滿足80 ms±10 ms指令脈沖寬度要求,并給出日志文件,從而驗證遠程控制指令執(zhí)行功能的正確性。
通過rs422_monitor監(jiān)控仿RS422_rec模塊產生的數據,形成實測動態(tài)數組發(fā)送給rs422_scoreboard進行和期望動態(tài)數組進行比對,并打印日志文件,從而驗證遠程控制數據轉發(fā)功能中通過異步串行接口轉發(fā)遠程控制數據功能的正確性;通過lvds_monitor監(jiān)控仿LVDS_rec模塊產生的數據,形成實測動態(tài)數組發(fā)送給lvds_scoreboard進行和期望動態(tài)數組進行比對,并打印日志文件,從而驗證遠程控制數據轉發(fā)功能中通過兩線制通信接口轉發(fā)遠程控制數據功能的正確性。
5)覆蓋率分析:
仿真驗證覆蓋率包括代碼覆蓋率和功能覆蓋率。代碼覆蓋率統計的是仿真過程中程序代碼語句、分支和狀態(tài)機的執(zhí)行情況,但是不能從功能點的角度考核設計功能的測試覆蓋情況。功能覆蓋率是針對功能點的通過比率進行覆蓋率統計。本驗證平臺不僅驗證代碼覆蓋率,還可以通過收集VCID、數據包長度確定遠程控制數據轉發(fā)功能覆蓋率100%,通過收集通道指令號確定48路指令和異常指令覆蓋和擊中情況,從而確定遠程控制指令執(zhí)行功能覆蓋率100%。
1)設計ykzd_if:
設計虛擬接口模塊ykzd_if三線制輸入接口KP_CLK1、LOCK_A、KP_DATA1,用于實現驗證平臺與DUT之間的數據通信。
2)設計隊列:
由于要接受2種格式的遠程控制上行數據,為了避免相互干擾,方便設計,本文設計了2種隊列:ykzd_隊列_zl和ykzd_隊列。ykzd_隊列_zl為遠程控制指令執(zhí)行Agent中的事務級數據包,ykzd_隊列為遠程控制數據轉發(fā)Agent中的事務級數據包。
根據功能需求,對2種隊列的數據成員變量采用constraint進行約束設置。采用field 機制對2種隊列進行宏注冊,設計BCH編碼函數、加擾函數和CRC校驗函數。
3)創(chuàng)建Sequencer:
按照UVM機制創(chuàng)建的sequencer命名為ykzd_zl_master_sequencer和ykzd_master_sequencer。
4)創(chuàng)建驅動器driver:
繼承自uvm_driver,將ykzd_transaction_zl轉換為信號級,并按照三線制接口時序驅動到DUT輸入接口上。創(chuàng)建的driver命名為ykzd_zl_master_driver和ykzd_master_driver。通過虛擬接口ykzd_if連接DUT
5)創(chuàng)建監(jiān)測器monitor:
發(fā)送端monitor用于通過虛擬接口ykzd_if收集DUT端口數據,并把端口數據轉換為事務級數據。創(chuàng)建的發(fā)送端monitor命名為ykzd_zl_master_monitor(收集指令號)和ykzd_master_monitor(收集數據幀長度和VCID)。創(chuàng)建的接收端monitor命名為RS422_monitor(根據串口協議接收轉發(fā)串口數據)、LVDS_monitor(在時鐘上升沿接收數據,找到幀頭并打包成數組)、BW2711_monitor(對各通道脈沖寬度用1 ms時鐘進行計數)。
6)創(chuàng)建代理器agent:
為了區(qū)分調用不同的transaction,不同的agent代表不同的協議。創(chuàng)建的agent命名為ykzd_zl_master_ agent和ykzd_master_ agent。
7)創(chuàng)建參考模型reference model:
M_rs422_ref參考模型對ykzd_master_monitor監(jiān)控產生的需要轉發(fā)的直接指令和間接指令進行參考模型設計用產生給期望結果;M_lvds_ref參考模型對ykzd_master_monitor監(jiān)控產生的需要轉發(fā)的直接注數和軟件數據進行參考模型設計用產生期望結果;Zl_cmd_ref參考模型對ykzd_zl_monitor監(jiān)控產生的重要指令進行參考模型設計得到期望的通道號序列。
8)創(chuàng)建記分板scoreboard:
RS422_scoreboard記分板對期望產生的直接指令和間接指令結果與實測結果進行一致性比對,正確打印correct,錯誤打印error、期望正確數據和實測錯誤數據;LVDS_ scoreboard記分板期望產生的直接注數和軟件數據與實測結果進行一致性比對,同理會自動打印正確和錯誤結果;cmd_ scoreboard記分板對期望產生指令序列號和實測指令序列號進行比對,匹配一致則打印正確,否則給出丟失的指令號,同時當脈沖指令寬度不滿足80 ms±10 ms時報錯。
9)創(chuàng)建驗證環(huán)境env:
根據UVM機制env是驗證平臺組件的頂層,包含了驗證平臺的所有驗證組件。本驗證平臺創(chuàng)建的env命名為ykzd_ env,包含了代理器(ykzd_zl_master_ agent、ykzd_master_ agent)、參考模型(M_rs422_ref、M_lvds_ref、Zl_cmd_ref)、監(jiān)視器(RS422_monitor、LVDS_monitor、BW2711_monitor)、記分板(RS422_scoreboard、LVDS_ scoreboard、cmd_ scoreboard)。
10)創(chuàng)建虛擬激勵產生器virtual sequencer:
創(chuàng)建了virtual sequencer,命名為my_vsqr0, my_vsqr0包含了指向ykzd_zl_master_sequencer和ykzd_master_sequencer的指針。在基本類ykzd_base_case中,實例化my_vsqr0,將相應的sequencer賦值給my_vsqr0中各sequencer的指針。
11)仿SRAM模型:
模擬SRAM根據輸入的sram_addr[18:0]、sram_data[7:0]、sram_cs、sram_we和sram_oe按照SRAM芯片手冊的時序要求,將數據sram_data[7:0]存儲在存儲區(qū)中或者將sram_data[7:0]反饋輸出給DUT,同時根據DUT設計SRAM控制時序進行時序參數自動檢測。
12)仿PROM模型:
模擬PROM存儲指令碼表,根據輸入的sram_addr[11:0]、rom_ce、rom_oe按照PROM芯片手冊的時序要求,輸出 sram_data[7:0] 給DUT,同時根據DUT設計PROM控制時序進行時序參數自動檢測。
13)創(chuàng)建測試用例test case:
測試用例命名為ykzd_case,繼承于基本類ykzd_base_case,而ykzd_base_case繼承于uvm_test,包含了虛擬激勵產生器my_vsqr0。
14)頂層設計:
頂層為top_tb,定義了虛擬接口ykzd_if,連接DUT和驗證平臺;例化了DUT和SRAM、PROM、RS422_rev、LVDS_rev、BW2711模型,提供系統輸入時鐘和上電復位信號。
該平臺設計了多個sequence,組成sequence的集合sequence_lib,設計了多個測試用例ykzd_case,每個測試用例ykzd_case對應1個sequence,分別單獨測試遠程控制指令執(zhí)行功能、遠程控制數據轉發(fā)功能以及幀頭錯誤、幀尾錯誤、CRC校驗錯誤、BCH編碼錯誤等異常情況。
將多個sequence用virtual sequence進行統一管理,將virtual sequence作為某個測試用例ykzd_case的default_sequence,對遠程控制指令執(zhí)行功能、遠程控制數據轉發(fā)功能的正常情況、異常情況進行組合測試。通過RS422_rev模型和LVDS_rev模型接收數據,并通過監(jiān)控模塊和參考模型輸出在對應記分板中進行對比,檢查遠程控制數據轉發(fā)功能的正確性;通過BM2711模型接收指令,除了通過觀察波形檢查遠程控制指令執(zhí)行情況,更通過BM2711模型檢測脈沖寬度,通過監(jiān)控模型和參考模型通道號序列在記分板中進行對比,檢查遠程控制指令執(zhí)行功能的正確性和脈沖寬度的正確性,實現閉環(huán)的一體化仿真驗證平臺。
文中設計的仿真驗證平臺可通用于Modelsim、Rivera、VCS和NC-sim等主流支持UVM的仿真工具,圖6是用VCS仿真器進行仿真的DUT接口仿真波形結果圖。從仿真波形圖看出,驗證平臺產生的激勵數據如遠程控制轉發(fā)數據、遠程控制指令數據通過DUT的三線制輸入接口KP_CLK1、LOCK_A、KP_DATA1先后輸入給DUT,在輸出端口上可看到相應的輸出波形如兩線制轉發(fā)的LVDS遠程控制數據和48路指令控制信號輸出,說明功能正常執(zhí)行。
圖6 遠程控制FPGA組合測試仿真波形圖
UVM驗證方法學吸收了當前許多[15]驗證方法學的優(yōu)點,本文搭建了基于UVM的遠程控制FPGA驗證平臺,實現了驗證平臺的各個組件。該驗證平臺結構層次分明、便于擴展和管理,具有受約束的隨機驗證和輸出結果自動檢查功能,有效的提高了驗證的效率,確保了驗證功能的正確性和魯棒性。該驗證平臺具有驗證效率高、完備性好、自動化程度高、通用性強、可擴展性強的優(yōu)點,可以被其他驗證項目所重用。