ARM體系結構之:流水線(xiàn)
在ARM9TDMI中使用了典型的5級流水線(xiàn)。ARM9TDMI的組織結構如圖2.7所示。
· 取指(fetch):從存儲器中取出指令,并將其放入指令流水線(xiàn)。
· 譯碼(decode):指令被譯碼,從寄存器堆中讀取寄存器操作數。在寄存器堆中有3個(gè)操作數讀端口,因此,大多數ARM指令能在1個(gè)周期內讀取其操作數。
· 執行(execute):將其中一個(gè)操作數移位,并在A(yíng)LU中產(chǎn)生結果。如果指令是Load或Store指令,則在A(yíng)LU中計算存儲器的地址。
· 緩沖/數據(buffer/data):如果需要則訪(fǎng)問(wèn)數據存儲器,否則ALU只是簡(jiǎn)單地緩沖一個(gè)時(shí)鐘周期。
· 回寫(xiě)(write-back):將指令的結果回寫(xiě)到寄存器堆,包括任何從寄存器讀出的數據。
圖2.8顯示了5級流水線(xiàn)指令的執行過(guò)程。
圖2.7 5級流水線(xiàn)的組織結構
圖2.8 5級流水線(xiàn)
在程序執行過(guò)程中,PC值是基于3級流水線(xiàn)操作特性的。5級流水線(xiàn)中提前1級來(lái)讀取指令操作數,得到的值是不同的(PC+4而不是PC+8)。這產(chǎn)生的代碼不兼容是不容許的。但5級流水線(xiàn)ARM完全仿真3級流水線(xiàn)的行為。在取指級增加的PC值被直接送到譯碼級的寄存器,穿過(guò)兩極之間的流水線(xiàn)寄存器。下一條指令的PC+4等于當前指令的PC+8,因此,未使用額外的硬件便得到了正確的r15。
3.6級流水線(xiàn)ARM組織
在A(yíng)RM10中,將流水線(xiàn)的級數增加到6級,使系統的平均處理能力達到了1.3Dhrystone MISP/MHz。圖2.9顯示了6級流水線(xiàn)上指令的執行過(guò)程。
圖2.9 6級流水線(xiàn)
2.2.3 影響流水線(xiàn)性能的因素
1.互鎖
在典型的程序處理過(guò)程中,經(jīng)常會(huì )遇到這樣的情形,即一條指令的結果被用做下一條指令的操作數。如例2.4所示。
【例2.4】
有如下指令序列:
LDR r0,[r0,#0]
ADD r0,r0,r1 ;在5級流水線(xiàn)上產(chǎn)生互鎖
從例2.4中可以看出,流水線(xiàn)的操作產(chǎn)生中斷,因為第一條指令的結果在第二條指令取數時(shí)還沒(méi)有產(chǎn)生。第二條指令必須停止,直到結果產(chǎn)生為止。
2.跳轉指令
跳轉指令也會(huì )破壞流水線(xiàn)的行為,因為后續指令的取指步驟受到跳轉目標計算的影響,因而必須推遲。但是,當跳轉指令被譯碼時(shí),在它被確認是跳轉指令之前,后續的取指操作已經(jīng)發(fā)生。這樣一來(lái),已經(jīng)被預取進(jìn)入流水線(xiàn)的指令不得不被丟棄。如果跳轉目標的計算是在A(yíng)LU階段完成的,那么,在得到跳轉目標之前已經(jīng)有兩條指令按原有指令流讀取。
解決的辦法是,如果有可能最好早一些計算轉移目標,當然這需要硬件支持;如果轉移指令具有固定格式,那么可以在解碼階段預測跳轉目標,從而將跳轉的執行時(shí)間減少到單個(gè)周期。但要注意,由于條件跳轉與前一條指令的條件碼結果有關(guān),在這個(gè)流水線(xiàn)中,還會(huì )有條件轉移的危險。
盡管有些技術(shù)可以減少這些流水線(xiàn)問(wèn)題的影響,但是,不能完全消除這些困難。流水線(xiàn)級數越多,問(wèn)題就越嚴重。對于相對簡(jiǎn)單的處理器,使用3~5級流水線(xiàn)效果最好。
顯然,只有當所有指令都依照相似的步驟執行時(shí),流水線(xiàn)的效率達到最高。如果處理器的指令非常復雜,每一條指令的行為都與下一條指令不同,那么就很難用流水線(xiàn)實(shí)現。
存儲器相關(guān)文章:存儲器原理
評論