高延海 樊 茂
(中國船舶集團有限公司第七二二研究所 武漢 430205)
近年來隨著國家信息產業政策的推動,國產處理器發展勢頭迅猛,推出了包括申威、龍芯、飛騰在內的一系列國產處理器,覆蓋了從嵌入式系統到高性能計算等各領域,自主可控水平得到了較大的提高。國產處理器的自主可控,在很大程度上還依賴于其生態的建設,調試開發工具是其中必要的一環。國產處理器一般只有處理器廠商提供的專用調試開發工具可供選擇,而國外處理器普遍有第三方專業廠商為其提供調試開發工具,選擇余地更大,功能更完善。因此國產處理器生態在調試開發工具這一環,相比國外處理器還有一定的差距。
申威處理器[1]依托國家“863”和“核高基”專項,十余年發展與積累過程中,歷經三代核心的開發,在多個領域得到成功應用。對于申威處理器應用系統硬件和底層軟件的調試,一般只能使用處理器廠商提供的JTAG調試工具。該調試工具提供了FLASH存儲器編程、內存讀寫等功能,可以滿足硬件調試和軟件固化的基本需求,但也存在一些不足之處:調試工具的硬件為定制開發,成本較高;不能對JTAG底層通信協議進行調試,若JTAG通信故障則難以定位原因;技術細節封閉,用戶無法在其基礎上擴展功能。針對上述問題,設計了一種基于開源硬件的JTAG調試工具,可實現對申威421處理器應用系統硬件與底層軟件的開發調試。
申威421處理器是64位字長的RISC架構高性能通用處理器[2],單芯片集成了4個申威Core3A核心,支持亂序發射、推測執行和雙訪存流水線技術[3]。處理器還集成了8MB的三級共享Cache、兩路64位DDR3存儲控制器、兩路第三代標準PCI-E接口、維護接口以及符合IEEE1149.1標準的測試接口。
典型的申威421應用系統一般由處理器搭配ICH2橋片[4]構成。ICH2橋片通過一個8通道的PCI-E 2.0接口與申威421互連,可以為應用系統擴展PCI-E、USB、SATA等高速外設接口,以及UART、PS/2、I2C等傳統的通用外設接口。ICH2橋片內部還集成了一個圖形圖像子系統及一個顯存控制器,可以為應用系統提供集成顯卡功能。ICH2橋片有比較多的配置參數,存儲在外部的參數FLASH存儲器中。圖1是一個典型的申威421應用系統組成框圖。

圖1 申威421應用系統框圖
JTAG技術即邊界掃描測試技術,由聯合測試行動組(JTAG)最初提出[5],并于 1990年形成了IEEE 1149.1標準,也稱為JTAG標準。JTAG技術主要用于芯片的測試,若電路板上有支持JTAG功能的器件,JTAG技術也可用于對電路板進行測試[6]。
邊界掃描技術需要在芯片內緊鄰器件引腳處設置移位寄存器[7],從而使處于器件邊界的信號可以通過掃描測試技術進行監視或控制。為了支持邊界掃描,集成電路器件必須有4個專用的引腳:TCK、TMS、TDI和TDO。這4個引腳組成了測試訪問端口(TAP),也稱為JTAG端口。JTAG端口用于外部測試設備與器件內部的邊界掃描邏輯進行通信。器件內邊界掃描功能模塊中包含有一個指令寄存器(IR)和一組數據寄存器(DR),可以通過JTAG端口對這些寄存器進行讀寫,以實現邊界掃描測試功能。邊界掃描功能模塊的核心是一個TAP控制器,為一有限狀態機,包含16個狀態。通過TCK和TMS可以控制TAP狀態的遷移,產生邊界掃描邏輯的內部控制信號。TAP控制器狀態遷移如圖2所示。TDI和TDO用來對邊界掃描邏輯中寄存器數據的移入、移出。

