摘 要: 介紹了TURBO52的研究背景及技術路線,在保持對經典8051指令集后向兼容的前題下,通過重新進行結構設計來提高系統性能。介紹了指令流水線的結構設計,包括兩路超標量結構、分支預測、動態執行和存儲管理。在FPGA上運行真實控制系統應用程序測試表明,在相同工作頻率下運行一系列系統軟件可達經典8051的30倍以上,最高指令吞吐率每時鐘周期兩條指令。但由于未實現三級存儲體系和數據高速緩存,工作在100 MHz以上性能的提升會受限。
關鍵詞: 8051單片機;嵌入式微處理器;結構設計;超標量流水線;動態調度;轉移猜測
8051指令集微處理器[1]自面世以來,以數以億計的規模應用于各個領域,至今仍占據嵌入式微處理器用量的首位。但另一方面,相對于近三十年通用微處理器Intel Pentium PIV[2]、龍芯1號[3]、龍芯2號[4、5]、MIPS1000[6]和近年來32位高端嵌入式微處理器及ARM11[7]體系結構突飛猛進的發展而言,對8051微處理器核的改動很小,這也使得現有8051指令集系列微處理器受24 MHz工作頻率、24周期一條指令、256 B的變量空間和64 KB的數據空間[1]的局限,在運行基于操作系統的高端嵌入式應用時變得非常困難。
Turbo52微處理器的設計背景是現有系統控制軟件都基于8051指令集開發環境,但未來要求數據和代碼從只有原來1/20外存訪問帶寬的串行flash中讀取,且還要求達到至少30倍于傳統8051的性能,運行帶圖形界面的系統軟件。Turbo52在技術路線的選擇上,第一是考慮到未來是用于系統控制而非數據處理,這很大程度上減小了8051指令集由于指令位寬和沒有浮點運算單元帶來的運算性能上的局限;第二,從通用微處理器在過去三十多年的演進歷史中可知,對于一個微處理器系列而言,因為為其開發軟件的總成本已遠遠高于微處理器設計成本,所以,一個微處理器系列的核心競爭力很大程度上是依賴于它能兼容現有軟件資源的數量,8051系列就擁有最為豐富的軟件資源;第三,目前國際上在單核微處理器體系結構設計上已基本成熟,對微處理器體系結構的研究熱點已轉入片內存儲共享的多微處理器結構和低功耗設計;第四,目前芯片設計流程以及芯片設計、仿真,綜合和驗證的自動化工具已允許對微處理器系統結構進行重新定義。
綜上考慮認為,造成8051系列性能局限性的根本原因是它落后的微體系結構而非指令集本身,因此決定在首先保證完全重用所有現有軟件資源的基礎上,通過采用先進系統結構來重新定義內部體系結構的方法來挖掘微處理器結構上的并行性以實現本應由更復雜的32位嵌入式微處理器完成的系統控制任務。
相對于傳統8051指令集處理器,Turbo52系統結構上的改進主要在于以下7個方面:
(1)雙發射超標量結構。
(2)基于寄存器重命名,動態調度和動態分支預測8級動態亂序流水線。
(3)1 KB片上高速指令緩。
(4)虛擬地址映射管理16 MB代碼,數據和輸入輸出空間。
(5)將可直接尋址的輸入輸出設備、定時器計數器、串口、外口、中斷控制等的輸入輸出設備時序與微處理器核時序完全分離,異步相連,方便了輸入輸出設備的增減。
(6)微處理器核時序與存儲介質時序完全分離,異步相連,使得可使用任何介質。
(7)訪存載入定向。
1 指令流水線結構設計綜述
微處理器結構設計的重點是指令流水線結構設計,其中數據相關和控制相關的解決是難點。Turbo52的設計是用動態調度解決數據相關和用分支預測解決控制相關。動態調度是動態地平衡不同的功能器件延時對流水效率的影響。分支預測是讓條件分支先猜測執行。8051指令集共有111條指令,有著多種尋址方式,不定的指令長度和將輸入輸出設備寄存器與體系結構寄存器作為同類寄存器訪問[1],這些都成為了動態亂序結構設計中的難點。選用兩路超標量是考慮它是現有8051指令集軟件開發編譯環境下[7]處理器性能的峰值點。因為多發射是在同一時鐘周期取得,發射、執行、寫回和提交多條不相關的指令,這是與單發射的最大不同。超過兩路的多發射必須依賴于編譯器的支持,否則如果指令發射段得不到足夠多條源操作數已準備好的不相關指令,更多的發射就不能實現,性能也就不能相對于更少的發射窗口有提高。在目前獲得支持多發射編譯優化的編譯器不現實的條件下,根據對運行現有應用程序的仿真,實際程序中有大量的相關存在于相鄰2條指令間,故雙發射平均每個時鐘內可發射1.4條指令而非理想狀態下的2條指令,因此再增加發射窗口也不能換來顯著的性能提高。指令流水線設計的原則是將一個指令周期盡可能均勻地分割到流水段中來獲得較小延時的關鍵路徑[8],量化流水段從按系統結構功能劃分開始,然后再根據綜合結果指出關鍵路徑在RTL上調整每一段的細節功能劃分和節拍數。TURBO52指令流水線分為流水線前端和后端2個部分。前端由先行指令數據預取、取指對齊和譯碼組成,后端由寄存器重命名、指令發射、指令執行、指令寫回、指令提交和例外處理構成。
2 前端流水線設計
實現兩路超標量結構,首先是前端流水線平均能在每個時鐘周期取得2條對齊指令送入譯碼隊列。TURBO52前端流水由指令塊預取,指令取指和指令譯碼組成。前端流水線的3個流水段各自獨立自治,由緩沖區相連,當下級緩沖滿或本級緩沖空時停止工作,但全局例外時全部指令作廢,從重新取到指令的開始向前流動。
2.1 指令預取
采用推測方式,每兩個周期從指令緩沖中取得一個塊,下個周期取下一塊,按先進先出方式進入指令塊隊列。隊列可供4塊,共32 B。如Cache缺失就從存儲單元調入該塊。但如取指未取中或指令未對齊,就會向預取觸發一個調入例外,如不是正在取的塊,就會作廢當前塊,并調入重新調取指段要求的塊。
2.2 指令取指
取指流水段指第一次從存儲單元取得一條指令長度,可能是1 B、2 B或3 B,因此這時只能確定它的下一條指令所在的地址,而無法獲得下2條指令的地址,所以每個時鐘周期取2條指令是不可能實現的。TURBO52的做法是只有指令Cache命中時才能實現雙發射。第一次取到由ITLB預譯碼后的指令塊后,先不寫入Cache,而在取指段加入該塊中每條指令下2條指令的第一個字節所在地址,然后再寫入Cache,這樣在下一次Cache命中時,就可同時判定一條指令的下2條指令是否在預取隊列中。在指令取指段,對取指影響最大的是不對齊和控制流的改變[8]。不對齊是指由于指令長度不定但指令塊卻是固定的8字節,所以跨越了2個指令塊,并且其中一個未在預取隊列中,只有等待調入。控制流的改變中影響最大的是條件分支,8051應用中平均每六七條指令就會有一條是條件分支指令。TURBO52采用了動態亂序執行的后端流水線,一條條件分支指令要到在7個時鐘后的提交階段才會給出轉移成功還是失敗,但另一方面,條件分支方向大多數是可預測的[9]。TURBO52使用了動態靜態結合的分支預測,分支成功率90%以上,使得絕大多數由條件分支引起的在此之間流水線停頓的現象得以消除。動態分支預測的分支目標緩沖采用全相連方式,保存了最近32個分支入口及最近3次的實際分支方向,對分支目標緩沖未命中的分支指令,就按分支發生方向進行靜態預測。在TURBO52的指令流水線中,判定預測正確與否是由提交段給出,只在提交分支指令時更新分支歷史信息。如同時取到2條條件分支,則會一條條地處理,因為不能同時預測2條分支。為簡化例外處理,8051指令集的3條指令(RET,RETI,JMP_A+DPTR)TURBO52讓它強行串行化,即讓流水停頓。
2.3 指令譯碼
將取得的指令對齊后放入深度為4的譯碼隊列,譯碼部件每個時鐘周期對應2條指令同時譯碼,即在已預譯碼的基礎上把8051指令集的指令按源、目的、操作3個大類進行正交分解,將8051指令集原本不規則的指令格式轉換成適于后端流水處理規則的內部操作格式。
3 基于動態執行的后端流水線設計
TURBO52后端指令流水線包括按序的寄存器重命名、亂序指令發射、亂序指令執行、亂序指令寫回、順序指令提交共5個流水段。除指令執行段各種不同的操作有不同的延時外,其余均能在一個時鐘周期最多完成2條指令的處理,但對訪存和條件分支指令,指令發射段每周期只能發射一條。與前端指令流水線不同,它們共享一個再定序緩沖循環隊列,記錄了指令進入后端流水線的原始順序,這個順序也是指令的最后提交次序。在這里,大多數假相關已被消除,流水線真相關的關鍵路徑是整條指令流水線的關鍵路徑。
3.1 寄存器重命名
在動態執行中,對一串寄存器的讀寫并不一定按照它們在程序中的順序進行,這就要求要解決反向相關與輸出相關[9]。TURBO52共有24個重命名文件寄存器項,它們都由重命名寄存器號來標識。在8051指令集中,很多運算結果都是由幾個有限的體系結構寄存器A、B、PSW、R0~R7進行中轉[1],TURBO51在建立映射關系時常常是不同的幾個重命名寄存器對應同一體系結構寄存器在不同時刻的值。對于一個重命名寄存器項,最基本的3個狀態是已寫回、閑和未決。在寄存器重命名段,只要再定序緩沖有空且已譯碼對列不為空,寄存器重命名段就將巳譯碼指令重命名并加入再定序緩沖。其結果是分配重命名寄存器和為源匹配最近對它寫入的重命名寄存器這兩項任務同時進行。這里,對間接尋址的處理是一個關鍵邊界點。TURBO52處理這幾類間接尋址指令采取了基于猜測的方法,因為雖然存在相關的可能而且不允許讀錯誤數據,但從目標應用程序的統計結果來看,為處理不足0.3%的可能性而增加整個間接尋址方式的流水延時是不合理的。例如對@RI:首先使用體系結構寄存器中對應的R1或R0的值作為地址發出訪問體系結構寄存器的請求,如果在重命名寄存器中沒有PSW中RSO,RSI或對目前RO、RI所在地址的寫入操作的映射,即沒有發在相關時,它所得到的是與直接尋址方式一樣的取源操作數延時,如發生相關,TURBO52寄存器重命名段使用了一個長度為8的循環隊列用于處理間接尋址的地址未決,不采用由先前猜測所得的結果,當地址出現在寫回總線時立即觸發訪體系結構寄存器操作。
3.2 指令發射
指令發射段負責在每個時鐘周期內從再定序緩沖中選擇發射兩條源已準備好的指令到相應的執行部件。TURBO52的再定序緩沖也同時作為保留站。由指令發射段根據執行單元的忙閑狀態以及源是否準備好來決定是否發射這條指令。
3.3 指令執行
本微處理器的指令一旦被發射進入功能單元后就開始執行了。在這里,操作的執行順序與它們在軟件中的次序無關。TURBO52指令執行部件由一個算術流水單元(加減乘除)、1個LOAD/STORE部件、2個傳送、邏輯和位操作部件和1個分支部件組成。有的操作是單周期的,如傳送和邏緝運算;有的是固定多周期的,如加減乘除;有的是不固定多周期延時的,如訪問數據區的LOAD/SRORE。
3.4 指令寫回
公共數據總線連接了所有執行功能單元,重命名寄存器堆和再定序緩沖,功能單元產生的結果廣播到公共數據總線的同時從公共數據總線鎖存源送往執行。TURBO52指令寫回保證了操作,當其所有源操作數就續后馬上開始執行,達到數據流極限。
3.5 指令提交
指令提交意味著指令執行結束并修改了微處理器的狀態,指令離開再定序緩沖,寫入真實意義的寄存器文件。再定序緩沖由一個頭指針和尾指針構成了一個循環隊列,深度為8條指令,指令進行提交時釋放一項再定序緩沖,尾指針遞增。亂序執行的另一個困難是異常處理,因為8051指令集系采用的精確例外[1],即只允許程序在嚴格順序執行的情況下所產生的異常發生。在程序的執行中,中斷和異常會打斷程序的執行,動態流水線的兩路超標量微處理器由指令的動態亂序執行,但對外部程序來說與完全順序執行只存在速度的差別而非結果的差別,所以它必須能精確地與順序執行條件下的例外結果保持一致,這是設計的一個高風險區。中斷在本處理機中是來自外部輸入輸出環境,在程序執行期間異步發生。中斷發生時,正常運行的程序必須掛起。異常是由程序自身指令的執行而引起的,當正在進行代碼分頁切換時會引發分頁異常,分支預測錯誤時會引起分支異常,本處器只在指令提交段上對異常和中斷進行處理,將中斷也作為異常的一種。
4 存儲子系統和輸入輸出設備設計
8051指令集是指令和數據相分離的哈佛結構,存儲子系統分為代碼空間和數據空間[1]。TURBO52在保持兼傳統8051指令集數據和代碼空間各64 KB的基礎上,用分頁的方式實現了共享一個外部數據和代碼存儲器件的物理地址空間下,代碼與數據各16 MB的虛擬地址空間。
4.1 代碼空間
TURBO52中訪問代碼空間均以8 B塊為單位進行,分為外部存儲器和一級指令高速緩存兩個層次。指令高速緩存容量是1KB,采用四路組相連映象,LFU替換算法。指令流水線代碼預取段首先訪問指令高速緩存,如命中則調入并更新相應標識位,如缺失則進入指令先行訪存隊列中查找。指令塊在從外存中取入隊列時已完成了對指令長度是否為可預測分支及目標地址來自哪個指令字節的預譯碼。
4.2 數據空間
8051指令集對數據空間的訪問只能通過MOVX指令進行[1],MOVX變量空間、外設IO與外存共享這個數據空間。這里使用了載入定向,當一條MOVX讀指令到來且正要讀還未寫就續的這個寄存器,LOAD/STORE部件用直接旁路將這條LOAD定向到寫總線上,從而消除不必要的等待。從簡化設計的角度,TURBO52沒有實現完整的一級數據高速緩存,而是用一個容量為4 KB的RAM用于程序變量的訪問。在目前基于RTOS實時操作系統的應用下完全達到了快速的變量訪問又避免了實現較復雜的一致性問題。外部數據區:對于指令和數據對外部存儲的訪問均是按相同大小的8 B塊為最小單位的方式進行的。用先行預取緩沖的方式,當TLB缺失時,向外部存儲器接口啟動這個塊的調入請求。輸入輸出設備有2個定時器計數器、1個串口,中斷控制和32條通用I/O口都可直接尋址方式訪問。對新增加的18位PWM,是在MOVX訪問的數據空間通過新定義的輸入輸出總線和分配端口地址來接入,這也使以后增減外設的工作只與輸入輸出總線有關而與指令流水線完全分離,對增減外設提供了方便。
在設計中先走通了靜態分支預測和順序流水線,然后在總結這個階段錯誤的基礎上開始TURBO52其他部份的設計。即先走完從每個時鐘級的功能描述,到可綜合且代碼風格規范的RTL描述[10],然后進行NC-Verilog前仿真驗證、DC綜合、FPGA驗證,最后針對具體ASIC單元庫進行門級仿真的設計流程。在此后的設計中,從功能描述文檔開始就將綜合中可能遇到的問題納入考慮,在劃分流水線功能時由綜合結果幫助了功能描述級文檔的修改,并排除了大多數嚴重錯誤。在RTL仿真階段運行了指令集驗證,尤其著重驗證了動態執行、分支預測和例外處理中的臨界指令組合,排除少量嚴重錯誤和較多外設錯誤;此后又驗證了體系結構寄存器文件讀寫、分頁代碼間的切換等其他高風險點;之后又驗證了以外設為主的用戶功能部分和運行完整的RTOS操作系統。最后,TURBO52微處理器在FPGA系統級驗證上能正確且穩定地運行RTL仿真所用的測試程序包,全部現有應用軟件和基于RTOS操作系統的應用方案, 能流暢處理圖形用戶界面。在同為27 MHz時鐘下,其結果顯示系統運行速度比傳統8051提高30倍以上。運行直觀的方波發生應用測試是37倍以上,這說明TURBO52技術路線選擇正確,流水線效率高,高速緩存容量足夠,命中率高。使用CMIC 0.18 um標準單元工藝庫進行了綜合,表明TURBO52微處理器最高工作頻率大于150 MHz。接下來的工作是進一步改進存貯子系統,因為TURBO52工作在100 MHz以上時,Flash訪問帶寬與處理器核的需求帶寬的差距顯著拉大,這帶來了性能提升的瓶頸,應引入有DDR_SDRAM的三級存儲體系和加入數據高速緩存,使運行更流暢,力爭最終能運行用于32位嵌入處理器上流行的基于LINUX操作系統的應用。
參考文獻
[1] MCS(R) 51 Microcontroller Family User′s Manual,Intel Corp Press,1994.
[2] Micro Architecture of the Pentium 4 Processor,Glenn Hinton,Dave Sage,Intel Technology Journal,Q1,2001,5(1):1-12.
[3] 胡偉武,唐志敏.龍芯1號處理器結構設計.計算機學報,2003.4:386-396.
[4] 胡偉武,張福新,李祖松.龍芯2號處理器設計與性能分析.計算機研究與發展,2006,43(60):956-966.
[5] HU Wei Wu,ZHAO Ji Ye.Implementing a 1 GHz four issue out-of-order execution microprocessor in a standard ASIC methodology,J.Comput.Sci & Techno,2007(6):1-14.
[6] YEAGER K.The MIPS10000 superscalar microprocessor, IEEE Micro,1996,16(2).
[7] ARM DDI 0100E,ARM Architecture Reference Manual,2nd Edition,ARM Limited,2000.
[8] SHENG J P.Modern processor design:Fundamentals of Superscalar Processors,McGraw.Hill,2004.(7).
[9] HENNESSY J L,DAVID A P.Computer architecture:A quantitative approach, 2nd Ed.,morgan kaufmann publishers, Inc.,1996.
[10] MICHAEL D.C,Advanced digital design with the verilog HDL,prentice hall India,2004.