【體系結構系列】流水線實現
阿新 • • 發佈:2021-01-04
流水線的實現
非流水通路
MIPS(子集)資料通路(非流水)例項
指令週期
-
取指令週期(IF)
-
主要操作
IR←Mem[PC] NPC←PC+4
-
-
指令譯碼/讀暫存器週期(ID)
-
主要操作
A ← Regs[rs] B ← Regs[rt] 指令譯碼 Imm ← ((IR16)16##IR16..31)
-
備註
- 指令的譯碼操作和讀暫存器操作是並行進行的:在MIPS指令格式中,操作碼欄位以及rs、rt欄位都是在固定的位置。這種技術稱為固定欄位譯碼技術。
-
-
執行/有效地址計算週期(EX)
-
主要操作(不同指令進行的操作不同)
• load指令和store指令 –ALUo←A + Imm • 暫存器-暫存器ALU指令 – ALUo←A funct B • 暫存器-立即值ALU指令 – ALUo←A op Imm • 分支指令 – ALUo←NPC+(Imm<<2) – cond←(A = = 0)
-
備註
- 將有效地址計算週期和執行週期合併為一個時鐘週期,這是因為MIPS指令集採用load/store結構,沒有任何指令需要同時進行資料有效地址的計算、轉移目標地址的計算和對資料進行運算
-
-
儲存器訪問/分支完成周期(MEM)
-
主要操作(不同指令進行的操作不同)
• 所有指令都要在該週期對PC進行更新 –非分支指令: PC←NPC –分支指令: if (cond) PC ←ALUo else PC←NPC • 該週期內需要處理的MIPS指令僅包含load、store和分支三種 –load指令和store指令: LMD←Mem[ALUo] 或者 Mem[ALUo]←B – 分支指令: 如上所述,更新PC
-
-
寫回週期(WB)
-
主要操作(不同指令進行的操作不同)
• 暫存器-暫存器ALU指令 –Regs[rd]← ALUo • 暫存器-立即數ALU指令 –Regs[rt]← ALUo • load指令 –Regs[rt]← LMD
-
MIPS的流水化
流水暫存器
-
位置與作用
- 位置
- 段與段之間設定流水暫存器
- 作用
- 將各段的工作隔開,使得它們不會互相干擾。
- 儲存相應段的處理結果。例如:EX/MEM.ALUo:儲存EX段ALU的運算結果。
- 向後傳遞後面將要用到的資料或者控制資訊:所有有用的資料和控制資訊每個時鐘週期會隨著指令在流水線中的流動往後流動一段
- 位置
-
命名規則
-
流水暫存器名.子暫存器名[欄位名]
-
流水暫存器名
- 用其相鄰的兩個段的名稱拼合而成,例如:ID段與EX段之間的流水暫存器用ID/EX表示
- 每個流水暫存器是由若干個子暫存器構成的
-
子暫存器名
- 基本暫存器,如IR
-
欄位名
- 基本暫存器的某欄位
-
例子
- ID/EX.IR[op]:流水暫存器ID/EX中的子暫存器IR的op欄位(即操作碼欄位)
-
其它資料通路改動
- 增加了向後傳遞IR和從MEM/WB.IR回送到通用暫存器組的連線。(中途可能出現跳轉指令)
- 將對PC的修改移到了IF段,以便PC能及時地加4,為取下一條指令做好準備。
多路選擇器
-
MUX1的功能
if ((EX/MEM.IR[op]==“分支指令”)& EX/MEM.cond){ MUX1_output=EX/MEM.ALUo } else MUX1_output=PC+4;//MUX1_output表示MUX1的輸出
-
MUX2的功能
if (ID/EX.IR[op]==“分支指令”){ MUX2_output=ID/EX.NPC } else MUX2_output=ID/EX.A;//MUX2_output表示MUX2的輸出
-
MUX3的功能
if (ID/EX.IR[op]==“暫存器-暫存器型ALU指令”){ MUX3_output=ID/EX.B } else MUX3_output=ID/EX.Imm;//MUX3_output表示MUX3的輸出
-
MUX4的功能
if (MEM/WB.IR[op]==“load”){ MUX4_output=MEM/WB.LMD }; else MUX4_output=MEM/WB.ALUo //MUX4_output表示MUX4的輸出
-
MUX5功能
- MEM/WB.IR[rd]和MEM/WB.IR[rt]二選一
- 暫存器-暫存器型ALU指令:選擇MEM/WB.IR[rd]
- 暫存器-立即數型ALU指令和load指令:選擇MEM/WB.IR[rt]
資料衝突檢測
- 所有的資料衝突均可以在ID段檢測到
- 如果存在資料衝突,就在相應的指令流出ID段之前將之暫停。
- 完成該工作的硬體稱為流水線的互鎖機制。
- 在ID段確定需要什麼樣的定向,並設定相應的控制
- 降低流水線的硬體複雜度。(不必掛起已經改變了機器狀態的指令)
- 也可以在使用運算元的那個時鐘週期的開始檢測衝突和確定必需的定向
- 檢測衝突是通過比較暫存器地址是否相等來實現的
實現load互鎖
-
檢測已經完成取指的指令是否依賴正在執行的指令的資料,然後加入暫停氣泡
-
檢測
- 由於使用load的結果而引起的流水線互鎖稱為load互鎖
- 在ID段檢測是否存在RAW衝突(這時load指令在EX段)
-
停頓
- 若檢測到RAW衝突,流水線互鎖機制必須在流水線中插入停頓,並使當前正處於IF段和ID段的指令不再前進
- 將ID/EX.IR中的操作碼改為全0(全0表示空操作)
- IF/ID暫存器的內容回送到自己的入口
- 若檢測到RAW衝突,流水線互鎖機制必須在流水線中插入停頓,並使當前正處於IF段和ID段的指令不再前進
控制衝突
- 分支指令的條件測試和分支目標地址計算是在EX段完成,對PC的修改是在MEM段完成。
- 它所帶來的分支延遲是3個時鐘週期。
- 減少分支延遲(把上述工作提前到ID段進行)
- 在ID段增設一個加法器:計算分支目標地址
- 把條件測試“=0?”的邏輯電路移到ID段
- 這些結果直接回送到IF段的MUX1