MiniMIPS32微處理器的流水線相關問題和暫停機制


上一個實驗中,我們已經設計並實現了基於經典5級流水線結構的微處理器,該流水線結構是理想化的,只有流水線的基本功能,其中運行的指令是彼此獨立的,互無聯系的。這樣的流水線是無法完成大多數程序的運行需要的,因為任何一個程序,各個指令之間一定是彼此相關的。

為了使流水線更具實用性,本章將重點討論流水線中最常見的“相關”問題暫停機制。首先我們給出流水線相關問題的基本概念;然后介紹流水線的數據相關及基於定向前推的消除方法,並給出支持定向前推的微處理器流水線的設計方案和Verilog實現;接着,介紹由轉移類指令引起的流水線的控制相關及基於延遲轉移的消除方法,並給出支持轉移類指令的微處理器流水線的設計方案和Verilog實現;最后我們研究流水線的暫停機制,並給出相應的流水線設計方案和Verilog實現。

相關問題&暫停機制

相關問題的概念->基於定向前推的消除方法->轉移類指令引起的流水線控制相關->基於延遲轉移的消除方法->流水線的暫停機制&相應的流水線設計方案

6.1 流水線的數據相關和消除方法

在實際流水線運行的過程中,簡單的流水線無法滿足大多數程序運行的要求,最常見的問題是“相關(也稱為沖突、冒險或依賴)”問題。

所謂“相關”是指在一段程序的鄰近指令之間存在某種關系,這種關系造成流水線中的某些指令無法在指定的時鍾周期被執行,從而影響指令在時間上的重疊執行,造成流水線吞吐率和加速比的下降,制約流水線性能。

流水線包括三種相關:結構相關,數據相關,控制相關。

結構相關

結構相關是指流水線中多條指令在同一時鍾周期中爭用同一個功能部件,從而發生沖突,造成指令無法繼續執行。消除結構相關的常見方法是設置多個功能部件。目前,MiniMIPS32微處理器的流水線設計正是采用這種分離式的指令存儲器和數據存儲器。

數據相關

數據相關是指流水線中,如果某一條指令必須等前面指令的運行結果,才能繼續執行,那么指令間就存在數據相關。此處的數據僅考慮寄存器中的數據。數據相關又可以分為三種,假設指令i先於指令j進入流水線:

  • 寫后讀相關(RAW):指令j需要指令i的計算結果,但在流水線中,j可能在i寫入結果前對保存該結果的寄存器進行讀操作,從而讀取錯誤的數據。
  • 讀后寫相關(WAR):指令j在指令i讀取某個寄存器之前對該寄存器進行了寫操作,導致指令i讀取了新的已經進行了寫操作的數據,從而發生錯誤。
  • 寫后寫相關(WAW):指令i和j對相同的寄存器進行寫操作,如果在流水線中,指令j先於指令i完成了對寄存器的寫操作,從而導致最終存放的是指令i的結果,而不是j的結果,從而發生寫入順序的錯誤。

由於MiniMIPS32是順序處理器,即指令順序進入流水線,並順序提交結果,並且只在寫回階段才會進行寄存器寫操作,WAW這種數據相關是不存在的。又因為只能在流水線的寫回節點寫寄存器,故也不存在WAR相關。因此只存在RAW相關。MiniMIPS32有兩種寄存器,一種是通用寄存器,另一種是HILO寄存器,兩種都可能存在數據相關。

對通用寄存器的讀取發生在譯碼階段,根據相關指令出現的位置不同,RAW相關又可以分為3種情況:譯碼-執行相關,譯碼-訪存相關和譯碼-寫回相關。 

 

 

  • 譯碼-執行相關:指相鄰兩條指令之間針對某一通用寄存器存在RAW數據相關,即圖6-1(a)中的指令1和指令2。指令2的計算需要指令1將結果存回寄存器$t0。指令1只能在寫回階段將結果寫入$t0,而指令2在譯碼階段需要讀取寄存器$t0中的數據,此時指令1還處於執行階段,故指令2從$1中讀取的數據必然不是指令1的計算結果,故發生錯誤。
  • 譯碼-訪存相關:指相隔一條指令的兩條指令間針對某一通用寄存器存在RAW數據相關,即圖6-1(a)中的指令1和指令3。指令3的計算需要指令1將結果寫回寄存器$t0。當指令3在譯碼階段讀取寄存器$t0中的數據時,指令1還處在流水線的訪存階段,若使用這個數據,則指令3的運行結果必然不正確。
  • 譯碼-寫回相關:指相鄰兩條指令之間針對某一通用寄存器存在RAW數據相關,即圖6-1(a)中的指令1和指令4。指令4的計算需要指令1將結果寫回寄存器$t0。當指令4在譯碼階段讀取寄存器$t0時,指令1還處在流水線的寫回階段,而指令1需要在寫回階段最后的時鍾上升沿才能將結果寫入$t0,所以指令4此時得到的寄存器$t0的值是錯誤的。

