吳舜曉,張 建,黃仰博,陳 亮,孫廣富
(國防科技大學電子科學與工程學院衛星導航定位研發中心,長沙410073)
在FPGA設計中使用嵌入式處理器軟核(如MicroBlaze、PicoBlaze等)構成可編程片上系統(System On Programmable Chip,SOPC),相比于 ASIC 具有更好的可修改性和可維護性,得到了普遍的應用[1]。由于ARM,MicroBlaze等大型處理器內核具備調試接口,在與之對應的調試模塊配合下,調試軟件可以通過JTAG接口實現:執行到斷點處掛起、單步執行、查看處理器內部狀態、查看和修改Memory空間中的數據等基本的在線調試功能[2-3]。上述基本的在線調試功能對嵌入式系統的調試具有重要意義。
對于PicoBlaze等占用資源少、設計開發簡單的小巧型處理器,一般不具備調試接口,然而在SOPC系統設計中經常需要使用上述處理器。使用上述處理器時,由于沒有調試接口,屬于大型處理器的標準高效的調試機制不再能夠使用,因此通過指令集仿真(ISS,Cycle-accurate Instruction Set Simulation)和利用仿真工具對含有處理器的系統進行軟硬件協同仿真是確保設計正確性的重要途徑[4]。然而在諸如接收機基帶信號處理等系統的設計中,仿真所用的測試用例往往覆蓋率不夠,或者在發現故障以后很難構造出與之相應的測試用例。因此迫切需要使在線調試功能能夠方便地擴展到一般的處理器上。
針對上述應用需求,這里提出的新調試方法通過引入一種通用的調試模塊(Universal Debug Module,UDM)可以使沒有調試接口的處理器建立起標準的調試機制。該調試模塊利用處理器的中斷機制實現處理器響應斷點(breakpoint)的機制,利用基于雙端口RAM中一種巧妙的地址映射機制實現同時對多行代碼設置斷點的功能,并且能夠方便地實現被調試系統和調試主機之間調試信息和命令的交互。UDM還具有易于擴展的優點,當SOPC系統中有多個處理器時可以共用一個UDM。
嵌入式處理器的主流在線調試方法,目前主要有2種:后臺調試模式(backgroud debug mode,BDM)技術和基于IEEE P1149.1協議的JTAG調試技術。BDM技術在Motolora微控制器中得到了大量的應用,ARM,MIPS和PowerPC等處理器都具有基于JTAG技術的在片調試功能,如ARM公司提出了基于JTAG技術的RDI調試接口標準,主要用于ARM芯片的調試[5]。處理器內核中通過增加支持調試的擴展設計,可在預留的調試接口輸入簡單的控制信號,以實現:處理器掛起(Halt)、輸出PC值和通用寄存器值、輸出和修改Memory空間中的數據等基本的原始調試操作[2-3]。通常上述調試接口的設計與指令集架構相關,如MIPS32提供如下一些調試方法[5]:①斷點指令BREAK;②一些自陷指令TRAP;③特殊控制寄存器WATCH,通過編程使得特定的load/store操作以及取指操作產生特殊的例外;④一種基于TLB的MMU,通過編程使得訪問任意存儲器頁都可以產生特定的例外。
對于沒有調試接口的處理器目前主要是通過在軟件和硬件設計中充分考慮可能的調試需求,再加上調試主機和被調試系統之間的通信機制來實現在線調試的。這種調試模式下,調試代碼需要插入到正常程序中,將調試信息輸出到調試主機,同時還能夠接收調試主機發過來的命令做出各種響應。該方法的主要缺陷是針對不同的調試需求,要不斷修改正常程序中的調試代碼,導致標準化和通用性程度不高。此處的UDM在不對處理器內核做修改的情況下即可使這類處理器建立起方便的調試機制,是一種不同于主流大型處理器實現在線調試的方法。
使用UDM的調試系統框圖如圖1所示,利用與FPGA同在一塊PCB板上的ARM、DSP等處理器作為輔助調試用的嵌入式處理器(下文中簡稱為輔助處理器),簡化了UDM與調試主機之間的通信。通過輔助處理器的總線接口,UDM中的各種控制和數據寄存器被直接映射到輔助處理器的Memory空間。在輔助處理器開發工具的Memory窗口直接進行數據讀寫操作,就可實現對UDM的操控,如圖4、圖5所示。由于在一塊PCB板上同時集成FPGA和嵌入式處理器芯片是很常見的設計,因此這種通信方式適用的范圍很廣。