圖2 TAP控制器狀態圖
JTAG端口初衷是用于對芯片進行測試,然而對于具有邊界掃描測試功能的處理器,JTAG端口也往往用于對處理器應用系統進行調試。處理器應用系統的調試一般有ICE和OCD兩種方案[8]。ICE方案需要為處理器設計專用的仿真器,模擬處理器的所有功能,成本極高,而且對于復雜處理器,實現起來非常困難。目前主流的是OCD方案。OCD即片上調試,需要在處理器內部添加一個專門的硬件模塊,用于支持調試功能。該硬件模塊能夠訪問處理器的內部資源,并有與外部調試設備進行通信的端口。為了減少硬件資源消耗,該通信端口往往與JTAG端口復用[9],因此從用戶視角,就是通過JTAG端口對處理器進行調試。
申威421處理器具有符合IEEE 1149.1標準的JTAG端口,可以進行邊界掃描測試及維護調試操作。申威421處理器JTAG端口的指令寄存器長度為 8位,除了有 BYPASS、IDCODE、SAMPLE/PRELOAD等標準指令外,還有兩條自定義指令CHAINADDR和RUNSCAN。申威421的JTAG數據寄存器中,和JTAG調試相關的有兩個寄存器:測試地址寄存器、調試接口寄存器。當給JTAG指令寄存器寫入CHAINADDR指令后,即可對測試地址寄存器進行設置,選擇調試接口寄存器作為SAMPLE/PRELOAD指令的操作對象。調試接口寄存器中包含數據、命令、目標寄存器、校驗等位段,通過對該寄存器的讀寫實現與維護調試模塊的通信,執行對處理器的所有維護調試操作,如圖3所示。

圖3 調試操作流程
申威421處理器的維護串口也可以對維護調試模塊進行訪問。維護串口的MT_RX_H信號必須外接上拉電阻,避免與JTAG端口同時對維護調試模塊進行訪問而發生沖突,無法進行正常的調試操作。
在設計硬件時,需要關注JTAG端口的信號完整性,特別是TCK的信號質量。JTAG數據的移位與采樣都是通過TCK信號控制,TCK信號上的串擾、反射等信號質量問題,會造成JTAG數據誤移位或誤采樣,甚至使TAP控制器狀態錯亂。在PCB設計時,JTAG連接器應盡量靠近處理器擺放,縮短JTAG信號線的長度。必要時還要通過端接、濾波等措施,改善JTAG信號的質量。另外JTAG調試電纜經常插拔,易受靜電影響,信號線在靠近JTAG插座附近應使用TVS管等保護器件,避免處理器JTAG端口被靜電損傷。
JTAG調試工具的硬件是連接PC主機與目標系統的JTAG控制器,負責產生符合IEEE 1149.1規范的JTAG信號時序。部分處理器廠商為推廣自家的產品,開源了JTAG調試器的設計資料,如ARM的DAPLink,TI的XDS100系列等。申威處理器只需要標準的JTAG信號就可以進行調試,因此綜合考慮成本與周期,以及避免不必要的重復投入,選擇了開源的XDS100V2商業現貨調試器作為JTAG調試工具的硬件平臺。
XDS100V2調試器[10]用于TI公司的DSP、ARM等處理器產品的調試。TI公開了XDS100V2的所有設計資料,任何第三方廠家都可以根據公開的資料生產和銷售XDS100V2調試器。XDS100V2硬件的核心是一片FTDI公司的FT2232芯片,可以實現USB接口到SPI、JTAG等同步串口的轉換,設計緊湊,成本低廉。XDS100V2通過USB 2.0接口與主機通信,JTAG端口最高工作頻率達15M,對大多數的調試操作性能可以滿足要求。
在正式進行調試之前,對JTAG鏈路功能進行測試,性能進行摸底,能夠排除JTAG鏈路中可能存在的故障,并使調試器以最高的性能工作,對順利、高效地完成調試工作十分有益。對JTAG鏈路采用數據環回的方式進行測試。JTAG端口進行寄存器移位操作時,當寄存器中的數據全部移出后,若TAP控制器仍停留在Shift-IR或Shift-DR狀態,接下來移出的將是從TDI移入的數據,即實現了數據環回。測試數據可以采用PRBS偽隨機序列,也可以采用固件鏡像等數據。
在數據環回測試的開始,首先復位TAP控制器,指令寄存器被初始化為 IDCODE[12],進行數據寄存器的移位操作移出的將是處理器ID。然后TAP控制器狀態轉換到Shift-DR狀態,進行數據移位操作。最開始移出的32位數據與處理器ID比較,后面移出的數據與從TDI移入的數據進行比較,若出現數據不一致的情況,則中斷測試,保存移出的數據,提示出錯數據的位置,供測試人員進行分析。
經過測試,在目標開發板上,調試器可以穩定工作在15M的最高頻率,遠超XDS100V2標準的1M工作頻率,也高于申威421手冊中給出10M的工作頻率,大大提高了調試工具性能的上限。
調試器與處理器建立連接,第一步要確認JTAG鏈路可以正常工作,第二步確認連接的是正確的目標處理器,第三步確認目標處理器處于正常的工作狀態。以上三步都成功以后,則說明硬件已處于就緒狀態,可以進行調試操作。JTAG標準中規定,Capture指令寄存器獲取的值,最低兩位必須是2’b01。因此第一步可以通過Capture指令寄存器,并判斷指令寄存器的最低兩位是否符合標準來實施。第二步可以通過IDCODE指令讀取處理器ID,與申威處理器ID值0x0006a001比較來實現。第三步首先要將申威421處理器的JTAG端口置于維護調試模式,然后讀取維護調試模塊中的狀態寄存器,獲取處理器當前的運行狀態。連接處理器的流程如圖4所示。

