謝樹平,毛源豪
(湖南艾科諾維科技有限公司,長沙 410000)
現(xiàn)場可編程邏輯門陣列(FPGA,field programmable gate array)是一種半定制芯片,因其獨(dú)特的電路可編程特性區(qū)別于其他器件。隨著近年FPGA芯片的快速發(fā)展,其內(nèi)部的資源數(shù)量與豐富度顯著提升[1]。FPGA在通信、圖像處理[2]、深度學(xué)習(xí)[3]、人工智能[4]與數(shù)據(jù)中心[5]等領(lǐng)域發(fā)揮著重要的作用。雙倍數(shù)據(jù)傳輸速率同步動態(tài)隨機(jī)存儲器(DDR SDRAM,double data rate synchronous dynamic random access memory)是FPGA板卡中最常用的高速緩存解決方案。DDR SDRAM的工作情況直接影響到整個設(shè)備能否正常運(yùn)作,所以DDR SDRAM測試也是FPGA板卡測試中最重要的測試項(xiàng)目之一。此前對DDR SDRAM的測試主要通過DDR SDRAM控制器的調(diào)試端口進(jìn)行。然而這種測試方案存在操作人員學(xué)習(xí)門檻高、測試流程不靈活、無法自動生成測試報告等缺點(diǎn)。操作人員在測試前需要充分了解調(diào)試端口中約200個信號的定義、各控制信號間的邏輯關(guān)系以及操作DDR SDRAM的相關(guān)知識。此類方案在生成比特流后測試內(nèi)容相對固定,可在線配置的測試參數(shù)有限,無法設(shè)置測試隊(duì)列并自動完成。且沒有生成測試報告的功能,相關(guān)數(shù)據(jù)需要操作人員手動記錄。降低了工作效率,增加了出錯風(fēng)險。
在FPGA與DDR SDRAM的數(shù)據(jù)交互設(shè)計(jì)中,設(shè)計(jì)者通常使用FPGA廠家提供的DDR SDRAM控制器。比如Xilinx公司為旗下的FPGA提供了成熟的存儲器接口生成器(MIG,memory interface generator)。MIG內(nèi)包含控制器和物理層,設(shè)計(jì)者可以通過用戶接口或先進(jìn)可擴(kuò)展接口(AXI,advanced eXtensible interface)訪問DDR SDRAM。文獻(xiàn)[6]提出了一種基于MIG用戶接口的應(yīng)用,在MIG用戶接口的基礎(chǔ)上設(shè)計(jì)了先入先出(FIFO,first in first out)接口,使其既擁有FIFO緩存簡單易用的特點(diǎn),又有DDR SDRAM存儲空間大的優(yōu)勢。文獻(xiàn)[7]在數(shù)據(jù)FIFO接口的基礎(chǔ)上增設(shè)了一個命令/地址FIFO,實(shí)現(xiàn)了隨機(jī)讀寫功能。
在DDR SDRAM控制器的測試技術(shù)中,通常使用的方案是向DDR SDRAM寫入特定的pattern,然后讀取數(shù)據(jù)并校驗(yàn)數(shù)據(jù)一致性。文獻(xiàn)[8]提出了一種包含內(nèi)部自測(BIST,built-in self-test)模塊的DDR SDRAM控制器。該模塊將來自隨機(jī)數(shù)發(fā)生器的數(shù)據(jù)寫入DDR SDRAM中,并將讀出的數(shù)據(jù)與寫入的數(shù)據(jù)在數(shù)據(jù)比較器中進(jìn)行對比,從而實(shí)現(xiàn)自監(jiān)測的功能。文獻(xiàn)[9]提出了一種基于在線邏輯分析儀(ILA,integrated logic analyzer)知識產(chǎn)權(quán)(IP,intellectual property)核驗(yàn)證DDR SDRAM控制器的方法。使用AXI Trafficgen IP核產(chǎn)生AXI總線的讀寫事務(wù),并用ILA抓取AXI總線上的信號,分析其時序與數(shù)據(jù)正確性。
實(shí)際應(yīng)用中,通常使用標(biāo)準(zhǔn)JTAG接口實(shí)現(xiàn)PC上位機(jī)與FPGA之間的通信。文獻(xiàn)[10]設(shè)計(jì)了一種基于FPGA的DDR SDRAM通用測試電路。該設(shè)計(jì)使用JTAG接口啟動測試電路,電路自動完成整個測試過程并將測試結(jié)果從JTAG接口傳回PC上位機(jī)。文獻(xiàn)[11]提出了一種使用工具命令語言(TCL,tool command language)腳本語言測試數(shù)字電路的方法。該方法通過在Vivado軟件中執(zhí)行TCL腳本實(shí)現(xiàn)自動對調(diào)試核虛擬輸入輸出(VIO,virtual input output)的修改與讀取,從而達(dá)成高效率的測試。文獻(xiàn)[12]提出了一種基于LabVIEW軟件調(diào)用TCL腳本的測試方法,將Vivado軟件的啟動與執(zhí)行TCL腳本的命令封裝為批處理文件,實(shí)現(xiàn)了自動化測試與生成報表。文獻(xiàn)[13]提出了一種FPGA的AXI總線接口調(diào)試方法,通過使用JTAG to AXI IP核,允許用戶通過執(zhí)行TCL腳本來對AXI總線上的從設(shè)備進(jìn)行訪問。
為了解決當(dāng)前FPGA板卡中DDR SDRAM測試工作復(fù)雜及效率低下的問題,本設(shè)計(jì)做了如下工作:
1)設(shè)計(jì)了DDR SDRAM控制器的測試器IP核MIG Tester。該IP核具有生成讀寫事務(wù)、校驗(yàn)數(shù)據(jù)、記錄數(shù)據(jù)讀寫用時等功能。同時MIG Tester支持對數(shù)據(jù)位寬、pattern類型、起始地址、測試地址范圍、突發(fā)長度等參數(shù)的在線配置,具有高度的靈活性。
2)設(shè)計(jì)了TCL腳本。用于控制VIO、ILA、JTAG to AXI 等IP核,從而實(shí)現(xiàn)對整個測試流程的控制以及測試結(jié)果信息的讀取。
3)設(shè)計(jì)了上位機(jī)圖形界面程序。將測試流程中各個階段需要執(zhí)行的TCL腳本封裝。通過文本框打印測試信息,同時自動生成測試報告,便于操作人員使用。
測試平臺架構(gòu)主要由兩個部分構(gòu)成:FPGA板卡與PC上位機(jī)。FPGA板卡內(nèi)包含F(xiàn)PGA與DDR SDRAM,二者通過板卡上的DDR SDRAM接口相連接。PC上位機(jī)與FPGA通過JTAG接口實(shí)現(xiàn)通訊。用戶在PC上位機(jī)操作圖形界面程序,完成測試流程與輸出測試結(jié)果[14-15]。所述架構(gòu)如圖1所示。
圖1 測試平臺架構(gòu)框圖
DDR SDRAM是待測的目標(biāo)器件,由FPGA中的MIG控制。在對DDR SDRAM的測試中,重點(diǎn)關(guān)注的是DDR SDRAM的讀寫正確性與帶寬兩項(xiàng)性能[16]。
FPGA與DDR SDRAM通過DDR SDRAM接口相連接,F(xiàn)PGA內(nèi)例化的MIG控制DDR SDRAM的初始化與數(shù)據(jù)讀寫。MIG Tester可以通過MIG的AXI slave接口對DDR SDRAM進(jìn)行數(shù)據(jù)讀寫。MIG Tester的功能是測試讀寫正確性與帶寬。MIG Tester有兩個主要接口:一個是AXI slave接口,作為控制接口與JTAG to AXI相連,TCL腳本控制JTAG to AXI來與MIG Tester進(jìn)行通信,控制測試流程與讀回測試結(jié)果;另一個是AXI master接口,作為數(shù)據(jù)讀寫接口與MIG相連,測試過程中對MIG的數(shù)據(jù)傳輸均由此接口實(shí)現(xiàn)。此外MIG Tester還有一個塊隨機(jī)存取存儲器(BRAM,block random access memory)主接口,用于向BRAM寫入錯誤數(shù)據(jù)對應(yīng)的地址信息,便于后續(xù)對錯誤數(shù)據(jù)的溯源分析。FPGA內(nèi)例化的VIO、JTAG to AXI和ILA調(diào)試核互相配合下起到控制MIG初始化、控制MIG Tester、抓取AXI總線信號的作用,這些調(diào)試核均受PC上位機(jī)控制[17-18]。
PC上位機(jī)通過JTAG接口與FPGA進(jìn)行通信。通過在PC上位機(jī)的VivadoTcl Shell程序中執(zhí)行TCL腳本,可以對FPGA中調(diào)試核的信息讀取與控制。圖形界面程序?qū)ivadoTcl Shell作為子進(jìn)程運(yùn)行,并將測試相關(guān)的TCL腳本封裝為對應(yīng)的按鈕。操作人員可以通過圖形界面程序便捷地控制整個測試流程,提高了測試效率,降低了學(xué)習(xí)門檻[19-20]。
測試板卡使用的FPGA產(chǎn)自Xilinx公司,型號為xc7k325tffg900-2,使用的DDR SDRAM型號為MT8JTF2-5664HZ-1G6M1。
工程主要包含JTAG to AXI、MIG Tester、AXI Smart-Connect、MIG、AXI Bram Controller等IP。模塊之間主要通過AXI總線進(jìn)行連接,所有AXI總線通過AXI SmartConnect互聯(lián)IP連接在一起。地址空間分配中,MIG基地址被設(shè)為0x80000000,可被MIG Tester和JTAG to AXI訪問。MIG Tester基地址設(shè)為0x44A00000,AXI BRAM Controller基地址設(shè)為0x00000000,兩者都只能被JTAG to AXI訪問。BRAM的類型為真雙口BRAM,其中一個接口受AXI BRAM Controller控制,另一個接口供MIG Tester的BRAM主接口寫入數(shù)據(jù)[21-22]。
MIG是由Xilinx官方提供的存儲器接口成熟的解決方案,是可靠的DDR SDRAM控制器。MIG由一個控制器與DDR物理層接口組成。MIG將復(fù)雜的DDR物理接口封裝為被廣泛使用的AXI接口,簡化了用戶的設(shè)計(jì)。在FPGA工程設(shè)計(jì)中,MIG的AXI slave接口與MIG Tester的AXI master接口相連接,在測試過程中完成數(shù)據(jù)傳輸。MIG的復(fù)位信號控制著MIG初始化的開始,由VIO驅(qū)動。MIG的初始化完成信號是高電平時表示MIG完成了初始化,由VIO監(jiān)聽。
根據(jù)DDR SDRAM型號與具體電路,對MIG進(jìn)行了如下配置:使能AXI接口,并設(shè)置數(shù)據(jù)位寬為512,以適配MIG Tester的AXI主接口;工作時鐘頻率設(shè)為800 MHz,參考時鐘輸入設(shè)為200 MHz,以適配板卡上的參考時鐘晶振。
MIG Tester是自主設(shè)計(jì)的MIG專用測試IP核,主要包含以下模塊:AXI slave接口、控制器、寫數(shù)據(jù)生成器、AXI master接口、數(shù)據(jù)校驗(yàn)器、預(yù)期數(shù)據(jù)生成器、錯誤計(jì)數(shù)器、計(jì)時器與BRAM主接口。MIG Tester的框架如圖2所示。
圖2 MIG Tester框架圖
AXI slave接口是控制接口,通過AXI slave接口可以讀寫控制器中寄存器的值,各寄存器與地址的映射關(guān)系與詳細(xì)描述如表1所示。
表1 AXI slave接口寄存器地址映射關(guān)系
AXI slave接口的寄存器位寬均為32位。其中偏移為0x0~0x18的寄存器是可讀可寫的,主要包括可配置的測試參數(shù)與測試控制。偏移為0x20~0x34的寄存器是只讀的,主要包括測試結(jié)果以及固定測試參數(shù)。
寫數(shù)據(jù)生成器在控制器的控制下,生成所設(shè)地址范圍與所設(shè)pattern的寫數(shù)據(jù)事務(wù)。DDR SDRAM測試的地址范圍由測試起始地址、讀寫突發(fā)長度、單次測試突發(fā)數(shù)量與MIG數(shù)據(jù)位寬4個參數(shù)共同確定。公式如下:
(1)
Ahigh=Abase+Stest
(2)
式中,Stest是測試地址范圍大小,Ahigh是測試終止地址,Abast是測試起始地址,Wdata是數(shù)據(jù)位寬,Lburst是突發(fā)長度,Nburst是突發(fā)數(shù)量。測試中寫入DDR SDRAM的數(shù)據(jù)默認(rèn)是8bit長的遞增數(shù)pattern,當(dāng)固定pattern開關(guān)被使能后,DDR SDRAM寫入的pattern將和0x18地址寄存器內(nèi)的數(shù)據(jù)保持一致。
AXI master接口是數(shù)據(jù)傳輸接口,與MIG的AXI slave接口相連接。寫數(shù)據(jù)生成器生成的寫數(shù)據(jù)事務(wù)和數(shù)據(jù)校驗(yàn)器生成的讀數(shù)據(jù)事務(wù)均由此接口完成具體的數(shù)據(jù)傳輸。
數(shù)據(jù)校驗(yàn)器用于校驗(yàn)讀回的數(shù)據(jù)與預(yù)期數(shù)據(jù)的一致性。當(dāng)兩者數(shù)據(jù)不相符時,錯誤標(biāo)志信號error_flag置“1”,使錯誤計(jì)數(shù)器計(jì)數(shù)加一,并將錯誤數(shù)據(jù)對應(yīng)的地址寫入BRAM。
錯誤計(jì)數(shù)器接收數(shù)據(jù)校驗(yàn)器的錯誤標(biāo)志信號進(jìn)行計(jì)數(shù)。在完成測試后把錯誤計(jì)數(shù)寫入ErrorNumber寄存器。每次開始測試時錯誤計(jì)數(shù)器清零。
計(jì)時器用于計(jì)算AXI總線讀寫數(shù)據(jù)所用時鐘周期。在完成測試過程后計(jì)時器會將讀寫數(shù)據(jù)用時分別寫入ReadCycle寄存器與WriteCycle寄存器。根據(jù)這兩項(xiàng)測試結(jié)果以及計(jì)時時鐘頻率得出讀寫數(shù)據(jù)用時以及平均帶寬。公式如下:
(3)
(4)
式中,Twrite是寫數(shù)據(jù)實(shí)際所用時長,Cwrite是從寄存器中讀取的寫數(shù)據(jù)所用時鐘周期數(shù),F(xiàn)timer是計(jì)時器頻率,Bwrite是寫數(shù)據(jù)平均帶寬。讀數(shù)據(jù)所用時間和平均帶寬的計(jì)算方式類似,不再贅述。
圖3為MIG Tester控制器的狀態(tài)機(jī)示意圖。當(dāng)TestControl寄存器的啟動位被寫入“1”時,處于空閑狀態(tài)下的控制器進(jìn)入寫數(shù)據(jù)狀態(tài)。AXI master接口開始對指定地址范圍寫入所設(shè)pattern。在完成指定地址范圍的數(shù)據(jù)寫入后,控制器進(jìn)入讀數(shù)據(jù)與數(shù)據(jù)校驗(yàn)狀態(tài)。AXI master接口讀取指定地址范圍的數(shù)據(jù)并校驗(yàn)。在完成指定范圍數(shù)據(jù)的讀取與比較后,進(jìn)入測試完成狀態(tài),測試結(jié)果被寫入AXI slave接口的測試結(jié)果寄存器中,同時完成中斷信號置“1”。測試結(jié)果寫入完成后,控制器回到空閑狀態(tài)。
圖3 控制器狀態(tài)機(jī)
Block Memory Generator可以使用FPGA內(nèi)的BRAM資源生成性能優(yōu)秀的存儲器,這類存儲器一般就被稱為BRAM。在設(shè)計(jì)中BRAM被設(shè)置為真雙口模式,用于存儲讀寫校驗(yàn)發(fā)生錯誤的錯誤數(shù)據(jù)對應(yīng)的地址信息。
AXI BRAM Controller提供了可供訪問本地BRAM的AXI slave接口,支持突發(fā)事務(wù),性能優(yōu)秀。在設(shè)計(jì)中AXI BRAM Controller控制真雙口BRAM的其中一個端口。JTAG to AXI可以通過此IP讀取BRAM中的數(shù)據(jù)。
VIO用于在線監(jiān)測或驅(qū)動FPGA內(nèi)部的信號。本設(shè)計(jì)中主要使用VIO驅(qū)動MIG的復(fù)位信號,以及監(jiān)測MIG的初始化完成信號。VIO由PC上位機(jī)通過JTAG接口控制。
AXI to JTAG用于生成AXI接口事務(wù)。本設(shè)計(jì)中主要使用AXI to JTAG控制MIG Tester,并讀回測試結(jié)果。AXI to JTAG由PC上位機(jī)通過JTAG接口控制。
ILA用于捕獲FPGA內(nèi)部信號。本設(shè)計(jì)中主要使用ILA捕獲讀寫數(shù)據(jù)校驗(yàn)錯誤時MIG的AXI接口的數(shù)據(jù),并通過TCL命令將數(shù)據(jù)保存至PC上位機(jī)。ILA由PC上位機(jī)通過JTAG接口控制。
AXI SmartConnect是由Xilinx官方提供的AXI總線互聯(lián)IP,可以將一個或多個AXI內(nèi)存映射主設(shè)備連接到一個或多個AXI內(nèi)存映射從設(shè)備。本設(shè)計(jì)中主要使用AXI SmartConnect將各AXI設(shè)備互聯(lián)。
PC上位機(jī)軟件的設(shè)計(jì)主要包括TCL腳本設(shè)計(jì)與圖形界面程序設(shè)計(jì)兩個部分。
TCL作為一門具有簡明高效、便于移植的腳本語言,應(yīng)用于眾多EDA軟件。Vivado軟件在TCL語言的基礎(chǔ)上增添了許多命令,以幫助開發(fā)者提高生產(chǎn)力。在本設(shè)計(jì)中,通過TCL腳本編程控制FPGA中的3個調(diào)試IP,配合完成初始化測試與讀寫測試兩種測試功能。
3.1.1 VIO控制腳本
通過在Vivado軟件中執(zhí)行TCL腳本,PC上位機(jī)可以控制VIO的驅(qū)動值或讀取VIO探針的電平。需要修改VIO輸出探針驅(qū)動值時,使用set_property命令修改對應(yīng)探針的OUTPUT_VALUE值,之后使用commit_hw_vio命令執(zhí)行驅(qū)動值的修改。需要讀取VIO輸入探針電平時,使用refresh_hw_vio命令刷新VIO輸入探針的電平,然后使用get_property命令獲取對應(yīng)探針的INPUT_VALUE數(shù)值。
3.1.2 AXI to JTAG控制腳本
PC上位機(jī)可以通過執(zhí)行TCL腳本來控制AXI to JTAG發(fā)起AXI總線讀寫事務(wù),從而訪問目標(biāo)設(shè)備。當(dāng)需要對AXI設(shè)備進(jìn)行讀操作時,使用create_hw_axi_txn命令創(chuàng)建讀數(shù)據(jù)事務(wù),執(zhí)行run_hw_axi命令運(yùn)行該事務(wù)。隨后使用report_hw_axi_txn命令報告讀取數(shù)據(jù)。在完成傳輸數(shù)據(jù)事務(wù)后,使用delete_hw_axi_txn命令刪除該事務(wù)。寫AXI設(shè)備數(shù)據(jù)的過程與讀數(shù)據(jù)過程類似,區(qū)別在于生成寫事務(wù)時需要指定事務(wù)類型為寫,并增加一個寫入數(shù)據(jù)作為參數(shù)。
3.1.3 ILA控制腳本
TCL腳本可以控制ILA執(zhí)行信號抓取任務(wù),并將抓取的數(shù)據(jù)展示或保存下來。需要通過ILA抓取特定信號時,首先使用set_property命令修改需要抓取的信號以及觸發(fā)方式,然后使用run_hw_ila命令開始執(zhí)行抓取信號。抓取到信號后,使用upload_hw_ila_data命令更新數(shù)據(jù),并用write_hw_ila_data命令將抓取到的信號數(shù)據(jù)保存為ila文件和csv文件,便于后續(xù)進(jìn)行分析。
3.1.4 初始化測試腳本
初始化測試的原理是,對MIG重復(fù)進(jìn)行復(fù)位與初始化,記錄該過程中MIG是否能在限定時間內(nèi)完成初始化。
TCL腳本編程的DDR SDRAM初始化測試流程如圖4所示。在開始DDR SDRAM初始化測試后,首先控制VIO驅(qū)動MIG復(fù)位信號mig_rst_n為0,以確保MIG處于復(fù)位狀態(tài)。之后控制VIO驅(qū)動MIG復(fù)位信號mig_rst_n為1,MIG開始一次初始化過程。之后VIO監(jiān)測的init_complete信號的值,如果在指定時間內(nèi)檢測到高電平,則視為初始化成功,反之則視為初始化失敗。完成測試結(jié)果記錄后,判斷已測試次數(shù)是否已達(dá)到指定的測試次數(shù),如果已滿足則輸出測試結(jié)果,反之則返回第一步繼續(xù)進(jìn)行測試。
3.1.5 讀寫測試腳本
讀寫測試的原理是,將測試參數(shù)寫入MIG Tester,控制MIG Tester開始讀寫測試,并將每次測試結(jié)果進(jìn)行記錄與統(tǒng)計(jì)。
TCL腳本控制的讀寫測試流程如圖5所示。首先控制JTAG to AXI向MIG Tester寫入讀寫測試的起止地址、寫操作的pattern與讀寫的突發(fā)數(shù)等測試參數(shù)。隨后設(shè)置ILA的觸發(fā)信號為錯誤標(biāo)志信號error_flag信號的高電平。寫TestControl寄存器啟動MIG Tester。通過VIO監(jiān)控測試完成信號intr_done直到它變?yōu)楦唠娖?。至此一次測試完成,由JTAG to AXI讀出測試結(jié)果并保存。隨后判斷測試次數(shù)是否以達(dá)到目標(biāo),若已達(dá)到則統(tǒng)計(jì)所有測試結(jié)果并輸出,反之則再次啟動測試。
圖5 讀寫測試流程圖
圖形界面程序在PyQt5框架下進(jìn)行開發(fā)。PyQt5衍生自C++的QT庫,具有能夠跨平臺兼容多種環(huán)境,功能強(qiáng)大,開源免費(fèi)等優(yōu)勢。圖形界面程序通過創(chuàng)建子進(jìn)程的方式運(yùn)行命令行程序,并在命令行程序中打開TCL模式的Vivado。點(diǎn)擊程序中的功能按鈕即可執(zhí)行對應(yīng)的Vivado指令或者TCL腳本。圖形界面程序的界面如圖6所示,主要功能包括:
圖6 應(yīng)用程序界面
1)人機(jī)交互:操作人員可以根據(jù)測試需求,在圖形界面程序中調(diào)整測試參數(shù)、執(zhí)行測試任務(wù)和讀取測試信息。
2)器件控制:程序可以通過JTAG接口完成連接FPGA器件、狀態(tài)檢測、下載比特流、控制調(diào)試核等操作。
3)統(tǒng)計(jì)結(jié)果:程序自動重復(fù)并統(tǒng)計(jì)測試結(jié)果,在測試循環(huán)完成后輸出測試統(tǒng)計(jì)報告并保存為日志文件。
程序界面主要分為4個區(qū)域。區(qū)域1主要包括連接器件以及下載比特流文件功能。區(qū)域2包括初始化測試的參數(shù)設(shè)置與執(zhí)行。區(qū)域3包括讀寫測試的參數(shù)設(shè)置與執(zhí)行。區(qū)域4是一個文本框,輸出文本信息。
首先需要在區(qū)域1中完成器件的連接與比特流文件的下載。程序啟動后將自動運(yùn)行Vivado子進(jìn)程,并在文本框處提示“Vivado啟動中”。待Vivado啟動完成,文本框處打印“啟動完成”信息,“連接器件”按鈕變?yōu)榭捎?。點(diǎn)擊“連接器件”,Vivado進(jìn)程將打開硬件管理器,并嘗試連接FPGA器件。如果未檢測到FPGA器件,則打印“連接失敗”信息,如果檢測到FPGA器件,則在“當(dāng)前器件”標(biāo)簽處顯示檢測到的器件型號、連接狀態(tài)與編程狀態(tài)?!捌骷吞枴毕吕x項(xiàng)和“比特流選擇”下拉選項(xiàng)會自動篩選出符合當(dāng)前器件的選項(xiàng)。用戶需要在這一步自行選擇適用的比特流文件并點(diǎn)擊“下載比特流”按鈕。等待文本框提示“比特流下載完成”,即可在區(qū)域2或區(qū)域3中執(zhí)行后續(xù)測試。
區(qū)域2中,初始化時間限制即是TCL腳本中判定初始化是否成功的界限,初始化測試次數(shù)是本次執(zhí)行初始化測試的總測試數(shù)。執(zhí)行測試后,測試結(jié)果打印在文本框中,并在完成一輪測試后生成日志文件。日志文件內(nèi)容如圖7所示,日志內(nèi)容包括:測試日期、測試項(xiàng)目名、測試序號、初始化測試結(jié)果以及完成本輪次的測試后的統(tǒng)計(jì)數(shù)據(jù)。
圖7 初始化測試結(jié)果輸出
區(qū)域3中,軟件將根據(jù)設(shè)置的起始地址、結(jié)束地址以及AXI總線突發(fā)數(shù)量等參數(shù),計(jì)算出對應(yīng)的配置參數(shù),并寫入到MIG Tester的配置寄存器中??梢怨催x下方的測試pattern復(fù)選框來選定本次測試需要測試的pattern。勾選了自定義pattern的情況下需要將自定義的pattern填入后方的文本框內(nèi)。設(shè)置好pattern測試次數(shù)后點(diǎn)擊“執(zhí)行讀寫測試”按鈕,軟件將依次執(zhí)行每個選定pattern的測試。測試結(jié)果將打印在下方的文本框中,并在一輪測試完成后將生成日志文件。日志文件內(nèi)容如圖8所示,輸出的內(nèi)容包括:測試日期、測試項(xiàng)目名、測試序號、讀寫平均帶寬、錯誤數(shù)據(jù)數(shù)量以及本輪次的測試的統(tǒng)計(jì)數(shù)據(jù)。
圖8 讀寫測試結(jié)果輸出
如果在讀寫測試過程中發(fā)生了讀數(shù)據(jù)與預(yù)期數(shù)據(jù)不符的情況,ILA將抓取錯誤發(fā)生時AXI總線上的信號并保存到硬盤上。在需要分析信號時,可以在Vivado程序中使用read_hw_ila_data命令讀取數(shù)據(jù),并用display_hw_ila_data命令繪制信號波形圖。如圖9所示,圖中標(biāo)記的部分error_flag信號為“1”,表示該位置出現(xiàn)了讀寫錯誤。
圖9 數(shù)據(jù)錯誤發(fā)生時的信號波形圖
同時BRAM接口寫使能,將錯誤數(shù)據(jù)對應(yīng)的地址信息寫入BRAM中。程序可以通過JTAG to AXI訪問MIG中這些地址并讀回?cái)?shù)據(jù),從而生成錯誤數(shù)據(jù)列表。如圖10所示,addr是錯誤數(shù)據(jù)對應(yīng)的地址。ex_data是期望數(shù)據(jù),也就是讀寫功能正常情況下應(yīng)讀回的數(shù)據(jù)。rd_data則是實(shí)際讀回的數(shù)據(jù)。操作人員可以根據(jù)該報告分析可能存在的問題。
圖10 錯誤數(shù)據(jù)記錄文件
使用Vivado軟件的仿真功能對MIG Tester進(jìn)行功能驗(yàn)證。配置AXI Verification IP為從模式,連接至MIG Tester的AXI master接口,在仿真中關(guān)注AXI總線的讀寫事務(wù)以及相關(guān)信號的變化。
在單次讀寫測試中,AXI總線上先后發(fā)生的寫事務(wù)與讀事務(wù)。為了縮短仿真時間,測試的地址范圍設(shè)置為0x0~0x63FFF。在通過控制接口啟動測試后,MIG Tester先對整個測試地址范圍順序?qū)懭胍淮蝡attern,然后進(jìn)入讀取數(shù)據(jù)狀態(tài),并將讀取的數(shù)據(jù)與預(yù)期數(shù)據(jù)進(jìn)行校驗(yàn)。完成整個過程后,完成中斷信號將被置“1”。
在AXI總線的寫通道中,寫地址awaddr在每次握手寫入后增加突發(fā)傳輸所占的地址大小,實(shí)現(xiàn)對測試地址范圍內(nèi)所有地址的寫入。當(dāng)設(shè)置的pattern是遞增數(shù)時,寫數(shù)據(jù)wdata每寫入一次數(shù)據(jù)后遞增1。寫突發(fā)結(jié)束計(jì)數(shù)器wlast_counter在wlast信號置位時計(jì)數(shù)加一,用于控制數(shù)據(jù)的突發(fā)傳輸。write_timer信號是寫狀態(tài)計(jì)時器,從測試進(jìn)入寫pattern過程開始計(jì)時,直到進(jìn)入讀數(shù)據(jù)狀態(tài)停止計(jì)時。
在AXI總線的讀通道中,讀地址araddr在每次握手寫入后增加突發(fā)傳輸所占的地址大小,實(shí)現(xiàn)對測試地址范圍內(nèi)所有地址的讀取。讀數(shù)據(jù)rdata是讀回的數(shù)據(jù)。當(dāng)設(shè)置的pattern是遞增數(shù),預(yù)期數(shù)據(jù)expected_data每寫入一次數(shù)據(jù)后發(fā)生遞增。錯誤標(biāo)志信號error_flag的特征是在預(yù)期數(shù)據(jù)與讀取數(shù)據(jù)rdata不同時置1,由于讀取過程中預(yù)期數(shù)據(jù)與讀取數(shù)據(jù)相符,所以錯誤標(biāo)志保持為0。讀突發(fā)結(jié)束計(jì)數(shù)器rlast_conter在每次rlast信號置位時計(jì)數(shù)加一,用于控制狀態(tài)機(jī)的轉(zhuǎn)換。read_timer是讀狀態(tài)計(jì)時器,從狀態(tài)機(jī)進(jìn)入讀數(shù)據(jù)狀態(tài)開始計(jì)時,直到進(jìn)入測試完成狀態(tài)停止計(jì)時。
然后人為插入錯誤數(shù)據(jù)驗(yàn)證數(shù)據(jù)校驗(yàn)?zāi)K功能是否正常。插入錯誤數(shù)據(jù)的方式如下:選擇pattern為遞增數(shù),并且當(dāng)寫入數(shù)據(jù)為A5時,將其替換為5A。在讀數(shù)據(jù)時,讀回?cái)?shù)據(jù)rdata為5A,與其對應(yīng)的預(yù)期數(shù)據(jù)A5不符合,所以錯誤標(biāo)志信號error_flag置“1”,且錯誤計(jì)數(shù)器加一。證明數(shù)據(jù)校驗(yàn)功能正常。
經(jīng)過上述功能驗(yàn)證,可以確認(rèn)測試IP核MIG Tester邏輯功能符合預(yù)期,可以將其用于DDR SDRAM的測試。
FPGA測試平臺工程設(shè)計(jì)完畢后,在軟件Vivado2020.2默認(rèn)設(shè)置下執(zhí)行生成比特文件。作為對比,打開MIG的示例工程并生成比特文件。MIG的示例工程常作為DDR SDRAM的測試調(diào)試工程使用。對比測試平臺工程與示例工程的資源使用數(shù)量,結(jié)果如表2所示。測試平臺工程資源使用量對比示例工程顯著減少。其中作為FPGA主要資源的查找表(LUT,look-up-table)的使用減少了33.22%,觸發(fā)器(FF,F(xiàn)lip Flop)的使用減少了38.40%。
表2 FPGA資源使用數(shù)量對比
測試板卡使用的FPGA產(chǎn)自Xilinx公司,型號為xc7k325tffg900-2,使用的DDR SDRAM型號為MT8JTF2-5664HZ-1G6M1。
4.3.1 測試流程
DDR SDRAM測試基本流程如下:
1)設(shè)計(jì)FPGA工程,生成比特流文件與ltx文件(調(diào)試核信息文件),并拷貝到圖形界面程序目錄下的bitstream文件夾中。
2)使用仿真器將FPGA板卡連接至PC上位機(jī)并上電。打開圖形界面程序,待啟動完成后點(diǎn)擊“連接器件”,等待連接完成,標(biāo)簽欄處出現(xiàn)FPGA器件名稱與狀態(tài)。
3)選擇與FPGA對應(yīng)的比特流,點(diǎn)擊“下載比特流”,等待比特流下載完成,標(biāo)簽欄處顯示“已連接,已編程”。
4)在文本框中設(shè)置測試參數(shù),根據(jù)測試需求執(zhí)行相應(yīng)的測試。在測試完成后,將在程序目錄下生成測試結(jié)果報告。
4.3.2 初始化測試
根據(jù)賽靈思官方手冊提供的數(shù)據(jù),設(shè)置初始化時間限制為1 000 ms。執(zhí)行100次初始化測試。初始化測試結(jié)果如表3所示。在100次初始化測試中,DDR SDRAM的初始化均在1 000 ms以內(nèi)完成。結(jié)果說明,測試板卡中的DDR SDRAM能夠正常初始化。
表3 初始化測試結(jié)果
4.3.3 讀寫測試
設(shè)置讀寫測試起始地址為0,結(jié)束地址為0x7FFFF-FFF,即測試整個2 GB的地址空間。設(shè)置AXI總線突發(fā)數(shù)為64,測試Pattern欄目中勾選遞增數(shù)00、FF、55、AA,每個pattern測試100次。數(shù)據(jù)讀寫測試測試結(jié)果如表4所示。寫平均帶寬和讀平均帶寬分別達(dá)到了理論帶寬的83.9%和88.1%,且沒有出現(xiàn)過讀寫數(shù)據(jù)校驗(yàn)錯誤。證明了在測試環(huán)境下DDR SDRAM讀寫數(shù)據(jù)功能正常,帶寬性能良好。
4.3.4 測試時長對比
表5是兩類測試的測試平均時長對比。對于初始化測試,示例工程的測試方法如下:操作人員使用Vivado軟件的硬件管理器控制VIO輸出的復(fù)位信號失效,之后通過VIO觀察MIG輸出的初始化完成信號是否置“1”,據(jù)此判斷MIG是否完成了初始化。在此過程中,操作人員需要不斷重復(fù)上述過程。一方面存在操作人員操作或記錄失誤的可能性;另一方面手動操作效率低下,且無法準(zhǔn)確判斷初始化所用時長。對于讀寫測試,選用測試00、FF、55、AA與遞增數(shù)物種pattern的情況進(jìn)行對比。示例工程的測試方法如下:操作人員使用Vivado軟件的硬件管理器控制VIO完成DDR SDRAM的初始化、設(shè)置讀寫地址與數(shù)據(jù)。同時設(shè)置ILA抓取數(shù)據(jù)校驗(yàn)錯誤信號為“1”時的波形。觀察VIO中讀寫數(shù)量計(jì)數(shù)器,據(jù)此判斷是否完成了整個地址空間的讀寫。
表5 測試時長對比sec s
由測試結(jié)果可見,在DDR SDRAM功能正常的情況下,使用測試平臺測試DDR SDRAM功能所用時長要比使用示例工程縮短70%以上。
在讀寫測試期間發(fā)生了數(shù)據(jù)錯誤的情況下,測試平臺的優(yōu)勢將進(jìn)一步體現(xiàn)。測試平臺會將完整的錯誤數(shù)據(jù)地址信息寫入BRAM中。在單次測試結(jié)束后根據(jù)地址信息讀回對應(yīng)錯誤數(shù)據(jù),生成完整的錯誤數(shù)據(jù)列表,對測試時長的影響也不明顯。而使用示例工程測試時,只能通過ILA抓取錯誤數(shù)據(jù)發(fā)生時的波形。這種方式無法暫停數(shù)據(jù)讀寫測試,所以無法保證抓取的錯誤數(shù)據(jù)完整性。另一方面ILA需要操作人員手動抓取波形,增加了測試時長。
4.3.5 測試結(jié)論
相比以往的DDR SDRAM測試方案,本測試平臺具有如下優(yōu)勢:
1)測試參數(shù)可配置。操作人員可以根據(jù)不同的測試需求設(shè)置相應(yīng)的測試參數(shù)而無需重新生成比特流,節(jié)省準(zhǔn)備時間。
2)自動執(zhí)行測試流程并輸出報告。程序?qū)凑諈?shù)設(shè)置自動循環(huán)執(zhí)行測試任務(wù),并在測試任務(wù)完成后輸出相應(yīng)的測試日志與報告文件。在測試任務(wù)繁重時可以提高測試效率。
3)輔助錯誤分析。當(dāng)數(shù)據(jù)讀寫出現(xiàn)錯誤時,程序?qū)⒂涗涘e誤數(shù)據(jù)對應(yīng)的地址信息,在當(dāng)次測試結(jié)束后從對應(yīng)地址讀回錯誤數(shù)據(jù)并記錄于測試日志中,給錯誤分析與設(shè)備調(diào)試提供便利。
4)使用FPGA資源降低。對于實(shí)驗(yàn)所用FPGA板卡,對比MIG的示例調(diào)試工程,本設(shè)計(jì)使用的查找表資源由26 081降低至17 415,所用觸發(fā)器資源由33 070降低至20 371,這些主要資源的使用下降了30%以上。在長時間測試中FPGA器件的功耗更低,散熱壓力更小。
5)操作簡單,學(xué)習(xí)門檻低。經(jīng)圖形界面程序封裝之后,操作人員無需耗費(fèi)精力學(xué)習(xí)其相關(guān)軟硬件知識,僅需通過簡單的設(shè)置參數(shù)與點(diǎn)擊按鈕即可完成測試過程。經(jīng)過實(shí)踐,使用測試平臺的測試用時縮短了70%以上。
提出了一種基于FPGA的靈活度高、操作簡易的DDR SDRAM測試平臺。測試平臺由FPGA板卡與PC上位機(jī)兩個主要部分組成。經(jīng)驗(yàn)證,測試平臺能夠正確測試DDR SDRAM的初始化過程、讀寫正確性與帶寬等性能并自動生成測試報告。該測試平臺規(guī)避了傳統(tǒng)測試方法操作繁瑣,耗時長,學(xué)習(xí)成本高等弊端。但在測試前仍需要設(shè)計(jì)相應(yīng)的FPGA工程并生成比特流。如果在FPGA板卡設(shè)計(jì)之初能夠復(fù)用FPGA中DDR SDRAM的管腳分配,即可避免重新生成比特流,該方案的便捷性將進(jìn)一步提升。
測試平臺僅對DDR SDRAM進(jìn)行了測試,但該架構(gòu)同樣適用于其他可通過AXI總線訪問的外部存儲設(shè)備的測試,具有拓展應(yīng)用范圍的潛力。