圖1 應用UDM的調試系統框圖
UDM直接作為FPGA外部輔助調試的嵌入式處理器的外設,如果在外部處理器總線掛接多個UDM模塊,就能實現同時對多個處理器進行調試。UDM通過產生調試中斷(DeBug Interrupt,DI)信號,使處理器響應中斷并調用調試服務程序(Debug Routine,DR)。UDM通過監測處理器的取指令地址(Instruction Address,IA)產生 DI信號。PicoBlaze在運行DR時可通過其總線接口訪問UDM,從而實現調試信息的輸出和對調試命令的響應。
產生DI時由于處理器會立即執行DR,從而中斷正常的執行流程轉為為調試服務,因此決定DI產生的時機是實現斷點機制的核心。DI信號是通過監測處理器的取指令地址(Instruction Address,IA)產生的。直接通過一個比較器將IA與一個數據比較一次只能設置一個斷點,為了解決此矛盾采用了如下方法:在UDM中用雙口RAM存儲斷點配置信息,使RAM中的每1bit與程序存儲區的一個地址對應起來,數據為1代表設置了斷點,0代表沒有。將輸入的IA進行地址變換后對RAM存儲區尋址,使得RAM在一端輸出一個正好代表輸出的地址處是否設置了斷點信息,再根據此數據就可生成正確的DI信號。在雙口RAM的另外一端,斷點設置情況可以方便地被修改。這樣一來可以設置的斷點個數變為主要受UDM中雙口RAM容量限制了。
只需在DR中保證處理器不對目標程序的內外部環境造成改變,就等效于實現了處理器的掛起功能。因此,需要將DR和目標程序的執行環境隔離開來,這可以通過對編譯器進行某些設置或強制的編碼規范來實現。在處理器被掛起之后,DR與外部調試主機通信,通過查詢命令寄存器的方式響應調試主機發出的各種調試命令。這些命令包括:將有關的調試信息搬移到外部調試主機可以觀察的緩存區中、修改Memory空間中的數據、退出DR使目標程序繼續執行等。由于DR必須與目標程序使用相互隔離的資源并且小型處理器中代碼容量,外部Memory空間大小等都比較受限,因此DR的設計應該盡可能占用較少的端口數、通用寄存器數和代碼總行數。
Xilinx公司的PicoBlaze是一種常用的小巧型處理器,它由ALU、程序計數器棧(適用于嵌套子程序)、16個8位通用寄存器、64字節RAM構成的暫存器、程序計數器和控制器以及中斷支持電路構成,其代碼容量為1024[4]。本節以針對PicoBlaze的應用為例,設計了一個具體的 UDM,并在 Spartan3S5000 FPGA上進行了實際驗證。該UDM使用的硬件資源為1個18KB BRAM和62個Spartan-3邏輯片,軟件資源為61行匯編代碼,具備的功能如下:
·可同時在每一行代碼處設置斷點,在沒有設置斷點的情況下,可強制產生DI,從而運行DR 輸出調試信息;
·可以觀察到的調試信息為:程序計數器PC的值、s0~sb寄存器、64byte的暫存器,Memory空間中的數據,在DR運行時可以刷新上述調試信息。
基于PicoBlaze處理器應用的UDM硬件結構如圖2所示。UDM與調試終端和PicoBlaze都有總線接口,因此其內部寄存器分為3類:僅受PicoBlaze控制,僅受輔助處理器控制以及受二者共同控制。PicoBlaze和輔助處理器分別在雙口RAM的A、B端口寫入數據。為了減少占用PicoBlaze的I/O端口,PicoBlaze在向雙口RAM寫入數據之前先向RAM尋址寄存器寫入地址,然后通過寫數據輸出寄存器將數據寫入前一操作指定的地址中。

圖2 UDM的內部電路結構框圖
雙口RAM的B端口連接到輔助處理器的總線,數據位寬為16,可訪問的地址范圍為0~255,地址0~165作為交互調試數據的緩存區,地址192~255用于存儲斷點設置信息。每一個寄存器中存放16行代碼的斷點設置情況,由于PicoBlaze的代碼容量為1024行,故只需占用64個寄存器,例如地址為193的數據為0x4080則表示第24和31行設置了斷點。雙口RAM的A端口數據位寬為8,在DR運行時用于輸入調試信息,在目標程序運行時輸出斷點設置信息。因此在A端口有一個地址選擇電路,使得輸入A端口的地址在不同的情況下分別由RAM尋址寄存器和IA決定。當運行目標程序時,A端口輸入的地址為IA的高7位加上偏移量0x180,輸出的8bit數據再經IA的低3位尋址輸出1bit數據,這樣得到的數據正好反映了與IA對應的代碼是否設置了斷點。中斷信號產生電路根據上述數據和中斷信號的時序要求,產生輸出給處理器的DI信號。
調試命令寄存器由PicoBlaze和輔助處理器共同控制,輔助處理器向該寄存器寫不同的數代表不同的調試命令。在運行DR時通過查詢該寄存器來實現對各種調試命令的響應,在響應調試命令之前PicoBlaze將調試命令寄存器清0,作為與輔助處理器的握手操作機制。當向調試命令寄存器寫3時,不管是否設置了斷點都會立即產生DI信號。
在基于PicoBlaze的應用中,為了減少代碼容量,DR的流程比較簡單。在初始化準備之后,依次將s0~sb寄存器、64byte的內部RAM,Memory空間中的數據輸出到雙口RAM中,然后陷入一個等待和處理調試命令的循環中。目標程序和DR執行環境的隔離通過限制目標程序只允許修改寄存器s0~sb以及64byte的內部RAM,而DR只允許修改寄存器se~sf來實現。只有當調試命令為退出調試時,DR程序才會結束,PicoBlaze又返回到目標程序的執行。當調試命令為刷新調試信息時,PicoBlaze將重復一次初始化和調試信息輸出的過程。
在應用UDM之前,首先通過NC-verilog對其進行了仿真,部分仿真波形如圖3所示。圖中反映的是當作為DI的信號pdm_int產生了之后,Pico Blaze怎樣轉入執行DR的,限于篇幅,驗證其他各種功能的仿真波形不在此贅述。

