管線化與危障
管線暫存器(pipeline register)
在真實的裝配線上,半成品汽車從一站滾到下一站時,會放在一台推車上,車上載著下一位工人需要的一切——底盤、已鎖上的螺栓、工單。管線暫存器就是那台推車。它是一組正反器,坐落在兩個管線階段之間,每次時脈跳動就在指令越過邊界時把它的狀態拍照存下,好讓下一階段一到就找到它需要的東西在等著。
為什麼非要這個不可?因為五個階段同時運轉,各處理不同的指令。解碼階段正在為指令 3 讀暫存器,而執行階段正在用上一週期為指令 2 解出的運算元。若沒有一個暫存器保存指令 2 的運算元,指令 3 剛讀出的值就會衝進來破壞指令 2 的工作。管線暫存器——以它們所夾的階段命名,如 IF/ID、ID/EX、EX/MEM、MEM/WB——給每條指令一組私有、隨它步調一致移動的攜帶值,每個時脈走一階。它們保存運算元、算出的結果、控制訊號,甚至指令的目的暫存器編號。
管線暫存器是你為重疊付出的小代價。它們在每個階段加上一點點延遲(建立時間與時脈到輸出的時間),這就是為什麼管線化指令的延遲比非管線版略差。它們也迫使每個階段都得佔用一整個時脈週期,即使其真正的工作較短。但少了它們,裝配線會一團混亂——正是它們讓重疊的指令真正能運作。
解碼與執行之間的 ID/EX 暫存器,攜帶指令 2 的兩個來源值、它的立即值、它的目的暫存器編號,以及一束控制訊號。下一週期這些移到 EX/MEM,同時指令 3 的一組新值進入 ID/EX——每條指令的狀態各坐自己的推車。
管線暫存器(IF/ID、ID/EX、EX/MEM、MEM/WB)在每條指令越過各階段邊界時,保存它的運算元、結果與控制訊號。
管線暫存器是軟體看不見的實作細節——它們不是像 x1 或程式計數器那樣的架構暫存器。程式設計師永遠不會點名它們;它們只存在於微架構內部。
又称
另见