對于FPGA調(diào)試,主要以Intel FPGA為例,在win10 Quartus ii 17.0環(huán)境下進(jìn)行仿真和調(diào)試,開發(fā)板類型EP4CE15F17。主要包括一下幾個部分:
- FPGA的調(diào)試-虛擬JTAG(Virtual JTAG)
- FPGA的調(diào)試-在線存儲器內(nèi)容編輯工具(In-system Memory Content Editor)
- FPGA的調(diào)試-內(nèi)嵌邏輯分析儀(SignalTap)
- FPGA的調(diào)試-LogicLock
- FPGA的調(diào)試-調(diào)試設(shè)計的指導(dǎo)原則
1、相關(guān)理論知識
1.1內(nèi)嵌邏輯分析儀
為方便用戶進(jìn)行調(diào)試,F(xiàn)PGA通常會內(nèi)置信號觀察邏輯,Altera提供的是SignalTap,而xilinx提供的則是ChipScope。此外還有第三方調(diào)試工具,如Synopsys的Identify。這類工具的核心原理為:以預(yù)先設(shè)定的時鐘速率實時采樣FPGA的內(nèi)部信號或者引腳狀態(tài),并存儲于FPGA的內(nèi)部RAM中,然后通過統(tǒng)一的ELA(Embedded Logic Analyzer)進(jìn)行數(shù)據(jù)分析和管理。當(dāng)預(yù)設(shè)的觸發(fā)條件滿足后,ELA通過JTAG將存儲在片內(nèi)RAM中的數(shù)據(jù)緩存數(shù)據(jù)傳輸至PC上。當(dāng)PC獲得JTAG回傳數(shù)據(jù)后,通過本地計算將對應(yīng)的邏輯分析結(jié)果展現(xiàn)出來。
因此,無論是GignalTap還是ChipScope,其實都是在工程中額外加一些特殊模塊實現(xiàn)信號的采集,所付出的代價包括:邏輯單元、內(nèi)部RAM以及ELA資源。邏輯分析儀的數(shù)據(jù)捕獲原理如圖2-53所示,所有存儲單元都是與當(dāng)前邏輯設(shè)計的RAM共享的。如果當(dāng)前邏輯占用RAM較大,內(nèi)嵌的邏輯分析儀功能將會有非常大的存儲深度限制。
從圖2-53很容易發(fā)現(xiàn),邏輯觸發(fā)的時刻可以動態(tài)調(diào)整,而且存儲的數(shù)據(jù)長度與時間也很容易調(diào)整。此外由于FPGA內(nèi)置可編程能力,所以觸發(fā)條件可以依賴于其他的事件觸發(fā),這樣可以多級觸發(fā),形成基于狀態(tài)的數(shù)據(jù)捕獲。
例如當(dāng)A信號為高電平,且持續(xù)32周期后,如果此時B信號為低電平且C信號有一個低脈沖,則觸發(fā)一個等待事件;當(dāng)?shù)却录l(fā)生65536個時鐘周期后,再捕獲數(shù)據(jù),并通過邏輯分析儀發(fā)送出來。這就是基于狀態(tài)機(jī)觸發(fā)的邏輯分析功能,類似于Verilog中的Assertion斷言和FSM狀態(tài)機(jī)的有機(jī)結(jié)合體,是傳統(tǒng)邏輯分析儀無法完成的。由于現(xiàn)在的邏輯通常都比較復(fù)雜,基于傳統(tǒng)的條件觸發(fā)模式,往往耗時耗力,很難快速找到BUG;而狀態(tài)觸發(fā)往往能夠幫助設(shè)計者快速定位錯誤并調(diào)試。
對于邏輯分析儀而言,除了觸發(fā)條件外,還有一個存儲位置的概念。正常情況下,F(xiàn)PGA會對需要CIA楊的數(shù)據(jù)一直采樣,當(dāng)數(shù)據(jù)放滿后,將采用循環(huán)覆蓋的方式存儲,這類似于FIFO中的卷繞(WRAP)概念。當(dāng)觸發(fā)器觸發(fā)后,通常緩沖器都是滿的;如果采用預(yù)觸發(fā),將繼續(xù)記錄當(dāng)前存儲容量12%的數(shù)據(jù)后停止(有些廠商是不再記錄,直接用當(dāng)前記錄數(shù)據(jù));如果采用后觸發(fā),將繼續(xù)記錄當(dāng)前存儲容量的88%的數(shù)據(jù)后,停止記錄(有些廠商是記錄全部容量);如果是中間觸發(fā),將繼續(xù)記錄當(dāng)前存儲容量的1/2的數(shù)據(jù)。實際上什么時候開始記錄,什么時候停止都可以通過狀態(tài)觸發(fā)實現(xiàn)。捕獲數(shù)據(jù)的概念示意圖如圖2-54所示。
下面通過SignalTAP為例,簡單講述內(nèi)嵌邏輯分析儀的調(diào)試技巧。
1.2 SignalTap
SignalTAP是Altera內(nèi)置的邏輯信號觀測工具,內(nèi)部實現(xiàn)結(jié)構(gòu)如圖所示。
根據(jù)前面的邏輯分析儀原理,很容易得知FPGA可以實現(xiàn)多個并行的ELA。通過FSM和條件判斷支持多級觸發(fā),F(xiàn)PGA也能夠支持復(fù)雜的狀態(tài)機(jī)數(shù)據(jù)捕獲。令觸發(fā)條件加上一個計數(shù)器,就很容易使FPGA能在不同的起始時刻捕獲數(shù)據(jù)。而Altera所設(shè)計的SignalTAP正好是按照上訴方式設(shè)計的,其特點如下:
最大支持1024個數(shù)據(jù)捕獲通道
單個器件支持多個并發(fā)的邏輯分析模塊,包括跨多個時鐘域的信號
每個數(shù)據(jù)捕獲通道能夠支持10級觸發(fā)
支持在不同的位置進(jìn)行捕獲,包括信號前段、中段和后段。
SignalTAP的捕獲流程如圖所示。
1.2.1 SignalTap的界面
操作界面如圖所示。
1.2.2 SignalTap的演示
演示放在實例里
1.2.3 SignalTap的基本觸發(fā)模式
當(dāng)啟動邏輯分析儀后,SignalTAP會對被監(jiān)視的信號進(jìn)行不斷的采樣,一直到某個條件滿足后停止,這個條件就是觸發(fā)條件。在基本模式下,觸發(fā)條件被設(shè)定為當(dāng)前信號的邏輯組合。當(dāng)邏輯組合滿足某個值后,觸發(fā)條件將被滿足,數(shù)據(jù)將被采樣保存并上傳到PC。
下圖是SignalTAP的基本觸發(fā)模式示意圖。
1.2.4 SignalTap的Advanced Trigger模式
在信號列表Trigger Conditions欄的頂端選擇Advanced,Advanced會彈出邏輯編輯器,在這里可以設(shè)計一個復(fù)雜的觸發(fā)表達(dá)式。
1.2.5 SignalTap基于狀態(tài)觸發(fā)的觸發(fā)模式
基于狀態(tài)觸發(fā)的邏輯分析儀模式是FPGA內(nèi)嵌分析儀的而核心技術(shù),主要技巧在于任何通過狀態(tài)觸發(fā)語句實現(xiàn)狀態(tài)機(jī)的觸發(fā)。下圖是狀態(tài)機(jī)觸發(fā)的工作界面。
在設(shè)定觸發(fā)條件前,先需要確定基本的觸發(fā)條件,具體如圖所示。
在設(shè)定基本觸發(fā)條件后,就可以啟動狀態(tài)機(jī)的腳本設(shè)計,下面通過幾個例子來說明狀態(tài)機(jī)觸發(fā)的實現(xiàn)方法:
1)當(dāng)條件condition1不滿足,且持續(xù)時間超過5個時鐘周期后,觸發(fā)觸發(fā)器,相關(guān)理想波形如圖所示:
對應(yīng)的狀態(tài)機(jī)觸發(fā)代碼如下:
2)當(dāng)條件condition1不滿足情況發(fā)生,且不滿足情況在不超過5個時鐘周期內(nèi),又發(fā)生條件condition1滿足的情況,則觸發(fā)觸發(fā)器,否則停止觸發(fā)。一個典型的例子圖下圖所示。
上訴觸發(fā)觸發(fā)器的腳本如下:
3)當(dāng)condition條件滿足5次后,觸發(fā)觸發(fā)器,否則停止觸發(fā)。該例子的腳本如下:
4)當(dāng)condition1條件滿足后,如果condition2能夠滿足,則立即觸發(fā)觸發(fā)器,否則停止觸發(fā)。該例子的腳本如下:
5)當(dāng)condition1條件滿足后,如果5個采樣時鐘周期內(nèi),condition2能夠滿足,則立即觸發(fā)觸發(fā)器,否則停止觸發(fā)。該例子的腳本如下:
由于任何復(fù)雜的條件都可以簡化為順序、分支和循環(huán)3種情況,通過計數(shù)器能夠?qū)崿F(xiàn)循環(huán),通過條件判斷可實現(xiàn)分支,而通過狀態(tài)機(jī)可實現(xiàn)流程控制。因此任意復(fù)雜的條件觸發(fā),都能夠通過上訴條件組合捕獲。
前面所舉的5個例子,就是上訴不同場景的組合,因此讀者只需要將上訴5個例子進(jìn)行組合就能基本掌握觸發(fā)條件的實現(xiàn),熟練進(jìn)行FPGA調(diào)試。
2、簡單實例
2.1 新建工程
首先新建一個工程,然后添加文件,文件內(nèi)容如下:
module test ( input CLOCK, RESET, output [7:0]oData ); reg [7:0]C1; always @ ( posedge CLOCK or negedge RESET ) if( !RESET ) C1 <= 8'd0; else if( C1 == 32 -1 ) C1 <= 8'd0; else C1 <= C1 + 1'b1; assign oData = C1; endmodule
邏輯非常簡單,其中,CLOCK是時鐘引腳,RESET是復(fù)位引腳,這只模塊的功能就是不斷重復(fù)計數(shù),然后將計數(shù)
內(nèi)容經(jīng)由 Data 輸出。接下來綜合,分配引腳后就可以設(shè)置SigalTAP了。
1.2 配置SignalTapII Logic Analyzer
如圖所示,點擊 Tool 菜單,然后選擇 SignalTapII Logic Analyzer 便可啟動該工具。
下圖是 Signal Tap 的窗口,其中 4 處高亮的地方是比較重要的界面。
(一)JTAG Chain Configuration,JTAG 界面,主要是設(shè)置 USB Blaster。
(二)Instance Manager,調(diào)試界面,主要是啟動,連續(xù),結(jié)束等調(diào)試的活動。
(三)Signal Configuration,信號界面,主要是儲存,觸發(fā)等設(shè)置。
(四)Data,顯示界面,主要是顯示采集結(jié)果,時序活動。
(五)Setup,設(shè)置界面,主要是添加節(jié)點,設(shè)置觸發(fā)事件/條件等。
① JTAG 界面 - 配置 JTAG 以及下載對象
如圖所以,設(shè)備一旦上電,并且 USB Blaster 鏈接成功,那么 JTAG 界面就會進(jìn)入緒狀態(tài)。
如圖 所示,SOF Manager 是小型下載管理器,讀者也可以經(jīng)由一般的下載管理器完成下載工作,不過一切下載活動必須在配置結(jié)束以后才執(zhí)行(綜合成功并且下載)。
② 信號界面 - 配置采集時鐘,儲存,觸發(fā):
一旦 JTAG 就緒以后,我們就可以開始執(zhí)行信號相關(guān)的配置。如圖 3.6 所示,默認(rèn)下的信號界面都是這個樣子,其中:
? Clock 是采集時鐘
? Sample depth 是儲存/采集深度
? RAM Type 是儲存資源
? Storage Qualifier - type 是儲存方式
首先,讓我們設(shè)置采集時鐘,所以請點擊 Clock 選項右邊的 < … >,完后會彈出節(jié)點界面。
圖中 是節(jié)點界面,這點它和 Time Quest 非常相似:
① 請讀者保持 Named:* 不變的情況下,
② Filter 選擇為
③ 注意 Look in 指向頂層模塊 ,
④ 然后點擊右上角的 < List >。
如下圖 所示,這是添加節(jié)點(采集時鐘)的步驟:
① 點擊 列出所有 demo 模塊相關(guān)的端口。
② 諸多端口之中,節(jié)點 CLOCK 將成為采集時鐘,然后點擊它。
③ 點擊 > 將該節(jié)點添加到右邊。
④ 點擊 < OK > 生效設(shè)置。
如下圖所示,采集時鐘設(shè)置完畢以后,Clock 右邊的文本框就會出現(xiàn) CLOCK 的字眼。
如下圖 所示,一般上儲存相關(guān)的配置都會這樣設(shè)定:
① Sample depth 儲存深度按照感覺設(shè)置,這里是 256。
② RAM type 儲存資源,有 Auto 就設(shè)置,非常省事,不然就是 M4K/M9K,還是 Logic。
③ Storage qualifier - type 儲存方式選擇 Continuous 連續(xù)性即可。
讀者可能無法相信,高達(dá) 8 成的調(diào)試工作都是按照這樣的設(shè)定與配置。
如圖 3.11 所示,一般上觸發(fā)相關(guān)的配置都是這樣設(shè)定:
① Trigger flow control,觸發(fā)條件流程,這里選擇 Sequential 順序性即可。
② Trigger position,觸發(fā)位置,這里選擇 Pre trigger position 即可。
③ Trigger conditions,觸發(fā)條件數(shù),這里選擇一個即可。
同樣,讀者可能也無法相信,高達(dá) 8 成的調(diào)式工作也是按照這樣的觸發(fā)配置。到目前為止,信號界面的配置工作總算告一段落。
③ 配置界面 - 添加采集對象:
如圖 3.12 所示,配置界面就是添加節(jié)點(采集對象)的地方,默認(rèn)下它是空空如也,我們必須自行添加對象才行。
① < 右鍵 > 調(diào)出菜單,
② 點擊 < Add Nodes … > 添加節(jié)點。
完成上面兩個步驟以后,它就會跳出節(jié)點界面。
如上圖所示,同樣的節(jié)點界面再次出現(xiàn):
① 請保持 Named:* 不變,
② Filter 設(shè)為 < Pins: all >,
③ Look in 設(shè)為 頂層模塊,
④ 點擊 列出,demo 模塊所有相關(guān)的端口。
如上圖 所示,假設(shè) oData 是采集對象:
① 點擊 列出頂層模塊 demo 的所有端口,
② 選擇 oData,
③ 點擊 > 將節(jié)點添加到右邊去,
④ 點擊 生效配置。
如下圖所示,如果一切無誤的話,那么節(jié)點(采集對象)oData 就會出現(xiàn)在配置界面之中。完后,我們可以開始配置觸發(fā)事件。
④ 觸發(fā)事件:
如上圖所示,筆者曾在前面說過觸發(fā)事件可以是單一或者復(fù)數(shù),其中 Basic AND 與Basic OR 就是用來表達(dá)復(fù)數(shù)觸發(fā)事件的關(guān)系。我們以同樣的例子作為解釋 …
如上圖所示,假設(shè)信號 A 的下降沿是事件 1,信號 B 的低電平是事件 2,那么 Baisc AND的邏輯關(guān)系造成兩者在成立的情況下才執(zhí)行采集。反之,Basic OR 的邏輯關(guān)系造成,任一事件成立都會執(zhí)行采集。在此,筆者選擇 Basic AND 就好了 …
言歸正題。筆者也說過,Signal Tap 有預(yù)設(shè)觸發(fā)事件以及高級觸發(fā)事件,后者必須將觸發(fā)事件設(shè)為 Advance 才行,反之預(yù)設(shè)觸發(fā)事件可以:
① 觸發(fā)事件表框之處 <右鍵>,
② 選擇
默認(rèn)下,Signal Tap 自帶 7 個預(yù)設(shè)觸發(fā)事件,在此筆者選擇數(shù)值的觸發(fā)事件,隨后會彈出相關(guān)的窗口。
如上圖所示,這是配置數(shù)值觸發(fā)事件的窗口:
① 選擇格式,這里是 < Unsigned Decimal >,無符號位的十進(jìn)制,
② 輸入數(shù)值,這里是 5,
③ 點擊 生效配置。
上圖 是觸發(fā)事件配置完畢的情況,其中 oData 為 5 執(zhí)行采集。到目前為止,配置工作已經(jīng)是完成八九十,余下再綜合一起便可下載至設(shè)備,期間系統(tǒng)可能要求保存一切配置,例如 stp1.stp 什么的,讀者可以保存在任一的地方。
如圖一切無誤的話,那么實驗三層次關(guān)系與文件關(guān)系的結(jié)果如上圖 所示,其中 sld_×× 就是 Signal Tap 模塊的實例化,讀者也可以認(rèn)為那是調(diào)試模塊(環(huán)境)。
⑤ 采集界面:
如圖 3.22 所示,程序下載以后,如果環(huán)境創(chuàng)建失敗的話,那么它會呈現(xiàn)紅色(左圖)。反之,如果環(huán)境創(chuàng)建成功,那么它會打印 Ready to acquire 的字眼。一般上,調(diào)試環(huán)境創(chuàng)建失敗有幾個原因:
JTAG 未就緒
程序下載失敗
綜合結(jié)果過期
設(shè)備未上電
以上 4 個原因排除以后,調(diào)試工作就處于就緒狀態(tài)。
如圖 3.23 所示,采集界面主要有 4 個選項控制整個采集過程。
① Run Analysis 手動執(zhí)行,觸發(fā)事件誘發(fā)采集,達(dá)到采集次數(shù)自動停止。
② Auto Analysis 自動執(zhí)行,無視觸發(fā)事件,采集次數(shù),采集一切。
③ Stop,停止執(zhí)行,停止采集。
④ Read Data,讀取數(shù)據(jù),讀取緩沖空間的內(nèi)容。
一般上,如果觸發(fā)事件配置無誤的話,我們只要按下手動執(zhí)行,那么觸發(fā)事件會誘發(fā)采集,當(dāng)采集達(dá)到某個次數(shù)以后(根據(jù)儲存深度),采集過程就會結(jié)束。讀者沒有看錯,采集界面只有 4 個選項而已,其中手動執(zhí)行最為有用,因為其它選項只有在采集失敗的情況下(觸發(fā)事件未達(dá)成)才會派上用場,真是諷刺。例如,停止執(zhí)行要么強(qiáng)制停止失控的采集現(xiàn)場,要么配合自動執(zhí)行一起使用。換之,讀取數(shù)據(jù)也是在采集失控的情況下,強(qiáng)制從設(shè)備中(緩沖空間)讀取數(shù)據(jù)。好了,我們稍微點擊一下手動執(zhí)行,然后悄悄采集結(jié)果。
根據(jù) demo 模塊,我們知道它重復(fù)計數(shù) 0~31。如圖 3.24 所示,T0 表示觸發(fā)事件的達(dá)成之際也是采集工作的開始,其中未來值 5 就是觸發(fā)事件的達(dá)成條件 … 簡單的調(diào)試工作也到此結(jié)束。
3 (補(bǔ)充)Signal Tap 標(biāo)準(zhǔn)調(diào)試流程
如圖 3.25 所示,雖說這是是官方指定的標(biāo)準(zhǔn)流程,不過筆者還是建議看看就好,千萬不要太認(rèn)真,迷信“標(biāo)準(zhǔn)”這種東西很容易害死人。圖 3.25 有一處值得說明的地方是,觸發(fā)事件發(fā)生失敗的時候,如果跟著流程游蕩,它會要求手動停止分析,如果 Signal Tap顯示結(jié)果就進(jìn)行分析,反之就是從設(shè)備哪里強(qiáng)制讀取結(jié)果。
最后,好事的筆者也為實驗三的配置過程繪出一副流程圖,結(jié)果如圖 3.26 所示,讀者自己看著辦。
4 (補(bǔ)充)添加節(jié)點
筆者相信許多第一次接觸的同學(xué)都會畏懼節(jié)點的過濾選項。如圖 3.27 所示,不甘寂寞的官方為我們準(zhǔn)備那么多選項,多少有些弄巧成拙的感覺,有關(guān)過濾選項基本上可以分為兩大類以致縮小范圍。其一是 Pin 端口類,其二就是 Reg 寄存器類,筆者喜歡的選項卻只有 Pins:all 以及 Register : pre-synthesis 兩個而已。
顧名思義 Pins:all 就是所有端口的意思,如果 Look in 指向模塊 A,那么模塊 A 的端口就會顯示出來(不管有沒有賦值驅(qū)動)。反之,Register:pre-synthesis 就是綜合以后的寄存器,如果 Look in 指向模塊 B,那么模塊 B 的所有寄存器都會暴露出來。除此之外,發(fā)狂的筆者偶爾不顧其它直接選擇 Design Entry,即不管什么鬼東西統(tǒng)統(tǒng)都給老子舉例出來 …
審核編輯:劉清
-
FPGA設(shè)計
+關(guān)注
關(guān)注
9文章
428瀏覽量
26504 -
寄存器
+關(guān)注
關(guān)注
31文章
5334瀏覽量
120217 -
狀態(tài)機(jī)
+關(guān)注
關(guān)注
2文章
492瀏覽量
27522 -
邏輯分析儀
+關(guān)注
關(guān)注
3文章
214瀏覽量
23165 -
jtag接口
+關(guān)注
關(guān)注
0文章
34瀏覽量
13657
原文標(biāo)題:FPGA的調(diào)試-內(nèi)嵌邏輯分析儀(SignalTap)原理及實例
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論