單週期cpu即取指、解碼、執行、訪存、寫回五個階段一起放在乙個週期內完成。資料流圖如下:
流水線cpu將取指、解碼、執行、訪存、寫回分為五個週期完成。相較於單週期cpu,多週期流水線cpu時鐘頻率高,執行指令更高效。
在單週期cpu的基礎上新增一些暫存器來存放每乙個階段所需的資料以及控制訊號,每乙個時鐘週期到來,就將本階段處理完的資料以及下個階段所需的控制訊號下推到下個階段的暫存器中去。
靜態流水線cpu與單週期cpu的不同之處在於將取指、解碼、執行、訪存、寫回分為了五個時鐘週期,以流水線的工作方式處理每一條指令,當遇到資料衝突問題時,採用流水線暫停的方式來避免資料衝突。靜態流水線cpu除了使用單週期cpu所需部件之外,還需要為每乙個階段新增一些暫存器來存放當前階段所需要的資料和控制指令。需要新增的部件為:
judge部件:判斷兩個數是否相等以及乙個數是否等於零,在提前分支**(beq/bne等跳轉指令)時需要用到。
id_ex部件:存放在解碼階段經過ctrl控制器輸出的部分控制訊號以及下乙個階段處理所需的資料(從regfiles暫存器堆中取出的資料)。並在下乙個時鐘週期將這些資料傳到下乙個階段有關部件。
資料流圖如下:(對照著資料流圖很快就可以將各個部件組裝成cpu)
與靜態流水線cpu有所不同的是,靜態流水線cpu遇到資料衝突問題時採用暫停的方式避免衝突,而動態流水線則採用內部前推以及必要暫停(lw指令資料相關時)的方式來避免衝突,因此我們需要在靜態流水線cpu的基礎上新增多一些暫存器。
fwda部件:資料選擇器,選擇exe階段處理的資料,可以是當前指令取出的regfiles暫存器堆資料,也可以是從exe階段或者mem階段的前推過來的資料。資料流圖如下fwdb部件:功能同fwda部件
資料衝突
先執行addu $8,$3,$4,再執行addu $9,$8,$5,會引發資料衝突從**波形中,我們可以看到addu $9,$8,$5在解碼階段得到的rs運算元的位址rsc為0x08與正在exe級執行的addu $8,$3,$4執行的寫回暫存器位址ex_rf_waddr為0x08相同,產生資料衝突。按照靜態流水線的處理方式應該做暫停處理。一共暫停了3個時鐘週期,等到addu $8,$3,$4將運算結果寫回暫存器0x08之後,此時addu $9,$8,$5的exe級的ex_rs讀取到0x08暫存器的資料後,可以繼續向下執行。跳轉指令執行的指令為beq $1,$2,0x00000007,機器碼為0x10220007從波形圖中我們可以看到,在緊跟0x10220007機器指令後面緊跟一條0x00000000指令,這是乙個延遲槽,這條延遲槽指令不會改變cpu的狀態。而提前分支**即是在解碼階段就判斷是否需要跳轉,如圖所示,在解碼階段結束之後,下乙個週期之後取指階段的pc值就變成了0x00400048,即為跳轉的目標位址。資料衝突先執行addu $8,$3,$4指令,再執行addu $9,$8,$5,引發資料衝突從**圖中我們可以看出,先執行addu $8,$3,$4執行再執行addu $9,$8,$5指令時,並沒有出現流水線暫停現象。在addu $9,$8,$5指令解碼階段,控制器檢測到$8暫存器需要被exe級執行的addu $8,$3,$4指令寫回,於是設定fwda資料選擇器的控制訊號,使exe級的運算結果通過資料旁路內部前推至addu $9,$8,$5的解碼階段,如波形圖中執行階段的黃色箭頭所指,這樣就避免了資料衝突而導致流水線暫停的問題。由於lw指令引發的資料衝突先執行lw $11,0x00000004($31)指令,再執行sub $12,$10,$11指令,$11初始值為0x0000000b,而執行完lw指令後值為0x00000005,由於sub $12,$10,$11指令在解碼時,lw指令還在執行exe級,所以需要暫停乙個時鐘週期等到lw指令在mem級將資料從dmem儲存器中取出後前推至sub $12,$10,$11指令的id級之後sub指令才能繼續執行。從波形圖中可以看出,sub指令在解碼階段暫停了乙個週期,等到rt的值從0x0000000b變為0x00000005之後才繼續執行。跳轉指令執行beq $1,$2,0x00000007指令,後面接一條sll $0,$0,0作為延遲槽,無論分支成功與否總是被執行。從波形圖上可以看出,在beq指令在解碼階段判斷出了是否需要跳轉,在下乙個週期就改變了pc的值,跳轉成功。從原有的單週期cpu轉換到靜態流水線其實並不是一件很難的事情,只不過是在原來單週期的資料流上加上一些暫存器來儲存當前已經處理好的資料,並讓出處理這些資料的相關部件,使得這些部件可以被接下來的指令使用。然後使用時鐘控制,使暫時儲存在暫存器中的中間資料流向下乙個部件,如此進行下去,一直到處理完畢。每一條指令的資料通路圖以及整體的資料通路圖、控制訊號表對於cpu的編碼和debug都起著至關重要的作用。在寫**之前,先在思考每一條指令的執行過程,然後畫出所需的資料通路圖,並寫出所需的控制訊號。在寫**時,每畫出一條線,就在草稿紙上將該線塗上顏色,這樣就可以使的編碼的思路非常清晰。debug的時候將cpu內部的一些資料線拉出來顯示在modelsim上,**出錯時,可以檢視對應的資料是否有問題,進一步可以檢視資料通路是否有問題、控制訊號是否有問題。這樣可以使得效率大大提高。
計算機組成原理 流水CPU
寫在前面 許多人在選擇或了解 cpu時,常常忽略 流水線 這個指標。其實也難怪,在經常被介紹的 cpu引數中,關於流水線被提到的不多,即便提到,也相當簡略和專業。非專業人士很難理解,有時也就不甚了了。也許有人會說,我管它什麼流水線不流水線的,型號越新 越高,就一定越好。這種想法不是沒有道理。可是,當...
組成原理 記憶體及記憶體與CPU的關係
首先,我們對計算機的記憶體進行簡單的了解 記憶體 memory 又稱內部儲存器,是計算機的重要組成部分。其主要作用是進行程式的執行和程式執行過程中一些半成品資料的儲存。根據不同的效能,有以下幾類內部儲存器 唯讀儲存器 rom read only memory rom,唯讀儲存器,在製造rom的時候,...
計算機組成原理 cpu指令系統
機器指令 運算元型別和操作型別 定址方式 指令格式舉例 risc技術 指令系統是軟體和硬體之間的橋梁 指令格式 操作碼 做啥操作 長度固定 以及可變 擴充套件操作碼 操作碼位數隨位址數的減少而增加 位址碼 位址碼用來指出該指令的原運算元的位址 乙個或兩個 結果的位址以及下一條指令的位址。四位址 pc...