ROB


引述自:《超標量處理器設計》p_323

ROB本質上是一個FIFO,在它當中存儲了一條指令的相關信息,如果這條指令的類型、結果、目的寄存器和異常的類型等,如下圖所示:

ROB的容量決定了流水線中最多可以同時執行的指令個數,在上圖中,每個ROB的表項包括:

1)complete:表示一條指令是否已經執行完畢;

2)Areg:指令在原始程序中指定的目的寄存器,它以邏輯寄存器的形式給出;

3)Preg:指令的Areg經過寄存器重命名之后,對應的物理寄存器的編號;

4)OPreg:指令的Areg被重命名為的新的Preg之前,對應的舊的Preg,當指令發生異常而進行狀態恢復時,會使用到這個值;

5)PC:對應這條指令的PC值,當一條指令發生中斷或異常時,需要保存這條指令的PC值,以便能夠重新執行程序;

6)Exception:如果指令發生了異常,會將這個異常的類型寫到這里,當指令要退休的時候,會對這個異常進行處理;

7)Type:指令的類型會被記錄到這里,當指令退休的時候,不同類型的指令會有不同的動作,例如store指令要寫D-Cache、分支指令要釋放checkpoint資源等。

在流水線的分發(Dispatch)階段,指令會按照流水線的順序寫到ROB中,同時ROB中對應的complete狀態位會被置為0,表示這些指令沒有執行完畢,在以后的某個時間,當某條指令執行結束了,它就變為complete狀態,此時會將ROB中對應的complete狀態位置為1,這條指令的計算結果可以放在ROB中,也可以放在物理寄存器堆中,這取決於架構的實現。一條指令在執行的過程中如果發生了異常,也會將異常的類型記錄在ROB中,異常的處理會統一放在流水線的提交階段。指令一旦在流水線的分發階段占據了ROB中的一個表項,這個表項的編號會一直隨着這條指令在流水線中流動,這樣指令在之后的任何時刻,都可以知道如何在ROB中找到自己。

 

一旦一條指令的變為ROB中最舊的指令(上圖中,以head pointer來指示最舊的指令),且其complete狀態位為1,就表示這條指令已經具備退休(retire)的條件。如果這條指令在之前沒有發生過異常,即它在ROB中對應的exception部分為0,這這條指令可以順利地離開流水線,它的結果可以對處理器的狀態進行更新;如果這條指令發生過異常,那么它就要啟動異常的處理過程;而且在這條指令之后進入流水線的所有指令多不允許退休了,此時需要將這些指令從流水線中抹掉,並且對處理器進行狀態恢復,然后從指定的地址開始重新取指令執行。在流水線提交階段,如果是store指令,則它只在退休的時候才可以真正地改變處理器的狀態(寫D-Cache),如果在該過程中發生了D-cache缺失,store指令會阻礙流水線中所有位於它后面的指令繼續退休。

一條指令的異常要被處理,必須保證在它之前的多有指令的異常都已經被處理完成了。

 

有個疑問:如果一條指令在讀數據時,相應的IP沒有反應(即讀數據一直沒有完成),應如何處理????


免責聲明!

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



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