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