對HILO寄存器的讀取發生在執行階段,根據相關指令出現位置的不同,分為兩種:執行-訪存相關執行-寫回相關

 

  • 執行-訪存相關:指相鄰兩條指令之間針對HILO寄存器存在RAW數據相關,即圖6-1(b)中的指令1和指令2。指令1只能在寫回階段將結果寫入HILO寄存器,而指令2需要在執行階段訪問LO寄存器,此時指令1還處於訪存階段,故指令2從寄存器LO中讀取的數據必然不是指令1的計算結果,因此,發生錯誤。
  • 執行-寫回相關:指相隔一條指令的指令間針對HILO寄存器存在RAW相關,即圖6-1(b)中的指令1和指令3。指令3的計算需要指令1將結果寫回寄存器HILO。當指令3在執行階段讀取寄存器LO時,指令1還處在流水線的寫回階段,而指令1需要在寫回階段最后的時鍾上升沿才能將結果寫入LO,所以指令3此時得到的寄存器LO的值是錯誤的。

6.1.2 數據相關的消除方法

為了消除由數據相關導致的執行不正確的問題,采用以下三種方法。

1. 插入暫停周期

為了保證存在數據相關的指令在流水線中正確執行,設置一個“流水線互鎖機制”的功能部件,該部件將檢測並發現流水線中存在的數據相關,並推遲當前指令的執行,直到所需的數據被寫回相關的寄存器才繼續指令的執行。推遲指令的執行通過在流水線中插入若干暫停周期(也稱為“氣泡”)實現,相當於在相關指令之間增加若干個空指令(NOP)。

 

 

由圖可見,指令2在流水線中的運行被暫停了3個時鍾周期,然后再進行譯碼時取出的寄存器$t0的值是指令1寫回的計算結果,故指令執行的正確性得到了保證。但該方法會造成流水線的停頓,降低了流水線的運行效率,最終增加了處理器的CPI,嚴重制約了處理器的性能。

2. 依靠編譯器調度

為了減少流水線的停頓,可以依靠編譯器在編譯時重新組織指令的順序來消除數據相關,這種技術稱為“指令調度”,如下圖所示:

 

對於調度前的程序,指令1和指令2之前對於寄存器$s0存在譯碼-執行相關。經過編譯器調度之后,將后面的三條無關指令調度到LW和ADDIU之間,這樣不僅消除了原有的數據相關性,同時不會造成流水線的停頓。但該方法仍然存在兩個問題:第一,需要對編譯器進行特別設計,增加了其設計難度;第二,並不是每次出現數據相關時,都可以找到無關指令進行調度,此時還是需要在相關指令間插入暫停周期。

3. 數據定向前推

為了不造成流水線的停頓,同時也不對編譯器進行改動,可采用稱為定向前推的方法消除數據相關。這種方法在流水線中設置專用的數據通路,將相關的數據從其產生處直接送到所有需要它的功能部件,而不必等待數據寫回通用寄存器。

 

      如圖所示,指令1在執行階段就已經計算出了結果,即待寫入寄存器$t0的新值,此時,可以講該值從指令1的執行階段直接送到指令2的譯碼階段,從而使指令2在譯碼階段可以得到寄存器$t0的正確值,而不必等到寄存器$t0寫回結束,譯碼-執行相關被消除。同理,在指令1的訪存階段,也可以將待寫入寄存器$t0的值直接送到指令3的譯碼階段,使指令3在譯碼階段可以得到寄存器$t0的正確值,而不必等到寄存器寫回結束,譯碼-訪存相關被消除。同理,在指令1的寫回階段,也可將待寫入寄存器$t0的值直接送到指令4的譯碼階段,使指令4在譯碼階段可以得到寄存器$t0的正確值,而不必等到寄存器$t0寫回結束,譯碼-寫回相關被消除。由此可見,采用定向前推方法后,流水線不再需要插入暫停周期,也可保證程序執行的正確性,上述4條指令需要8Δt運行完畢。否則,需要在指令1和指令2之間插入3個暫停周期,4條指令的運行共需要11Δt。

6.1.3 支持定向前推的處理器設計

      流水線采用定向前推的方法消除數據相關,如果要使流水線支持定向前推,需要完成兩個步驟的工作。第一,判斷當前指令是否與之前指令存在數據相關;第二,如果存在數據相關,則需要將流水線中尚未寫回寄存器的數據定向前推至所需指令處,使得該指令獲得正確的數據。

通過這種設計,流水線中對於通用寄存器存在的譯碼-執行相關、譯碼-訪存相關和譯碼-寫回相關都會被消除,從而避免了在流水線中插入暫停周期帶來的停頓問題,顯著提高了流水線的處理性能。 

6.1.4 基於Verilog HDL的實現與測試

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM