一種新的嵌入式處理器在線調(diào)試方法
引言
在FPGA 設(shè)計(jì)中使用嵌入式處理器軟核( 如MicroBlaze、PicoBlaze 等) 構(gòu)成可編程片上系統(tǒng)( SystemOn Programmable Chip,SOPC) ,相比于ASIC 具有更好的可修改性和可維護(hù)性,得到了普遍的應(yīng)用。由于ARM,MicroBlaze 等大型處理器內(nèi)核具備調(diào)試接口,在與之對(duì)應(yīng)的調(diào)試模塊配合下,調(diào)試軟件可以通過(guò)JTAG 接口實(shí)現(xiàn): 執(zhí)行到斷點(diǎn)處掛起、單步執(zhí)行、查看處理器內(nèi)部狀態(tài)、查看和修改Memory空間中的數(shù)據(jù)等基本的在線調(diào)試功能。上述基本的在線調(diào)試功能對(duì)嵌入式系統(tǒng)的調(diào)試具有重要意義。
對(duì)于PicoBlaze 等占用資源少、設(shè)計(jì)開(kāi)發(fā)簡(jiǎn)單的小巧型處理器,一般不具備調(diào)試接口,然而在SOPC系統(tǒng)設(shè)計(jì)中經(jīng)常需要使用上述處理器。使用上述處理器時(shí),由于沒(méi)有調(diào)試接口,屬于大型處理器的標(biāo)準(zhǔn)高效的調(diào)試機(jī)制不再能夠使用,因此通過(guò)指令集仿真( ISS,Cycle - accurate Instruction Set Simulation) 和利用仿真工具對(duì)含有處理器的系統(tǒng)進(jìn)行軟硬件協(xié)同仿真是確保設(shè)計(jì)正確性的重要途徑。然而在諸如接收機(jī)基帶信號(hào)處理等系統(tǒng)的設(shè)計(jì)中,仿真所用的測(cè)試用例往往覆蓋率不夠,或者在發(fā)現(xiàn)故障以后很難構(gòu)造出與之相應(yīng)的測(cè)試用例。因此迫切需要使在線調(diào)試功能能夠方便地?cái)U(kuò)展到一般的處理器上。
針對(duì)上述應(yīng)用需求,這里提出的新調(diào)試方法通過(guò)引入一種通用的調(diào)試模塊( Universal Debug Module,UDM) 可以使沒(méi)有調(diào)試接口的處理器建立起標(biāo)準(zhǔn)的調(diào)試機(jī)制。該調(diào)試模塊利用處理器的中斷機(jī)制實(shí)現(xiàn)處理器響應(yīng)斷點(diǎn)( breakpoint) 的機(jī)制,利用基于雙端口RAM 中一種巧妙的地址映射機(jī)制實(shí)現(xiàn)同時(shí)對(duì)多行代碼設(shè)置斷點(diǎn)的功能,并且能夠方便地實(shí)現(xiàn)被調(diào)試系統(tǒng)和調(diào)試主機(jī)之間調(diào)試信息和命令的交互。UDM 還具有易于擴(kuò)展的優(yōu)點(diǎn),當(dāng)SOPC 系統(tǒng)中有多個(gè)處理器時(shí)可以共用一個(gè)UDM。
2 在線調(diào)試的一般原理
嵌入式處理器的主流在線調(diào)試方法,目前主要有2 種: 后臺(tái)調(diào)試模式( backgroud debug mode,BDM) 技術(shù)和基于IEEE P1149. 1 協(xié)議的JTAG 調(diào)試技術(shù)。BDM 技術(shù)在Motolora 微控制器中得到了大量的應(yīng)用,ARM,MIPS 和PowerPC 等處理器都具有基于JTAG 技術(shù)的在片調(diào)試功能,如ARM 公司提出了基于JTAG 技術(shù)的RDI 調(diào)試接口標(biāo)準(zhǔn),主要用于ARM 芯片的調(diào)試。處理器內(nèi)核中通過(guò)增加支持調(diào)試的擴(kuò)展設(shè)計(jì),可在預(yù)留的調(diào)試接口輸入簡(jiǎn)單的控制信號(hào),以實(shí)現(xiàn): 處理器掛起( Halt) 、輸出PC 值和通用寄存器值、輸出和修改Memory 空間中的數(shù)據(jù)等基本的原始調(diào)試操作。通常上述調(diào)試接口的設(shè)計(jì)與指令集架構(gòu)相關(guān),如MIPS32 提供如下一些調(diào)試方法: ①斷點(diǎn)指令BREAK; ②一些自陷指令TRAP; ③特殊控制寄存器WATCH,通過(guò)編程使得特定的load /store 操作以及取指操作產(chǎn)生特殊的例外;④一種基于TLB 的MMU,通過(guò)編程使得訪問(wèn)任意存儲(chǔ)器頁(yè)都可以產(chǎn)生特定的例外。
對(duì)于沒(méi)有調(diào)試接口的處理器目前主要是通過(guò)在軟件和硬件設(shè)計(jì)中充分考慮可能的調(diào)試需求,再加上調(diào)試主機(jī)和被調(diào)試系統(tǒng)之間的通信機(jī)制來(lái)實(shí)現(xiàn)在線調(diào)試的。這種調(diào)試模式下,調(diào)試代碼需要插入到正常程序中,將調(diào)試信息輸出到調(diào)試主機(jī),同時(shí)還能夠接收調(diào)試主機(jī)發(fā)過(guò)來(lái)的命令做出各種響應(yīng)。該方法的主要缺陷是針對(duì)不同的調(diào)試需求,要不斷修改正常程序中的調(diào)試代碼,導(dǎo)致標(biāo)準(zhǔn)化和通用性程度不高。此處的UDM 在不對(duì)處理器內(nèi)核做修改的情況下即可使這類處理器建立起方便的調(diào)試機(jī)制,是一種不同于主流大型處理器實(shí)現(xiàn)在線調(diào)試的方法。
3 通用調(diào)試模塊( UDM) 的工作原理
3. 1 系統(tǒng)描述
使用UDM 的調(diào)試系統(tǒng)框圖如圖1 所示,利用與FPGA 同在一塊PCB 板上的ARM、DSP 等處理器作為輔助調(diào)試用的嵌入式處理器( 下文中簡(jiǎn)稱為輔助處理器) ,簡(jiǎn)化了UDM 與調(diào)試主機(jī)之間的通信。通過(guò)輔助處理器的總線接口,UDM 中的各種控制和數(shù)據(jù)寄存器被直接映射到輔助處理器的Memory 空間。在輔助處理器開(kāi)發(fā)工具的Memory 窗口直接進(jìn)行數(shù)據(jù)讀寫(xiě)操作,就可實(shí)現(xiàn)對(duì)UDM 的操控,如圖4、圖5 所示。由于在一塊PCB 板上同時(shí)集成FPGA 和嵌入式處理器芯片是很常見(jiàn)的設(shè)計(jì),因此這種通信方式適用的范圍很廣。
圖1 應(yīng)用UDM 的調(diào)試系統(tǒng)框圖
UDM 直接作為FPGA 外部輔助調(diào)試的嵌入式處理器的外設(shè),如果在外部處理器總線掛接多個(gè)UDM 模塊,就能實(shí)現(xiàn)同時(shí)對(duì)多個(gè)處理器進(jìn)行調(diào)試。
UDM 通過(guò)產(chǎn)生調(diào)試中斷( DeBug Interrupt,DI) 信號(hào),使處理器響應(yīng)中斷并調(diào)用調(diào)試服務(wù)程序( DebugRoutine,DR) 。UDM 通過(guò)監(jiān)測(cè)處理器的取指令地址( Instruction Address, IA) 產(chǎn)生DI 信號(hào)。PicoBlaze 在運(yùn)行DR 時(shí)可通過(guò)其總線接口訪問(wèn)UDM,從而實(shí)現(xiàn)調(diào)試信息的輸出和對(duì)調(diào)試命令的響應(yīng)。
3. 2 斷點(diǎn)設(shè)置機(jī)制
產(chǎn)生DI 時(shí)由于處理器會(huì)立即執(zhí)行DR,從而中斷正常的執(zhí)行流程轉(zhuǎn)為為調(diào)試服務(wù),因此決定DI 產(chǎn)生的時(shí)機(jī)是實(shí)現(xiàn)斷點(diǎn)機(jī)制的核心。DI 信號(hào)是通過(guò)監(jiān)測(cè)處理器的取指令地址( Instruction Address, IA)產(chǎn)生的。直接通過(guò)一個(gè)比較器將IA 與一個(gè)數(shù)據(jù)比較一次只能設(shè)置一個(gè)斷點(diǎn),為了解決此矛盾采用了如下方法: 在UDM 中用雙口RAM 存儲(chǔ)斷點(diǎn)配置信息,使RAM 中的每1bit 與程序存儲(chǔ)區(qū)的一個(gè)地址對(duì)應(yīng)起來(lái),數(shù)據(jù)為1 代表設(shè)置了斷點(diǎn),0 代表沒(méi)有。
將輸入的IA 進(jìn)行地址變換后對(duì)RAM 存儲(chǔ)區(qū)尋址,使得RAM 在一端輸出一個(gè)正好代表輸出的地址處是否設(shè)置了斷點(diǎn)信息,再根據(jù)此數(shù)據(jù)就可生成正確的DI 信號(hào)。在雙口RAM 的另外一端,斷點(diǎn)設(shè)置情況可以方便地被修改。這樣一來(lái)可以設(shè)置的斷點(diǎn)個(gè)數(shù)變?yōu)橹饕躑DM 中雙口RAM 容量限制了。
3. 3 調(diào)試服務(wù)程序
只需在DR 中保證處理器不對(duì)目標(biāo)程序的內(nèi)外部環(huán)境造成改變,就等效于實(shí)現(xiàn)了處理器的掛起功能。因此,需要將DR 和目標(biāo)程序的執(zhí)行環(huán)境隔離開(kāi)來(lái),這可以通過(guò)對(duì)編譯器進(jìn)行某些設(shè)置或強(qiáng)制的編碼規(guī)范來(lái)實(shí)現(xiàn)。在處理器被掛起之后,DR 與外部調(diào)試主機(jī)通信,通過(guò)查詢命令寄存器的方式響應(yīng)調(diào)試主機(jī)發(fā)出的各種調(diào)試命令。這些命令包括: 將有關(guān)的調(diào)試信息搬移到外部調(diào)試主機(jī)可以觀察的緩存區(qū)中、修改Memory 空間中的數(shù)據(jù)、退出DR 使目標(biāo)程序繼續(xù)執(zhí)行等。由于DR 必須與目標(biāo)程序使用相互隔離的資源并且小型處理器中代碼容量,外部Memory空間大小等都比較受限,因此DR 的設(shè)計(jì)應(yīng)該盡可能占用較少的端口數(shù)、通用寄存器數(shù)和代碼總行數(shù)。[!--empirenews.page--]
4 設(shè)計(jì)實(shí)例
Xilinx 公司的PicoBlaze 是一種常用的小巧型處理器,它由ALU、程序計(jì)數(shù)器棧( 適用于嵌套子程序) 、16 個(gè)8 位通用寄存器、64 字節(jié)RAM 構(gòu)成的暫存器、程序計(jì)數(shù)器和控制器以及中斷支持電路構(gòu)成,其代碼容量為1024。本節(jié)以針對(duì)PicoBlaze 的應(yīng)用為例,設(shè)計(jì)了一個(gè)具體的UDM,并在Spartan3S5000FPGA 上進(jìn)行了實(shí)際驗(yàn)證。該UDM 使用的硬件資源為1 個(gè)18KB BRAM 和62 個(gè)Spartan - 3邏輯片,軟件資源為61 行匯編代碼,具備的功能如下:
·可同時(shí)在每一行代碼處設(shè)置斷點(diǎn),在沒(méi)有設(shè)置斷點(diǎn)的情況下,可強(qiáng)制產(chǎn)生DI,從而運(yùn)行DR 輸出調(diào)試信息;
·可以觀察到的調(diào)試信息為: 程序計(jì)數(shù)器PC的值、s0 ~ sb 寄存器、64byte 的暫存器,Memory 空間中的數(shù)據(jù),在DR 運(yùn)行時(shí)可以刷新上述調(diào)試信息。
4. 1 硬件實(shí)現(xiàn)
基于PicoBlaze 處理器應(yīng)用的UDM 硬件結(jié)構(gòu)如圖2 所示。UDM 與調(diào)試終端和PicoBlaze 都有總線接口,因此其內(nèi)部寄存器分為3 類: 僅受PicoBlaze控制,僅受輔助處理器控制以及受二者共同控制。
PicoBlaze 和輔助處理器分別在雙口RAM 的A、B 端口寫(xiě)入數(shù)據(jù)。為了減少占用PicoBlaze 的I /O端口,PicoBlaze 在向雙口RAM 寫(xiě)入數(shù)據(jù)之前先向RAM尋址寄存器寫(xiě)入地址,然后通過(guò)寫(xiě)數(shù)據(jù)輸出寄存器將數(shù)據(jù)寫(xiě)入前一操作指定的地址中。
圖2 UDM 的內(nèi)部電路結(jié)構(gòu)框圖
雙口RAM 的B 端口連接到輔助處理器的總線,數(shù)據(jù)位寬為16,可訪問(wèn)的地址范圍為0 ~ 255,地址0 ~ 165 作為交互調(diào)試數(shù)據(jù)的緩存區(qū),地址192 ~255 用于存儲(chǔ)斷點(diǎn)設(shè)置信息。每一個(gè)寄存器中存放16 行代碼的斷點(diǎn)設(shè)置情況,由于PicoBlaze 的代碼容量為1024 行,故只需占用64 個(gè)寄存器,例如地址為193 的數(shù)據(jù)為0x4080 則表示第24 和31 行設(shè)置了斷點(diǎn)。雙口RAM 的A 端口數(shù)據(jù)位寬為8,在DR 運(yùn)行時(shí)用于輸入調(diào)試信息,在目標(biāo)程序運(yùn)行時(shí)輸出斷點(diǎn)設(shè)置信息。因此在A 端口有一個(gè)地址選擇電路,使得輸入A 端口的地址在不同的情況下分別由RAM尋址寄存器和IA 決定。當(dāng)運(yùn)行目標(biāo)程序時(shí),A 端口輸入的地址為IA 的高7 位加上偏移量0x180,輸出的8bit 數(shù)據(jù)再經(jīng)IA 的低3 位尋址輸出1bit 數(shù)據(jù),這樣得到的數(shù)據(jù)正好反映了與IA 對(duì)應(yīng)的代碼是否設(shè)置了斷點(diǎn)。中斷信號(hào)產(chǎn)生電路根據(jù)上述數(shù)據(jù)和中斷信號(hào)的時(shí)序要求,產(chǎn)生輸出給處理器的DI 信號(hào)。
調(diào)試命令寄存器由PicoBlaze 和輔助處理器共同控制,輔助處理器向該寄存器寫(xiě)不同的數(shù)代表不同的調(diào)試命令。在運(yùn)行DR 時(shí)通過(guò)查詢?cè)摷拇嫫鱽?lái)實(shí)現(xiàn)對(duì)各種調(diào)試命令的響應(yīng),在響應(yīng)調(diào)試命令之前PicoBlaze 將調(diào)試命令寄存器清0,作為與輔助處理器的握手操作機(jī)制。當(dāng)向調(diào)試命令寄存器寫(xiě)3 時(shí),不管是否設(shè)置了斷點(diǎn)都會(huì)立即產(chǎn)生DI 信號(hào)。
4. 2 軟件實(shí)現(xiàn)
在基于PicoBlaze 的應(yīng)用中,為了減少代碼容量,DR 的流程比較簡(jiǎn)單。在初始化準(zhǔn)備之后,依次將s0 ~ sb 寄存器、64byte 的內(nèi)部RAM,Memory 空間中的數(shù)據(jù)輸出到雙口RAM 中,然后陷入一個(gè)等待和處理調(diào)試命令的循環(huán)中。目標(biāo)程序和DR 執(zhí)行環(huán)境的隔離通過(guò)限制目標(biāo)程序只允許修改寄存器s0 ~sb 以及64byte 的內(nèi)部RAM,而DR 只允許修改寄存器se ~ sf 來(lái)實(shí)現(xiàn)。只有當(dāng)調(diào)試命令為退出調(diào)試時(shí),DR 程序才會(huì)結(jié)束,PicoBlaze 又返回到目標(biāo)程序的執(zhí)行。當(dāng)調(diào)試命令為刷新調(diào)試信息時(shí),PicoBlaze 將重復(fù)一次初始化和調(diào)試信息輸出的過(guò)程。
4. 3 實(shí)際驗(yàn)證和使用情況
在應(yīng)用UDM 之前,首先通過(guò)NC - verilog 對(duì)其進(jìn)行了仿真,部分仿真波形如圖3 所示。圖中反映的是當(dāng)作為DI 的信號(hào)pdm_ int 產(chǎn)生了之后,PicoBlaze怎樣轉(zhuǎn)入執(zhí)行DR 的,限于篇幅,驗(yàn)證其他各種功能的仿真波形不在此贅述。
圖3 UDM 的部分仿真波形
為了進(jìn)一步對(duì)UDM 的功能和性能進(jìn)行完備的檢驗(yàn),在FPGA 中建立了如下簡(jiǎn)單的PicoBlaze 處理器系統(tǒng)。PicoBlaze 外部只接一塊252X8bit 的RAM和UDM,PicoBlaze 上的目標(biāo)程序流程為如下的死循環(huán): 將s0 ~ sb 依次置入0 ~ 11,再反過(guò)來(lái)依次置入11 ~ 0; 將64byte 的RAM 依次寫(xiě)入0 ~ 63,再反過(guò)來(lái)寫(xiě)入63 ~ 0; 將外部的RAM 依次寫(xiě)入0 ~ 251,再反過(guò)來(lái)寫(xiě)入255 ~ 4。這樣的一種簡(jiǎn)單設(shè)計(jì),可以保證從輸出的調(diào)試信息直接看出處理器在哪行代碼處響應(yīng)了斷點(diǎn)。
如圖4 所示為在調(diào)試主機(jī)上進(jìn)行調(diào)試控制的界面。偏移地址0x184 處的1040 表明在38 與44 兩行代碼處設(shè)置了斷點(diǎn),事實(shí)上從地址0x180 ~ 0x1ff處都可以設(shè)置斷點(diǎn)。地址0x200 處為當(dāng)前的PC 值,通過(guò)向地址0x208 處寫(xiě)1 可使其更新; 地址0x202處為UDM 的使能位,當(dāng)其為1 時(shí)UDM 才被使能; 地址0x204 為調(diào)試命令寄存器,向其寫(xiě)1 使處理器從斷點(diǎn)退出,寫(xiě)2 使處理器刷新調(diào)試信息,寫(xiě)3 使處理器強(qiáng)制進(jìn)入DR 輸出調(diào)試信息; 地址0x206 處表示調(diào)試狀態(tài),當(dāng)其為3 時(shí)表明處理器在運(yùn)行DR,并且調(diào)試信息已經(jīng)輸出完畢。
圖4 使用UDM 調(diào)試的控制界面
顯示調(diào)試信息的界面如圖5 所示,地址0x00 ~0x0b 顯示寄存器s0 ~ sb 的數(shù)據(jù),地址0x0c ~ 0x3b顯示內(nèi)部64byte 存儲(chǔ)器的數(shù)據(jù),地址0x4c ~ 0x14b顯示PicoBlaze 外部Memory 空間的數(shù)據(jù)。由于圖5中斷點(diǎn)正好設(shè)置在完成依次向PicoBlaze 的Memory空間依次寫(xiě)0 ~ 251 之后,因此顯示的數(shù)據(jù)是遞增的。當(dāng)斷點(diǎn)正好設(shè)置在完成依次向Pico Blaze 的Memory 空間依次寫(xiě)255 ~ 4 之后,所顯示的數(shù)據(jù)就變?yōu)檫f減。在很多其他斷點(diǎn)處顯示的調(diào)試信息與斷點(diǎn)設(shè)置的位置也符合預(yù)期的情況,因此UDM 完全可以正確而高效地工作。
圖5 在第44 行斷點(diǎn)處顯示的調(diào)試信息
在開(kāi)發(fā)一款信號(hào)處理芯片的FPGA 原型設(shè)計(jì)中,跟蹤處理、電文處理、整體流程控制分別由一個(gè)PicoBlaze 完成,并且由于FPGA 資源的限制采用大型處理器來(lái)替代上述處理器幾乎不可能。由于輸入PicoBlaze 的數(shù)據(jù)和控制信號(hào)復(fù)雜,仿真驗(yàn)證不能很好地覆蓋各種實(shí)際的使用情形。通過(guò)使用這里的基于PicoBlaze 處理器設(shè)計(jì)的UDM,方便地實(shí)現(xiàn)了對(duì)上述3 個(gè)PicoBlaze 的在線調(diào)試,對(duì)提高開(kāi)發(fā)效率發(fā)揮了重要作用。在其他使用PicoBlaze 的工程應(yīng)用中,上述UDM 也得到了很好的推廣。
5 結(jié)束語(yǔ)
設(shè)計(jì)了一種通用調(diào)試模塊,用于輔助無(wú)調(diào)試接口的處理器建立標(biāo)準(zhǔn)的調(diào)試機(jī)制。通過(guò)該模塊的使用,提出了一種通用、標(biāo)準(zhǔn)、方便的調(diào)試方法,很好地滿足了在SOPC 系統(tǒng)中對(duì)多個(gè)沒(méi)有調(diào)試接口的小巧型處理器實(shí)現(xiàn)在線調(diào)試的迫切需求。新方法通過(guò)產(chǎn)生調(diào)試中斷使處理器跳轉(zhuǎn)到調(diào)試服務(wù)程序中的方式實(shí)現(xiàn)處理器的掛起,通過(guò)基于雙端口RAM 中一種巧妙的地址映射機(jī)制實(shí)現(xiàn)同時(shí)對(duì)多行代碼設(shè)置斷點(diǎn)的功能,通過(guò)調(diào)試服務(wù)程序?qū)崿F(xiàn)數(shù)據(jù)搬移等調(diào)試命令。新方法還具有易于擴(kuò)展,可以同時(shí)調(diào)試多個(gè)嵌入式處理器的優(yōu)點(diǎn)。新的調(diào)試方法在工程實(shí)踐中對(duì)提高調(diào)試效率發(fā)揮了重要作用,是一種普適的,應(yīng)用價(jià)值明顯的調(diào)試方法。