圖4 調試器連接處理器流程
4.3.1 申威421的FLASH存儲器接口
申威421有SPI FLASH存儲器接口,可以支持最大容量為16MB的FLASH存儲器。啟動時處理器從FLASH中讀取硬件配置參數并加載固件。申威421的FLASH訪問地址在I/O地址空間,并且地址不連續,每8個字節占用128字節的地址,因此處理器不能直接從FLASH中取指令運行,必須將FLASH中的代碼加載到系統內存或內核Cache中才能運行。申威421內部有FLASH控制器,可自動生成編程、擦除等操作的信號時序。
4.3.2 影響調試效率的主要因素
主機與調試器間數據傳送的組織方式,是影響調試效率的主要因素。主機與調試器間的USB口通過BULK方式傳輸數據[13],一次傳輸的數據量越大,則USB傳輸帶寬的利用率就越高。如果頻繁地進行短數據包通信,開銷所占比例將大大增加,實際的傳輸速率將遠遠低于理想的速率。從圖3中可以看到,申威處理器標準調試流程需要對調試指令的完成狀態進行查詢,以判斷是否可向處理器發出下一條調試指令,這就決定了主機與調試器之間只能以短數據包進行通信,并且需要主機頻繁地進行判斷與干預,嚴重影響調試操作的效率。
4.3.3 高效的調試操作流程
由于常規調試操作流程的效率低,為了提高FLASH編程的速率,必須設計一個新的調試操作流程。新的調試流程中,發送調試指令不需要確認上一條調試指令的完成情況,在一個USB數據包中可一次傳送多條調試指令給調試器。在調試指令之間,插入相應的延時指令和狀態查詢指令。指令數據包的格式如圖5所示。

