如何在硬件中進(jìn)行有效地調(diào)試
最有趣的行業(yè)統(tǒng)計(jì)數(shù)據(jù)之一是,84%的FPGA設(shè)計(jì)至少存在一個(gè)錯(cuò)誤。
當(dāng)然,我們可以嘗試通過遵循良好的FPGA開發(fā)過程來減少這種情況,從而實(shí)現(xiàn)結(jié)構(gòu)化方法。這樣的方法可以完成高質(zhì)量的設(shè)計(jì)。通常,該開發(fā)過程將包含幾個(gè)不同的階段、過程和審查,以執(zhí)行結(jié)構(gòu)化方法,包括:
?系統(tǒng)需求評(píng)審——評(píng)審系統(tǒng)需求和驗(yàn)證方法,以及符合/不符合矩陣。
?初步設(shè)計(jì)評(píng)審——根據(jù)要求對(duì)建筑設(shè)計(jì)進(jìn)行評(píng)審,以確保滿足要求。審查架構(gòu)的可行性和技術(shù)風(fēng)險(xiǎn)。
?關(guān)鍵設(shè)計(jì)評(píng)審——根據(jù)需求和體系結(jié)構(gòu)評(píng)審已實(shí)現(xiàn)的設(shè)計(jì)及其驗(yàn)證包、仿真和定時(shí)關(guān)閉/實(shí)現(xiàn)報(bào)告。
遵循這個(gè)過程,當(dāng)然,需要審查階段的檢查表和與供應(yīng)商規(guī)則一致的優(yōu)秀編碼/設(shè)計(jì)指南,例如超快編碼方法。
一旦FPGA設(shè)計(jì)完成,項(xiàng)目離完成還有很長(zhǎng)的路要走。
設(shè)計(jì)必須集成到硬件中,與現(xiàn)實(shí)世界的傳感器、執(zhí)行器、驅(qū)動(dòng)器和應(yīng)用軟件接口。
在此階段,在產(chǎn)品發(fā)布之前,有幾個(gè)技術(shù)挑戰(zhàn)/風(fēng)險(xiǎn)可能導(dǎo)致需要在硬件上執(zhí)行調(diào)試。
在硬件上進(jìn)行調(diào)試需要能夠理解邏輯設(shè)計(jì)、應(yīng)用軟件和現(xiàn)實(shí)世界之間的交互——不幸的是,有時(shí)現(xiàn)實(shí)世界與驗(yàn)證設(shè)計(jì)的方式是不同的——例如,不同的時(shí)序、操作模式或意想不到的硬件/軟件交互。
當(dāng)這種情況發(fā)生時(shí),我們需要能夠找到問題的根本原因并采取糾正措施。在集成過程中發(fā)現(xiàn)的任何東西都應(yīng)該反饋到模擬中,以確保未來的產(chǎn)品更新/回歸測(cè)試不會(huì)忘記實(shí)驗(yàn)室的慘痛教訓(xùn)。
為了做到這一點(diǎn),作為工程師,我們有幾個(gè)工具-從簡(jiǎn)單的萬用表測(cè)量電壓和電流,到邏輯分析儀/模式發(fā)生器和示波器。
然而,有時(shí)我們想要內(nèi)部查看我們的SoC/FPGA,以了解IP核或嵌入式硬核和軟核處理器之間的交互。
AMD ChipScope是集成到Vivado設(shè)計(jì)套件中的片上調(diào)試和驗(yàn)證工具包。它使開發(fā)人員能夠?qū)崟r(shí)觀察,捕獲FPGA或SoC設(shè)計(jì)的內(nèi)部信號(hào)并與之交互,而無需外部探針或邏輯分析儀。
ChipScope工具包的關(guān)鍵要素之一是集成邏輯分析儀。
什么是ILA
集成邏輯分析儀(ILA)是嵌入在AMD fpga和soc中的硬件調(diào)試工具,允許工程師捕獲和分析內(nèi)部數(shù)字信號(hào)。
ILA提供實(shí)時(shí)硬件調(diào)試功能,允許用戶設(shè)置觸發(fā)條件并直接在FPGA結(jié)構(gòu)上捕獲信號(hào)數(shù)據(jù)。ILA能夠捕獲具有一系列接口定義的信號(hào),從簡(jiǎn)單的邏輯信號(hào)和矢量到AXI和AXI流接口。
System ILA是一個(gè)增強(qiáng)版本,可以跨多個(gè)接口和時(shí)鐘域進(jìn)行更全面的系統(tǒng)級(jí)調(diào)試。它提供監(jiān)視AXI接口、內(nèi)存控制器和其他系統(tǒng)互連的功能。
與基本ILA相比,系統(tǒng)ILA可以捕獲更長(zhǎng)的跟蹤緩沖區(qū),支持更復(fù)雜的觸發(fā)條件,并同時(shí)監(jiān)視更多數(shù)量的信號(hào)。這使得它對(duì)于調(diào)試復(fù)雜的片上系統(tǒng)(SoC)設(shè)計(jì)特別有價(jià)值,其中多個(gè)組件通過不同的接口和協(xié)議相互交互。
調(diào)試方法
在調(diào)試應(yīng)用程序時(shí),我們需要采用邏輯方法。因此,在使用System ILA或ILA時(shí),我們應(yīng)該理解FPGA設(shè)計(jì)是一個(gè)迭代過程,如果我們從邏輯上解決問題,這是最成功的。
最好的方法是:
?把問題分解成更小的部分
?通過減少變量和變化來簡(jiǎn)化
?做一個(gè)預(yù)測(cè),然后驗(yàn)證結(jié)果
?在設(shè)計(jì)周期的早期計(jì)劃如何以及在哪里進(jìn)行調(diào)試
插裝方法
當(dāng)在實(shí)際設(shè)計(jì)中使用集成邏輯分析儀(ILA)時(shí),重要的是要有策略地使用儀器來平衡調(diào)試可見性和FPGA資源使用。
ILAs消耗邏輯和塊RAM,這在已經(jīng)接近容量的設(shè)備中成為一個(gè)關(guān)鍵問題。
捕獲深度和被監(jiān)測(cè)信號(hào)的寬度直接影響B(tài)RAM的使用——更寬的探針和更長(zhǎng)的捕獲窗口會(huì)迅速耗盡可用內(nèi)存。
在早期的版本中,遵循上面概述的方法,重點(diǎn)關(guān)注關(guān)鍵控制信號(hào)、重置線和狀態(tài)或錯(cuò)誤指示器,因?yàn)檫@些通常提供對(duì)系統(tǒng)行為的直接洞察,并幫助在調(diào)試周期的早期識(shí)別問題。
系統(tǒng)內(nèi)的關(guān)鍵AXI總線,特別是那些最接近處理系統(tǒng)接口的總線,如Zynq UltraScale+ mpsoc上的M_AXI_HPM_FPD(高性能主)和S_AXI_HP_FPD(高性能從),也應(yīng)該考慮用于儀器儀表。
雖然這些寬總線是資源密集型的,但它們承載著可編程邏輯和處理系統(tǒng)之間的基本流量,并且可以揭示數(shù)據(jù)處理和系統(tǒng)集成中的微妙問題。
從精心選擇的控制、復(fù)位、狀態(tài)/錯(cuò)誤和這些關(guān)鍵AXI接口的混合開始,在適當(dāng)?shù)牟东@深度提供了對(duì)系統(tǒng)級(jí)行為的有價(jià)值的可見性,同時(shí)為迭代調(diào)試改進(jìn)保留了空間。
演示項(xiàng)目
為了演示如何在FPGA設(shè)計(jì)中利用ila提供的功能,我們將創(chuàng)建一個(gè)簡(jiǎn)單的演示項(xiàng)目。
該項(xiàng)目將針對(duì)安富利ZU板,并連接到Digilent ZMod AWG以生成簡(jiǎn)單的模擬輸出。
在這個(gè)項(xiàng)目中,我將使用兩種不同的ILA來幫助確保正確的操作。
?ILA -用于監(jiān)控時(shí)鐘向?qū)фi定信號(hào)、DAC初始化信號(hào)和DAC錯(cuò)誤信號(hào)
?系統(tǒng)ILA -監(jiān)控系統(tǒng)中的AXI和AXI流數(shù)據(jù)
第一步是創(chuàng)建一個(gè)新項(xiàng)目。如果未安裝ZU板,則使用Vivado中的Boards選項(xiàng)卡下載。
一旦創(chuàng)建了項(xiàng)目,下一步就是創(chuàng)建Vivado設(shè)計(jì)。要做到這一點(diǎn),第一步是創(chuàng)建一個(gè)塊設(shè)計(jì)。
隨著塊設(shè)計(jì)的開放,添加Zynq UltraScale+ MPSoC處理系統(tǒng)。
運(yùn)行塊自動(dòng)化配置處理系統(tǒng)為ZU板定義。
在配置了處理系統(tǒng)之后,我們可以從Vivado庫中添加ZMod AWG控制器。
雙擊IP并選擇“將IP添加到塊設(shè)計(jì)”。
ZMod AWG需要一個(gè)軸流輸入,而處理系統(tǒng)有一個(gè)AXI4輸出。然而,Vivado能夠?qū)崿F(xiàn)必要的內(nèi)存映射到流轉(zhuǎn)換架構(gòu)。連接ZMod AWG輸入數(shù)據(jù)流端口到處理系統(tǒng)的h0 - fpd端口。
這將打開一個(gè)連接自動(dòng)化對(duì)話框。對(duì)于時(shí)鐘,從處理系統(tǒng)中選擇100 MHz輸出時(shí)鐘。
這將生成如下圖所示的圖表。將系統(tǒng)時(shí)鐘連接到與DAC I/O時(shí)鐘相同的時(shí)鐘,因?yàn)閮烧叨紝⑻幱?00?MHz。
重新定義軸流FIFO并取消啟用傳輸控制選項(xiàng)。
添加一個(gè)新的時(shí)鐘向?qū)Р慈缦滤具M(jìn)行配置;我們想要一個(gè)100?MHz的輸出偏移距輸入90度。
如圖所示,將時(shí)鐘連接到ZMod AWG的DAC CLK輸入端。
連接復(fù)位。
增加一個(gè)常數(shù)塊設(shè)置為DAC使能的邏輯高。
添加一個(gè)常數(shù)塊設(shè)置為邏輯低禁用測(cè)試模式。
除了ZMod AWG塊上的頂部?jī)蓚€(gè)端口,并將它們標(biāo)記為外部。
添加系統(tǒng)ILA;我們將使用它來監(jiān)視系統(tǒng)中的AXI和axis - stream數(shù)據(jù)。
按如下方式配置System ILA屬性;啟用其觸發(fā)輸入和輸出端口。這將使我們能夠與Vitis Unified的軟件開發(fā)進(jìn)行交叉探索。
0號(hào)槽位保持當(dāng)前配置不變。
改變槽1的屬性來監(jiān)控軸流。
如下所示連接System ILA插槽0和插槽1,以及時(shí)鐘和復(fù)位。
重新定制處理系統(tǒng)以禁用HPM1,并啟用PS到PL和PL到PS的交叉觸發(fā)。這種交叉觸發(fā)允許ILA和Vitis Unified環(huán)境相互觸發(fā)。
輸出觸發(fā)是指在Vitis中遇到斷點(diǎn)時(shí),也可以同時(shí)觸發(fā)所連接的ILA,以觀察斷點(diǎn)觸發(fā)時(shí)硬件的行為。
輸入觸發(fā)是指當(dāng)ILA到達(dá)它的觸發(fā)器時(shí),處理器上的軟件執(zhí)行也停止,使得軟件的狀態(tài)也可以被觀察到。
如圖所示連接Trigger端口。
添加一個(gè)ILA;我們將用它來監(jiān)測(cè)設(shè)計(jì)中的一些簡(jiǎn)單的邏輯信號(hào)。
用三個(gè)輸入探針配置ILA,如下所示。
如下所示連接ILA;我們將監(jiān)視時(shí)鐘向?qū)фi定信號(hào),DAC初始化信號(hào)和DAC錯(cuò)誤信號(hào)。
最終的設(shè)計(jì)應(yīng)該如下所示。
驗(yàn)證設(shè)計(jì),創(chuàng)建包裝器,并使用下面提供的XDC文件構(gòu)建比特流。
HW設(shè)置
確保硬件設(shè)置如下所示,將ZU板通過PL HSIO端口連接到ZMod DAC。DAC通道1 SMA的輸出應(yīng)使用SMA- bnc電纜連接到示波器。
此外,確保ZU板通過USB- c連接供電,并通過USB JTAG連接到開發(fā)機(jī)器。
SW設(shè)計(jì)
為了開始軟件設(shè)計(jì),我們首先需要確保ZU板上的啟動(dòng)模式設(shè)置為JTAG。我們將使用JTAG端口訪問ILAs。如果您正在使用PetaLinux,您也可以通過以太網(wǎng)進(jìn)行訪問,如本項(xiàng)目所示;然而,這超出了本項(xiàng)目的范圍。
在Vitis Unified中,基于剛剛導(dǎo)出的XSA創(chuàng)建一個(gè)新的硬件平臺(tái)。
選擇剛剛從Vivado導(dǎo)出的XSA。
選擇一個(gè)獨(dú)立的操作系統(tǒng)和第一個(gè)A53處理器。
完成平臺(tái)的創(chuàng)建。
下一步是創(chuàng)建應(yīng)用程序項(xiàng)目。對(duì)于這個(gè)項(xiàng)目,我們將使用Hello World模板,并將其命名為AWG_Example。
選擇剛剛創(chuàng)建的平臺(tái)。
按照指示離開域。
完成應(yīng)用程序的創(chuàng)建。
下一步是構(gòu)建應(yīng)用程序并使用應(yīng)用程序的啟動(dòng)配置交叉探測(cè)。json文件。
要添加交叉探測(cè)(我們需要添加兩個(gè),每個(gè)方向一個(gè)),選擇add Item選項(xiàng)。
我們將設(shè)置的第一個(gè)交叉探針使觸發(fā)器能夠使用FTM從A53-0處理器轉(zhuǎn)到可編程邏輯,從而轉(zhuǎn)到系統(tǒng)ILA。
一旦設(shè)置了第一個(gè)交叉探測(cè),我們需要添加另一個(gè)從可編程邏輯到A53處理器的交叉探測(cè)。
現(xiàn)在,我們可以調(diào)試標(biāo)準(zhǔn)的Hello World應(yīng)用程序,以確保該流程按預(yù)期工作,并提前查看ZMod AWG狀態(tài)。
我們將在終端中看到輸出;這有助于證明我們有一個(gè)具有基本功能的構(gòu)建。
在開發(fā)主應(yīng)用軟件之前,下一步是確認(rèn)ZMod AWG已被正確配置和初始化。這里的任何錯(cuò)誤都表明時(shí)鐘或控制信號(hào)映射有問題。
在Vivado中,打開硬件管理器,并在ILA1上,仔細(xì)檢查時(shí)鐘向?qū)欠癖绘i定并且DAC已初始化。由于這些是靜態(tài)信號(hào),我們可以立即觸發(fā)ILA。
如果我們看到一個(gè)配置錯(cuò)誤,我們將需要進(jìn)一步研究ZMod AWG的接口和時(shí)鐘。
下一步是在系統(tǒng)ILA上啟用觸發(fā)器并武裝它。
然后我們可以開發(fā)主應(yīng)用軟件,對(duì)于本例,它將向DAC中寫入一個(gè)斜坡計(jì)數(shù)。這是一種通常在集成早期執(zhí)行的測(cè)試,以確保DAC沒有丟失的位或卡住的代碼。
應(yīng)用程序代碼如下:
下一步是使用System ILA檢查數(shù)據(jù)是否正確地傳輸?shù)捷S流FIFO。
在for循環(huán)中添加一個(gè)斷點(diǎn)來執(zhí)行寫操作。
當(dāng)遇到斷點(diǎn)時(shí),ILA也將觸發(fā),并且可以觀察到AXI寫入。
這證明數(shù)據(jù)正在寫入軸流FIFO。現(xiàn)在我們需要檢查數(shù)據(jù)是否從FIFO輸出。
在Vivado中,更改System ILA觸發(fā)器,并將其設(shè)置為在axis - stream上有效的數(shù)據(jù)上升沿觸發(fā),然后武裝ILA。
重新啟動(dòng)應(yīng)用程序軟件,ILA將隨著軟件的停止而觸發(fā),就像在斷點(diǎn)處一樣。我們可以看到數(shù)百個(gè)數(shù)據(jù)包正在輸出。
放大后,您可以看到斜坡的值和值按預(yù)期增加。
在Vitis中,您還將看到該軟件已被停止。
當(dāng)我們將輸出驅(qū)動(dòng)到DAC時(shí),這應(yīng)該會(huì)導(dǎo)致DAC輸出端出現(xiàn)模擬輸出。然而,在連接到硬件的示波器上,沒有觀察到任何信號(hào)。
我們知道處理系統(tǒng)正在生成數(shù)據(jù),我們知道它正在被發(fā)送到ZMod DAC驅(qū)動(dòng)程序,我們知道ZMod被正確初始化-但是作用域中沒有出現(xiàn)任何東西。
讓我們看看ZMod AWG用戶指南,看看我們是否遺漏了什么。該指南的鏈接在這里。
閱讀文檔,我們看到了這個(gè)問題:目前,測(cè)試波形被放置在較低的位,但ZMod AWG期望它在較高的位。
糾正這個(gè)錯(cuò)誤(很有幫助,這是一個(gè)軟件修復(fù))可以再次在ILA中驗(yàn)證;但是,我們現(xiàn)在可以在作用域輸出中看到結(jié)果。
由于DAC代碼是有簽名的,因此將計(jì)數(shù)器從0調(diào)到最大刻度將導(dǎo)致作用域顯示一個(gè)正斜坡,然后在設(shè)置MSB后顯示一個(gè)負(fù)斜坡。
總結(jié)
本項(xiàng)目展示了我們?nèi)绾问褂肁MD ChipScope調(diào)試解決方案、ILAs和System ILAs在實(shí)時(shí)項(xiàng)目中發(fā)現(xiàn)問題并快速識(shí)別它們。該項(xiàng)目還概述了如何通過使用交叉探測(cè)功能來調(diào)試硬件和軟件交互,從而可以輕松地分析集成問題。
ChipScope, ILA和System ILA是開發(fā)人員可以用來快速輕松地調(diào)試應(yīng)用程序的重要元素。
本文編譯自hackster.io