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