圖5 JTAG指令數據包格式
延時指令就是保持TAP控制器在Run-Test-Idle狀態下一定數量的TCK周期,用于給調試指令的執行留出一定的時間。如果延時短于調試指令執行所需時間,則其后的調試指令就會在上一條調試指令未完成的情況下發送給處理器。新的調試指令可能會被拒絕接收,也可能會影響上一條調試指令的正常執行。對于FLASH編程這樣的調試操作,造成的最壞結果就是當前FLASH存儲單元編程失敗,而不會產生破壞性的后果,因此FLASH編程操作可以使用新流程。
主機會重新執行操作失敗的調試指令。為了使調試指令盡可能一次成功完成,延時指令的延時需要大于調試指令執行所需的時間,但又要近可能的接近,這樣既保證了成功率,也不降低效率。由于最初并不知道調試指令執行所需的確切時間,所以新流程中還需要實現延時的自適應調整。最開始設置一個較短的延時值,此后自動將延時周期數調整到最恰當的值。
延時周期的自適應調整需要結合查詢指令來進行。查詢指令用于查詢相關調試指令的操作是否完成,與常規流程不同的是,JTAG調試器在執行完查詢指令后,緊接著就執行下一條調試指令,中間不存在主機進行判斷與干預的過程。主機在收到指令數據包中所有查詢指令的查詢結果后,對數據包中調試指令的執行情況進行判斷,如果有調試指令未完成操作,則該調試指令以及此后的所有調試指令都將重新執行,并且增加延時指令的延時值。經過有限次的重傳指令和增加延時,延時周期就可以調整到最佳值,如圖6所示。

圖6 高效的調試操作流程
經過實際運行比較,采用標準的調試操作流程,固化2M字節的BIOS到FLASH,需要近3min。而采用新的流程,同樣的操作只需約20s。顯然,新調試操作流程確實能夠大幅提高調試操作的效率。
4.4.1 BIOS調試信息輸出機制
在進行固件調試時,我們需要固件運行過程中輸出一些文本調試信息以幫助調試。申威421處理器應用系統BIOS的調試信息不是通過串口或網口輸出,而是按順序寫到一個固定的內存區域。廠家提供的調試工具只能在用戶給出命令時,一次讀取所有BIOS調試信息并顯示,而不能實時顯示BIOS運行過程中新增的調試信息。作為固件調試人員,自然希望固件調試信息能夠像通過串口輸出一樣,可以即時顯示,實時監測固件的運行狀態。針對這個需求,為JTAG調試工具開發了BIOS調試信息實時顯示功能。
4.4.2 實時顯示調試信息
BIOS調試信息的顯示是基于內存讀取操作實現的。為實時顯示新的調試信息,軟件需要不斷的對調試信息內存區域進行查詢。在兩次查詢之間需要一定的時間間隔,這里設為100ms,對人的閱讀來說不會有感覺,也避免了因USB端口操作太過密集而占用過多的處理器資源。最初從調試信息內存區域的起始地址開始查詢。若查詢到有新的調試信息,則連續向調試器發送內存讀取指令,并在軟件的文本窗口中顯示新的調試信息,直到將新的調試信息全部讀取并顯示完畢,然后又從剩余的內存空間起始地址處開始反復進行間隔100ms的查詢。
由于維護調試模塊的內存讀取指令以128字節為單位且地址對界,因此每次讀取調試信息的操作所使用的地址必須是128字節對齊的,讀回的128字節數據中一般還包含原來的調試信息。所以判斷是否有新調試信息,需要記錄原調試信息最后一個字符在128字節中的偏移地址,在該偏移地址之后有新增的不為0數據,才是新的調試信息。圖7是對BIOS調試信息進行實時顯示的基本工作流程。

圖7 BIOS調試信息顯示基本工作流程
BIOS調試信息實時顯示功能的運行效果與通過串口輸出調試信息基本相同,實際上由于JTAG端口更高的工作頻率,比串口能更好地顯示大量快速更新的調試信息。
本文基于開源JTAG調試器設計了申威421應用系統JTAG調試工具,可以實現內存讀寫、FLASH編程等必要的調試功能。該JTAG調試工具可以進行JTAG鏈路性能測試,讓JTAG鏈路能夠工作在實際的最高性能下,同時還實現了一定程度的JTAG鏈路故障診斷功能,改善了JTAG鏈路故障難以調試的現狀。創新的調試指令執行流程,通過延時周期預測及自適應調整,大幅提高了調試操作的效率。由于硬件技術的開放,易于根據應用需求擴展功能,如BIOS調試信息的實時顯示等。通過設計申威421應用系統JTAG調試工具,為國產處理器調試開發工具提供了很好的補充,參與到了建設國產處理器生態圈、提高處理器自主可控水平的進程中。