摘 要:流水線是制造高性能CPU的關鍵技術,目前許多學者研究在FPGA上實現具有流水線結構MIPS CPU,但是在解決流水線沖突上只是通過簡單的停頓流水線實現。描述一種較為通用的具有五級流水線的MIPS CPU結構以及其中可能發生的流水線沖突,在此基礎上詳細介紹解決流水線沖突的技術——數據旁路以及動態分支預測在MIPS CPU中的設計和實現,最后通過一段指令序列進行仿真驗證,解決流水線沖突的技術減少指令執行所需要的時鐘周期數。
關鍵詞:MIPS CPUI流水線;數據沖突;數據旁路;分支預測
中圖分類號:TP332
文獻標識碼:B
文章編號:1004—373X(2008)04—021—03
1 引 言
流水線是指在程序執行時多條指令重疊進行操作的一種技術。指令流水執行是將指令執行分成幾個子過程,每個子過程對應一個工位,稱為流水級或流水節拍,這個工位在計算機里就是可以重疊工作的功能部件,稱為流水部件。這些不同的功能部件同時處理不同指令的不同子過程。流水級一個連著一個形成一個流水線,一條指令流過所有的流水級,就完成了他的任務。他通過提高各流水部件的利用率提高指令的平均執行速度。在CPU流水線中,有一些稱為沖突的情形,他使得指令流中下一條指令無法在設計的時鐘周期內執行,這些沖突將會降低流水線可能獲得的理想性能。筆者通過在已有的CPU基礎上設計和實現解決流水線沖突的2大技術,并進行仿真驗證,對通用的CPU流水線的設計具有一定的參考價值。
2 基于MIPS指令集的CPU流水線結構
MIPS指令集是一種精簡指令集(RISC),他的指令格式非常規整,所有的指令均為32位,而且指令操作碼在固定的位置上。這種特點易于將指令代碼進行拆分,使之易于進行流水線CPU的設計。
在基本的MIPS處理器中有5個流水級,其中各流水級定義與主要功能為;
IF為計算下一條指令的地址PC,并從存儲器讀取這條指令;ID為對指令進行譯碼,從寄存器堆中取出源操作數;EX為當指令是運算類指令時執行運算,當指令是轉移類指令時進行有效地址計算;MEM為從存儲器存取數據;WB為將數據寫回到寄存器堆。
按照這一流水線結構,本文在設計和實現中選用一種較為通用的MIPS CPU,他通過VHDL語言實現,各模塊之間的關系簡圖如圖1所示。
MIPS CPU各模塊功能和流水段對應如表1所示。
在通常情況下,指令執行各階段與時鐘周期關系如表2所示,執行1條指令需要5個時鐘周期,指令的平均執行時間為1個時鐘周期。
3 CPU流水線中的沖突
在CPU流水線中存在3類沖突:資源沖突、數據沖突和控制沖突:

第1條ORI指令在WB階段才能將數據寫回到寄存器,而ADDI指令在ID階段就要讀取該值,通過表2可以很明顯看出ADDI指令讀取值的周期早于第1條ORI指令寫入值,讀出來的將是舊值,要得到真實的結果需要停頓2個周期的流水線。
控制沖突 流水線中的分支指令或其他改寫PC的指令造成的沖突。指令序列1的BNE指令為分支指令,該序列也存在控制沖突。控制沖突造成的損失比數據沖突更大。控制沖突決定了跟分支指令有關的指令的執行順序,即非分支指令只能在該執行的時候才能執行。
4 數據旁路技術的設計與實現
數據旁路技術是解決數據沖突問題簡單有效的方法,他的基本思想是把結果直接送到需要他的功能部件,即在同一周期內,將1個結果從一個部件的輸出直接送到另一個部件的輸入。
基于這一技術,設計解決數據沖突問題的流程:
(1)判斷在ID階段的指令的2個操作數是否使用寄存器,如果不使用,則不存在數據沖突,如果使用,則轉入(2);
(2)判斷EX階段或MEM階段正在執行的指令會寫回值的寄存器是否為ID階段使用的寄存器,如果否或者EX階段或MEM階段正在執行的指令沒有寫回值的寄存器,則不存在數據沖突,從寄存器堆中取出源操作數;如果是,則記錄該階段,轉入(3);
(3)判斷所記錄的階段中的指令在該階段是否已經產生結果,如果是,將這個結果賦給ID階段指令的源操作數;如果否,發生數據沖突,需要停頓流水線。
在數據旁路技術的實現上,首先是增強CPU的譯碼功能,在譯碼時增加一些與數據沖突相關的功能碼,流水等級功能碼指示每條指令產生結果的流水階段,根據對數據沖突問題的分析,該功能碼的取值可以代表在DI階段、EX階段或者MEM階段得到結果,如JR指令在DI階段得到結果,ADD指令在EX階段得到結果,LB指令在MEM階段得到結果,源操作數是否使用寄存器功能碼指示了指令的2個源操作是否使用到寄存器;另外,數據旁路技術還用到指示是否寫回寄存器堆功能碼以及目的數寄存器地址功能碼。當增加1個時鐘周期時,這些功能碼隨著指令在各流水線寄存器中傳遞。其次,增加1個新的模塊命名為“bus_ctrl”來實現數據旁路技術,解決數據沖突,同時他也是“mips_id”,“mips_ex”,“mips_meha”,“mips_bank”之間相互溝通的橋梁。
5 分支預測技術的設計和實現
分支預測技術是為解決控制沖突問題而產生的。在程序中,分支轉移很多,而且也很復雜,但是還是可以從中找到規律,發現一些有針對性的預測策略,從而提高系統的性能。比較常見的一類分支轉移程序是循環程序,這里發現:在多重循環里,分支轉移總是有很強的偏向性,也就是說分支總是經過多次同向的執行,才會偶爾轉向另外一個方向。在MIPS CPU中利用分支預測表的動態預測技術實現分支預測功能。
構建分支預測表 分支預測表由4個字段構成,分別為預測記錄使能信號、指令上一次執行時是否分支信號、指令地址以及預測分支地址。采用指令地址字段作為索引。分支預測表的大小由參數來指定。
添加預測記錄如果在ID階段某指令被譯出為分支跳轉指令,且該指令地址在分支預測表中不存在時則要添加到預測表中。預測記錄的替換策略采用先進先出的方法,即用一指針指示最早存入的1條預測記錄或者空記錄,新的預測記錄存入時替換該記錄,同時指針加1,當指針超出記錄表大小時,將指針指向第一條記錄。這類似于循環隊列機制。
分支預測 判斷IF階段取出的指令地址是否與預測表中某一記錄的指令地址相同,如果相同,則該指令是一分支跳轉指令,將該記錄的預測分支地址傳給取指構件,即下一條指令地址為該預測分支地址。
分支預測的驗證 當指令執行到EX階段時,已經計算出指令的實際地址,將此地址與預測的分支地址做比較,如果相同,則預測正確,指令繼續執行;如果不同,則預測錯誤,這時需要把實際的地址傳給取指部件,將已經執行的錯誤指令清除;同時修改分支預測表中與該預測相關的記錄。
表3列出當有1條分支指令第1次以及第2次執行時IF,ID,EX階段在各時鐘周期與該指令相關的操作。在MIPS CPU中,用一獨立的功能部件“mips_predict”實現分支預測功能,他與“mips_if”,“mips_id”,“mips_ex”有著緊密的聯系,需要將指令地址隨著指令在各流水線寄存器中傳遞,并傳遞給“mips_predict”進行分支預測。
6 解決流水線沖突技術的仿真驗證
設計實現后的MIPS CPU增加“bus_ctrl”和“mips_predict”兩個模塊。作為對整個流水線的控制,必須在流水通道內運行各種指令流,分析流水線的控制信號能否對這些指令流在流水線上的執行進行精確控制。對整個處理器進行虛擬仿真和驗證,在仿真平臺和驗證板上運行各種可能的指令流,分析流水線控制信號的變化,確保這個處理器的中心控制模塊對指令流水線的正確控制。輸入前文的指令序列1,通過Modelsim平臺對MIPS CPU進行仿真驗證,波形圖如圖2所示。


ADDI指令在執行時沒有流水線延遲,而且目標寄存器的值正確,說明第2條ORI指令在EX階段結束后把值賦給正在ID階段執行譯碼的ADDI指令,由圖2可以看到預測表添加的過程,只有第1次執行分支指令時需要較長的時間,以后當遇到該分支指令時,總會在下一周期取出預測地址,直到該地址錯誤為止。
流水線技術提高了時鐘頻率,而解決流水線沖突的技術減少了指令執行所需要的時鐘周期數,兩者結合可以大大提高CPU的執行效率。