圖3 UDM的部分仿真波形
為了進一步對UDM的功能和性能進行完備的檢驗,在FPGA中建立了如下簡單的PicoBlaze處理器系統。PicoBlaze外部只接一塊252X8bit的RAM和UDM,PicoBlaze上的目標程序流程為如下的死循環:將s0~sb依次置入0~11,再反過來依次置入11~0;將64byte的RAM依次寫入0~63,再反過來寫入63~0;將外部的RAM依次寫入0~251,再反過來寫入255~4。這樣的一種簡單設計,可以保證從輸出的調試信息直接看出處理器在哪行代碼處響應了斷點。
如圖4所示為在調試主機上進行調試控制的界面。偏移地址0x184處的1040表明在38與44兩行代碼處設置了斷點,事實上從地址0x180~0x1ff處都可以設置斷點。地址0x200處為當前的PC值,通過向地址0x208處寫1可使其更新;地址0x202處為UDM的使能位,當其為1時UDM才被使能;地址0x204為調試命令寄存器,向其寫1使處理器從斷點退出,寫2使處理器刷新調試信息,寫3使處理器強制進入DR輸出調試信息;地址0x206處表示調試狀態,當其為3時表明處理器在運行DR,并且調試信息已經輸出完畢。

圖4 使用UDM調試的控制界面
顯示調試信息的界面如圖5所示,地址0x00~0x0b顯示寄存器s0~sb的數據,地址0x0c~0x3b顯示內部64byte存儲器的數據,地址0x4c~0x14b顯示PicoBlaze外部Memory空間的數據。由于圖5中斷點正好設置在完成依次向PicoBlaze的Memory空間依次寫0~251之后,因此顯示的數據是遞增的。當斷點正好設置在完成依次向 Pico Blaze的Memory空間依次寫255~4之后,所顯示的數據就變為遞減。在很多其他斷點處顯示的調試信息與斷點設置的位置也符合預期的情況,因此UDM完全可以正確而高效地工作。

圖5 在第44行斷點處顯示的調試信息
在開發一款信號處理芯片的FPGA原型設計中,跟蹤處理、電文處理、整體流程控制分別由一個PicoBlaze完成,并且由于FPGA資源的限制采用大型處理器來替代上述處理器幾乎不可能。由于輸入PicoBlaze的數據和控制信號復雜,仿真驗證不能很好地覆蓋各種實際的使用情形。通過使用這里的基于PicoBlaze處理器設計的UDM,方便地實現了對上述3個PicoBlaze的在線調試,對提高開發效率發揮了重要作用。在其他使用PicoBlaze的工程應用中,上述UDM也得到了很好的推廣。
設計了一種通用調試模塊,用于輔助無調試接口的處理器建立標準的調試機制。通過該模塊的使用,提出了一種通用、標準、方便的調試方法,很好地滿足了在SOPC系統中對多個沒有調試接口的小巧型處理器實現在線調試的迫切需求。新方法通過產生調試中斷使處理器跳轉到調試服務程序中的方式實現處理器的掛起,通過基于雙端口RAM中一種巧妙的地址映射機制實現同時對多行代碼設置斷點的功能,通過調試服務程序實現數據搬移等調試命令。新方法還具有易于擴展,可以同時調試多個嵌入式處理器的優點。新的調試方法在工程實踐中對提高調試效率發揮了重要作用,是一種普適的,應用價值明顯的調試方法。
[1]潘松,黃繼業,曾毓.SOPC技術實用教程[M].北京:清華大學出版社,2005.
[2]陳艷華.基于ARM的嵌入式系統開發與實例[M].北京:人民郵電出版社,2008.
[3]龍霞飛,李仁發.Microblaze微處理器IP Core的結構及應用[C].北京:中國計算機學會,2004.
[4]Hempel,Gerald;Hochberger, Christian.A resource optimized Processor Core for FPGA based SoCs[C].Digital System Design:Architecture,Methods and Tools(DSD),Lubeck,Germany:10th Euromicro Conference,2007.
[5]黃海林,范東睿,許彤,等.嵌入式處理器在片調試功能的設計與實現[J].計算機輔助設計與圖形學學報,2006,18(7):1005 -1010.