




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、(完整word版)MIPS流水線CPU的verilog實現(完整word版)MIPS流水線CPU的verilog實現實驗目的了解提高CPU性能的方法。掌握流水線MIPS微處理器的工作原理。理解數據冒險、控制冒險的概念以及流水線沖突的解決方法。掌握流水線MIPS微處理器的測試方法。實驗任務設計一個32位流水線MIPS微處理器,具體要求如下:至少運行下列MIPS32指令。算術運算指令:ADD、ADDU、SUB、SUBU、ADDI、ADDIU。邏輯運算指令:AND、OR、NOR、XOR、ANDI、ORI、XORI、SLT、SLTU、SLTI、SLTIU。移位指令:SLL、SLLV、SRL、SRLV、
2、SRA。條件分支指令:BEQ、BNE、BGEZ、BGTZ、BLEZ、BLTZ。無條件跳轉指令:J、JR。數據傳送指令:LW、SW。空指令:NOP。采用5級流水線技術,對數據冒險實現轉發或阻塞功能。在XUP Virtex- Pro 開發系統中實現MIPS微處理器,要求CPU的運行速度大于25MHz。實驗原理總體設計流水線是數字系統中一種提高系統穩定性和工作速度的方法,廣泛應用于高檔CPU的架構中。根據MIPS處理器的特點,將整體的處理過程分為取指令(IF)、指令譯碼(ID)、執行(EX)、存儲器訪問(MEM)和寄存器會寫(WB)五級,對應多周期的五個處理階段。如圖所示,一個指令的執行需要5個時鐘
3、周期,每個時鐘周期的上升沿來臨時,此指令所代表的一系列數據和控制信息將轉移到下一級處理。圖 流水線流水作業示意圖由于在流水線中,數據和控制信息將在時鐘周期的上升沿轉移到下一級,所以規定流水線轉移變量命名遵守如下格式:名稱_流水線級名稱例如:在ID級指令譯碼電路(Decode)產生的寄存器寫允許信號RegWrite在ID級、EX級、MEM級和WB級上的命名分別為RegWrite_id、RegWrite_ex、RegWrite_mem和RegWrite_wb。在頂層文件中,類似的變量名稱有近百個,這樣的命名方式起到了很好的識別作用。流水線中的控制信號(1)IF級:取指令級。從ROM中讀取指令,并在
4、下一個時鐘沿到來時把指令送到ID級的指令緩沖器中。該級控制信號決定下一個指令指針的PCSource信號、阻塞流水線的PC_IFwrite信號、清空流水線的IF_flush信號。(2)ID級:指令譯碼器。對IF級來的指令進行譯碼,并產生相應的控制信號。整個CPU的控制信號基本都是在這級上產生。該級自身不需任何控制信號。流水線冒險檢測也在該級進行,冒險檢測電路需要上一條指令的MemRead,即在檢測到冒險條件成立時,冒險檢測電路產生stall信號清空ID/EX寄存器,插入一個流水線氣泡。(3)EX級:執行級。該級進行算術或邏輯操作。此外LW、SW指令所用的RAM訪問地址也是在本級上實現。控制信號有
5、ALUCode、ALUSrcA、ALUScrB和RegDst,根據這些信號確定ALU操作、選擇兩個ALU操作數A、B,并確定目標寄存器。另外,數據轉發也在該級完成。數據轉發控制電路產生ForwardA和ForwardB兩組控制信號。(4)MEM級:存儲器訪問級。只有在執行LW、SW指令時才對存儲器進行讀寫,對其他指令只起到一個周期的作用。該級只需存儲器寫操作允許信號MemWrite。(5)WB級:寫回級。該級把指令執行的結果回寫到寄存器文件中。該級設置信號MemtoReg和寄存器寫操作允許信號RegWrite,其中MemtoReg決定寫入寄存器的數據來自于MEM級上的緩沖值或來自于MEM級上的
6、存儲器。2)流水線冒險在流水線CPU中,多條指令通知執行,由于各種各樣的原因,在下一個時鐘周期中下一條指令不能執行,這種情況稱為冒險。冒險分為三類:結構冒險:硬件不支持多條指令在同一個時鐘周期內執行。MIPS指令集專為流水線設計,因此在MIPS CPU中不存在此類冒險。數據冒險:在一個操作必須等待另一操作完成后才能進行時,流水線必須停頓,這種情況稱為數據冒險。數據冒險分為兩類:數據相關:流水線內部其中任何一條指令要用到任何其他指令的計算結果時,將導致數據冒險。通常可以用數據轉發(數據定向)來解決此類冒險。數據冒險:此類冒險發生在當定向的目標階段在時序上早于定向的源階段時,數據轉發無效。通常是引
7、入流水線阻塞,即氣泡(bubble)來解決。控制冒險:CPU需要根據分支指令的結果做出決策,而此時其他指令可能還在執行中,這時會出現控制冒險,也稱為分支冒險。解決此類冒險的常用方法是延遲分支。)數據相關與轉發下面通過具體例子來闡述數據相關。見圖圖 數據相關性問題實例圖圖 數據相關性問題實例圖可見,后4條指令都依賴于第一條指令得到寄存器$2的結果,但sub指令要在第五周期才寫回寄存器$2,但在第三、四、五個時鐘周期$2分別要被and、or和add三個指令用到,所以這三個指令得到的是錯誤的未更新的數據,會引起錯誤的結果;而第六個時鐘周期$2要被sw指令用到,此時得到的才是正確的已更新的數據。這種數
8、據之間的互相關聯引起的冒險就是數據相關。可以看出,當一條依賴關系的方向與時間軸的方向相反時,就會產生數據冒險。(1)一階數據相關與轉發(EX冒險)首先討論指令sub與and之間的相關問題。sub指令在第五周期寫回寄存器$2,而and指令在第四周期就對sub指令的結果$2提出申請,顯然將得到錯誤的未更新的數據。像這類第I條指令的源操作寄存器與第I-1條指令(即上一條指令)的目標寄存器相重,導致的數據相關稱為一階數據相關。見圖中實線所示。 圖 一階數據相關實例圖可以發現,sub指令的結果其實在EX級結尾,即第三周期末就產生了;而and指令在第四時鐘周期向sub指令結果發出請求,請求時間晚于結果產生
9、時間,所以只需要sub指令結果產生之后直接將其轉發給and指令就可以避免一階數據相關。如圖虛線所示。轉發數據為ALUResult_mem數據轉發由Forwarding unit單元控制,判斷轉發條件是否成立。轉發機制硬件實現見圖圖 轉發機制的硬件實現轉發條件ForwardA、ForwardB作為數據選擇器的地址信號,轉發條件不成立時,ALU操作數從ID/EX流水線寄存器中讀取;轉發條件成立時,ALU操作數取自數據旁路。轉發條件:MEM級指令是寫操作,即RegWrite_mem=1;MEM級指令寫回的目標寄存器不是$0,即RegWriteAddr_mem0;MEM級指令寫回的目標寄存器與在EX級
10、指令的源寄存器是同一寄存器,即RegWriteAddr_mem=RsAddr_ex 或 RegWriteAddr_mem=RtAddr_ex。(2)二階數據相關與轉發(MEM冒險)接下來討論sub指令與or指令之間的相關問題。sub指令在第5時鐘周期寫回寄存器,而or指令也在第5時鐘周期對sub指令的結果提出了請求,很顯然or指令讀取的數據是未被更新的錯誤內容。這類第I條指令的源操作寄存器與第I-2條指令(即之上第二條指令)的目標寄存器相重,導致的數據相關稱為二階數據相關。見圖中實線所示。圖 一階數據相關實例圖如前所述,or指令在第五時鐘周期向sub指令結果發出請求時,sub指令的結果已經產生
11、。所以,我們同樣采用“轉發”,即通過MEM/WB流水線寄存器,將sub指令結果轉發給or指令,而不需要先寫回寄存器堆。如圖中虛線所示。轉發數據為RegWriteData_wb轉發條件:WB級指令是寫操作,即RegWrite_wb=1;WB級指令寫回的目標寄存器不是$0,即RegWriteAddr_wb0;WB級指令寫回的目標寄存器與在EX級指令的源寄存器是同一寄存器,即RegWriteAddr_wb=RsAddr_ex 或 RegWriteAddr_wb=RtAddr_ex;EX冒險不成立,即RegWriteAddr_memRsAddr_ex 或 RegWriteAddr_mem=RtAddr
12、_ex。(3)三階數據相關與轉發最后討論sub指令與add指令之間的相關問題。sub指令與add指令在第五時鐘周期內同時讀寫同一個寄存器。這類同一周期內同時讀寫同一個寄存器的數據相關稱之為三階數據相關。如圖中實線所示。圖 三階數據相關實例圖假設寄存器的寫操作發生在時鐘周期的上升沿,而讀操作發生在時鐘周期的下降沿,那么讀操作將讀取到最新寫入的內容。在這種假設條件下將不會發生數據冒險。這就要求流水線中的寄存器具有“先寫后讀(Read After Write)”的特性。這類“寫操作發生在時鐘周期的上升沿,讀操作發生在時鐘周期的下降沿”的寄存器雖然在理論上是可實現的,但是不適合應用于同步系統,因為它不
13、但影響系統的運行速度,而且影響系統的穩定性,是不可取的。因此,我們采用“轉發”機制來解決三階數據相關冒險。該部分轉發電路我們放在寄存器堆的設計中完成。如圖中虛線所示。轉發數據為RegWriteData_wb。轉發條件為:WB級指令是寫操作,即RegWrite_wb=1;WB級指令寫回的目標寄存器不是$0,即RegWriteAddr_wb0;WB級指令寫回的目標寄存器與在ID級指令的源寄存器是同一寄存器,即RegWriteAddr_wb=RsAddr_id 或 RegWriteAddr_wb=RtAddr_id。)數據冒險與阻塞當一條指令試圖讀取一個寄存器,而它前一條指令是lw指令,并且該lw指
14、令寫入的是同一個寄存器時,定向轉發的方法就無法解決問題。如圖所示圖 數據冒險與阻塞實例圖圖 數據冒險與阻塞實例圖注意到lw指令只能在第四時鐘周期從內存中讀出數據,因此它和緊隨其后的and指令之間的依賴關系與時序方向是相反的,這種冒險是無法通過轉發來實現的。這類冒險不同于數據相關冒險,需要單獨一個“冒險檢測單元(Hazard Detector)”,它在ID級完成。冒險成立的條件為:上一條指令是lw指令,即MemRead_ex=1;在EX級的lw指令與在ID級的指令讀寫的是同一個寄存器,即RegWriteAddr_ex=RsAddr_id 或 RegWriteAddr_ex=RtAddr_id。冒
15、險的解決:為解決數據冒險,我們引入流水線阻塞。當Hazard Detector檢測到冒險條件成立時,在lw指令和下一條指令之間插入阻塞,即流水線氣泡(bubble),使后一條指令延遲一個時鐘周期執行,這樣就將該冒險轉化為二階數據相關,可用轉發解決。如圖所示。圖 流水線氣泡的引入需要注意的是,如果處于ID級的指令被阻塞,那么處于IF級的指令也必須阻塞,否則,處于ID級的指令就會丟失。防止這兩條指令繼續執行的方法是:保持PC寄存器和IF/ID流水線寄存器不變,同時插入一個流水線氣泡。具體實現方法如下:在ID級檢測到冒險條件時, HazardDetector輸出兩個信號:Stall與PC_IFWri
16、te。Stall信號將ID/EX流水線寄存器中的EX、MEM和WB級控制信號全部清零。這些信號傳遞到流水線后面的各級,由于控制信號均為零,所以不會對任何寄存器和存儲器進行寫操作,高電平有效。PC_IFWrite信號禁止PC寄存器和IF/ID流水線寄存器接收新數據,低電平有效。)分支冒險還有一類冒險是包含分支的流水線冒險,下圖。圖 分支冒險實例流水線每個時鐘周期都得取指令才能維持運行,但分支指令必須等到MEM級才能確定是否執行分支。這種為了確定預取正確的指令而導致的延遲叫做控制冒險或分支冒險。一種比較普遍的提高分支阻塞速度的方法是假設分支不發生,并繼續執行順序的指令流。如果分支發生的話,就丟棄已
17、經預取并譯碼的指令,指令的執行沿著分支目標繼續。由于分支指令直到MEM級才能確定下一條指令的PC,這就意味著為了丟棄指令必須將流水線中的IF、ID和EX級的指令都清除掉(flush)。這種優化方法的代價較大,效率較低。如果我們能在流水線中提前分支指令的執行過程,那么就能減少需要清除的指令數。這是一種提高分支效率的方法,降低了執行分支的代價。因此我們采用提前分支指令的方法解決分支冒險。提前分支指令需要提前完成兩個操作:計算分支的目的地址:由于已經有了PC值和IF/ID流水線寄存器中的指令值,所以可以很方便地將EX級的分支地址計算電路移到ID級。我們針對所有指令都執行分支地址的計算過程,但只有在需
18、要它的時候才會用到。判斷分支指令的跳轉條件:我們將用于判斷分支指令成立的Zero信號檢測電路(Z test )從ALU中獨立出來,并將它從EX級提前至ID級。具體的設計將在ID級設計中介紹。在提前完成以上兩個操作之外,我們還需丟棄IF級的指令。具體做法是:加入一個控制信號IF_flush,做為IF/ID流水線寄存器的清零信號。當分支冒險成立,即Z=1,則IF_flush=1,否則IF_flush=0,故IF_flush = Z。考慮到本系統還要實現的無條件跳轉指令:J和JR,在執行這兩個指令時也必須要對IF/ID流水線寄存器進行清空,因此, IF_flush的表達式應表示為:IF_flush
19、= Z | J | JR。MIPS指令格式R型指令格式op、funct:共同決定指令名稱,都為6位;rs :指定第一操作數的寄存器地址,為5位;rt :指定第二操作數的寄存器地址,為5位;rd :指定目標寄存器地址,為5位;sa :位移運算的移動位數,為5位。本實驗要實現的R型指令有:算術邏輯運算指令:ADD、ADDU、SUB、SUBU、AND、OR、NOR、XOR 、SLT、SLTU移位指令:SLLV、SRLV、SRAV、SLL、SRL、SRA寄存器跳轉指令:JRI型指令格式op :決定指令名稱,為6位;rs :指定第一操作數的寄存器地址,為5位;rt :儲存結果的寄存器地址,為5位;Imm
20、:立即數,為16位。本實驗要實現的I型指令有:存儲器訪問指令:LW、SW立即數算術邏輯運算指令:ADDI、ADDIU、ANDI、ORI、XORI、SLTI、SLTIU分支指令:BEQ、BNE、BGEZ、BGTZ、BLEZ、BLTZ注:I型指令中立即數算術邏輯運算指令對立即數(Imm)的處理應分為兩類情況考慮:當指令為ADDI、ADDIU、SLTI、SLTIU時,指令中的16位立即數(Imm)應做符號擴展為32位:sign-extend(Imm)。此符號擴展電路在ID級完成。當指令為ANDI、ORI、XORI時,Imm應做“0”擴展為32位。考慮到資源的限制,在執行ANDI、ORI、XORI指令
21、時,“0”擴展功能放在ALU內部(即EX級)完成。對于條件分支指令:不執行分支語句時,跳轉地址應為下一條地址;執行分支語句時,跳轉地址應為下一條地址加上跳轉指令數,即為立即數。由于跳轉方向有兩個:向前與向后,故立即數存在正負性,應該有符號擴展為32位:sign-extend(Imm)。如果能夠將立即數的位數擴充,跳轉指令的范圍將大大增加。由于CPU中指令的起始地址都是4的倍數,因此它們地址的后兩位都是0,那么跳過的指令數后兩位也應為2b00,故可將16為立即數左移兩位擴充為18位,尋址地址范圍也擴大4倍。因此分支地址可表示為PC+4+sign-extend(Imm)2.對于取字指令LW操作為:
22、rt=Memrs+sign_extend(Imm)對于存字指令SW操作為:Memrs+sign_extend(Imm)0)5d13BLEZ_op5d0Z=(A0)5d14BLTZ_op5d0Z=(A0)5d15R_type_opADD_funct加5d0ADDU_functAND_funct與5d1XOR_funct異或5d2OR_funct或5d3NOR_funct或非5d4SUB_funct減5d5SUBU_functSLT_functAB?1:05d19SLTU_functAB?1:0(無符號數)5d20SLL_functBA5d17SRLV_functSRA_functBA5d18SR
23、AV_functopfunctrt運算ALUCodeADDI_op加5d0ADDIU_opANDI_op與5d6XORI_op異或5d7ORI_op或5d8SLTI_opAB?1:05d19SLTIU_opAB?1:0(無符號數)5d20SW_op加(計算地址)5d0LW_op分支檢測(Branch Test)電路的設計Zero檢測電路主要用于判斷Branch指令的分支條件是否成立,其中BEQ、BNE兩個操作數為RsData與RtData,而BGEZ、BGTZ、BLEZ和BLTZ指令則為RsData與常數0比較,所以輸出信號Z的表達式為:RsData31 | (| RsData31: 0) ;
24、 ALUCode=alu _blezRsData31 ; ALUCode=alu _bltz RsData31 & (| RsData31: 0) ; ALUCode=alu _bgtzZ= RsData31; ALUCode=alu _bgez| ( RsData31: 0 RtData31: 0) ; ALUCode=alu_bne& ( RsData31: 0 RtData31: 0 ); ALUCode=alu_beq0; ALUCode=OTHER寄存器堆(Registers)的設計寄存器堆由32個32位寄存器組成,這些寄存器通過寄存器號進行讀寫存取。寄存器堆的原理框圖如圖所示。因為
25、讀取寄存器不會更改其內容,故只需提供寄存號即可讀出該寄存器內容。讀取端口采用數據選擇器即可實現讀取功能。應注意“0”號寄存器為常數0.對于往寄存器里寫數據,需要目標寄存器號(WriteRegister)、待寫入數據(WriteData)、寫允許信號(RegWrite)三個變量。圖中5位二進制譯碼器完成地址譯碼,其輸出控制目標寄存器的寫使能信號EN,決定將數據WriteData寫入哪個寄存器。在流水線CPU設計中,寄存器堆設計還應解決三階數據相關的數據轉發問題。當滿足三階數據相關條件時,寄存器具有Read after Write的特性。為實現該功能,在寄存器堆的基礎上加一轉發電路。如圖所示。圖中
26、轉發檢測電路的輸出表達式為RsSel=RegWrite_wb&(RegWriteAddr_wb=0)&(RegWriteAddr_wb=RsAddr_id)RtSel=RegWrite_wb&(RegWriteAddr_wb=0)&(RegWriteAddr_wb=RtAddr_id)冒險檢測功能(Hazard Deterctor)的設計由前面分析可知,冒險成立的條件為:上一條指令是LW指令,即MemRead_ex=1;在EX級的LW指令與在ID級的指令讀寫的是同一個寄存器,即RegWriteAddr_ex=RsAddr_id 或 RegWriteAddr_ex=RtAddr_id解決冒險的方
27、法為:插入一個流水線氣泡Stall清空ID/EX寄存器并且阻塞流水線ID級、IF級流水線,有:Stall=(RegWriteAddr_ex=RsAddr_id)|(RegWriteAddr_ex=RtAddr_id)&MemRead_ex保持PC寄存器和IF/ID流水線寄存器不變,有:PC_IFWrite=Stall其它單元電路的設計Branch指令分支地址的計算電路:BranchAddr=NextPC_id+(sign-extend(Imm_id)2)JR指令跳轉地址的計算電路:JRAddr=RsData_idJ指令跳轉地址的計算電路:Jaddr=NextPC_id31:28,IR_id25
28、:0,2b00 符號擴展的方法針對有符號數 如果最高位(即符號位)是0,則要擴展的高位用0補齊;如果最高位是1,則用1補齊。 例: 8位的+1,表示為二進制為00000001,擴展成16位的話,符號擴展為0000000000000001;8位的-1,表示成二進制為,擴展成16位的話,符號擴展為111 。 0擴展的方法針對無符號數 要擴展的高位用0補齊。 例:16位二進制0 xFFFF(無符號數65535), 0擴展成32位為0 x0000FFFF (無符號數65535) 。執行模塊EX的設計執行模塊主要有ALU子模塊、轉發電路Forwarding以及若干數據選擇器組成。這行模塊的接口信息如下表
29、所示:引腳名稱方向說 明RegDst_exInput方向決定Register回寫時采用的地址(rt/rd)ALUCode_ex4:0決定ALU采用何種運算ALUSrcA_ex決定ALU的A操作數的來源(rs/Sa)ALUSrcB_ex決定ALU的B操作數的來源(rt/Imm)引腳名稱說 明Imm_ex31:0Input立即數Sa_ex31:0移位位數RsAddr_ex4:0Rs寄存器地址,即Instruction_id25:21RtAddr_ex4:0Rt寄存器地址,即Instruction_id20:16RdAddr_ex4:0Rd寄存器地址,即Instruction_id15:11RsDa
30、ta_ex31:0Rs寄存器數據RtData_ex31:0Rt寄存器數據RegWriteData_wb31:0寫入寄存器的數據ALUResult_mem31:0ALU輸出數據RegWriteAddr_wb4:0寄存器的寫地址RegWriteAddr_mem4:0RegWrite_wb寄存器寫允許信號RegWrite_memRegWriteAddr_ex4:0Output寄存器的寫地址ALUResult_ex31:0ALU運算結果MemWriteData_ex31:0寄存器的回寫數據ALU_A31:0ALU操作數,測試時使用ALU_B31:0ALU子模塊的設計ALU是提供CPU基本運算能力的重要
31、電路。ALU執行何種運算,由控制單元中的ALU控制器輸出的ALUCode信號決定。ALU功能見下表:ALUCodeALUResultalu_add = 5b00000A+Balu_and = 5b00001A&Balu_xor = 5b00010ABalu_or = 5b00011A|Balu_nor = 5b00100(A|B)alu_sub = 5b00101A-Balu_andi= 5b00110A&16b0,B15:0alu_xori= 5b00111A16b0,B15:0alu_ori = 5b01000A|16b0,B15:0alu_sll = 5b10000BAalu_sra =
32、 5b10010BAalu_slt = 5b10011AB?1:0,其中A、B為有符號數alu_sltu= 5b10100AB?1:0,其中A、B為無符號數為了提高運算速度,可將各種運算同時執行,得到的運算結果由ALUCode信號進行挑選。ALU的基本結構如圖所示。圖 ALU的基本結構加、減電路的設計考慮減法、比較(SLT、SLTI)及部分分支指令(BEQ、BNE)均可用加法器和必要的輔助電路來實現。圖中的Binvert信號控制加減運算:Binvert=(ALUCode=alu_add)對ALU來說,它的兩個操作數輸入時都已經是補碼形式,當要完成兩個操作數的減法時,即A補-B補,可將減法轉換為
33、加法,利用加法器來實現:A補-B補= A補+(-B補)= A補+(B補)補= A補+(B補)反+1加法器完成的功能為:sum=A+B32Binvert+Binvert當Binvert=0時,sum=A+B0+0= A+B;當Binvert=1時,sum=A+B32b1+1= A-B;(B32b1即對B按位取反)即可完成加減運算。由于32位加法器的運算速度影響著CPU頻率的高低,因此設計一個高速加法器尤為重要,本實驗采用lab7中介紹的32位進位選擇加法器。比較電路的設計考慮對于比較運算,如果最高為不同,即A31B31,則根據A31、B31決定比較結果,但應注意有符號數和無符號數比較運算的區別。
34、在有符號數比較SLT運算中,判斷AB的方法為:若A為負數、B為0或正數:A31&(B31)若A、B符號相同,A-B為負:(A31B31) & sum31則SLTResult=(A31&(B31) |( (A31B31) & sum31)在無符號數比較SLT運算中,判斷AB的方法為:若A最高位為0、B最高位為1:(A31 )&B31若A、B最高位相同,A-B為負:(A31B31) & sum31則SLTResult=(A31 )&B31) |( (A31B31) & sum31)算術右移運算電路的設計考慮Verilog HDL的算術右移的運算符為“”。要實現算術右移應注意,被移位的對象必須定義為
35、reg類型,但是在SRA指令,被移位的對象操作數B為輸入信號,不能定義為reg類型,因此必須引入reg類型中間變量B_reg,相應的Verilog HDL語句為:reg signed 31:0 B_reg;always (B) beginB_reg = B; end引入reg類型的中間變量B_reg后,就可對B_reg進行算術右移操作。邏輯運算與、或、或非、異或、邏輯移位等運算較為簡單,只是要注意一點,ANDI、XORI、ORI三條指令的立即數為16位無符號數,應“0擴展”為32位無符號數,在運算的同時完成“0擴展”。如:ADDI指令的運算為A&16b0,B15:0。轉發電路Forwardin
36、g的設計操作數A和B由數據選擇器決定,數據選擇器的地址信號即為ForwardA和ForwardB。其含義如下表:地址操作數來源說明ForwardA=00RsData_ex操作數A來自寄存器堆ForwardA=01RegWriteData_wb操作數A來自二階數據相關的轉發數據ForwardA=10ALUresult_mem操作數A來自一階數據相關的轉發數據ForwardB=00RtData_ex操作數B來自寄存器堆ForwardB=01RegWriteData_wb操作數B來自二階數據相關的轉發數據ForwardB=10ALUresult_mem操作數B來自一階數據相關的轉發數據由前面介紹的一
37、、二階數據相關判斷條件,不難得到:ForwardA0=RegWrite_wb&(RegWriteAddr_wb!=0) &(RegWriteAddr_mem!=RsAddr_ex) &(RegWriteAddr_wb=RsAddr_ex);ForwardA1=RegWrite_mem&(RegWriteAddr_mem!=0) &(RegWriteAddr_mem=RsAddr_ex); ForwardB0=RegWrite_wb&(RegWriteAddr_wb!=0) &(RegWriteAddr_mem!=RtAddr_ex) &(RegWriteAddr_wb=RtAddr_ex);F
38、orwardB1=RegWrite_mem&(RegWriteAddr_mem!=0) &(RegWriteAddr_mem=RtAddr_ex);存儲器訪問MEM模塊的設計數據存儲器利用Xilinx Core Generator實現。考慮到FPGA的資源,數據存儲器可設計為容量各為2632bit單端口RAM。由于MIPS系統的32位字地址由4 個字節組成,根據“對齊限制”要求字地址必須是4的倍數,也就是說字地址的低兩位必須是0,所以字地址的低兩位不接入電路。故我們設計的數據RAM的地址應該接的信號是ALUResult_mem7:2。由于VIRTEXII PRO只能產生帶寄存器的內核RAM,所
39、以存儲器輸出繞過MEM/WB流水線寄存器,直接接入WB級的數據選擇器。圖與圖中的虛線就是表示這種含義.寫回級WB模塊的設計WB部分非常簡單,只有一個數據選擇器選擇寫回的數據來源,可在頂層模塊中直接實現。取指令級IF模塊的設計IF模塊由指令指針寄存器PC、指令存儲器子模塊Instruction ROM、指令指針選擇器MUX和一個32位加法器組成,IF級模塊接口信息如下表所示:引腳名稱方向說 明clkInput系統時鐘reset系統復位信號,高電平有效Z分支指令的條件判斷結果J跳轉指令JR寄存器跳轉指令PC_IFWrite阻塞流水線的信號,低電平有效JumpAddr31:0J指令跳轉地址JrAdd
40、r31:0JR指令跳轉地址BranchAddr31:0條件分支地址Instruction_if31:0Output指令機器NextPC_if31:0下一個PC值指令存儲器ROM用Xilinx CORE Generator實現產生的ROM無法滿足流水線CPU的指令要求,我們需用Verilog HDL設計一個ROM陣列。考慮到FPGA的資源,指令存儲器可設計為容量各為2632bit的ROM。設計ROM時需將測試的機器碼寫入,課程提供一段簡單測試程序的機器碼,機器碼存于文件中。課程已提供該ROM的代碼,已設計好上述測試程序機器碼的指令存儲器,文件名為。需要注意的是,ROM的地址信號同RAM一樣有“對
41、齊限制”的要求,因此, ROM的地址應該接的信號是PC7:2。指令指針選擇器指令指針選擇器為一8選1數據選擇器,選擇信號為PCSource=JR,J,Z,具體含義如下表:地址PC來源JR,J,Z= 100JR指令的跳轉地址JR,J,Z= 010J指令的跳轉地址JR,J,Z= 001Branch指令的分支地址JR,J,Z= 000下一條指令地址PC+4PC寄存器當發生數據冒險時,需要保持PC寄存器不變,因此PC寄存器是一個帶使能端的D型寄存器,使能信號為PC_IFWrite。流水線寄存器的設計流水線寄存器負責將流水線的各部分分開,共有IF/ID、ID/EX、EX/MEM、MEM/WB四組。根據前
42、面的介紹可知,四組流水線寄存器要求不完全相同,因此設計也有不同考慮。(1)EX/MEM、MEM/WB兩組流水線寄存器只是普通D型寄存器。(2)當流水線發生數據冒險時,需清空ID/EX流水線寄存器而插入一個氣泡,因此ID/EX流水線寄存器是一個帶同步清零功能的D型寄存器,清零信號為Stall。(3)當流水線發生數據冒險時,需保持IF/ID流水線寄存器不變,因此IF/ID流水線寄存器具有使能信號輸入,使能信號為PC_IFWrite;當流水線發生分支冒險時,需清空IF/ID流水線寄存器,清零信號為IF_flush。因此,IF/ID流水線寄存器是一個帶使能功能、同步清零功能的D型寄存器。需要注意的是,
43、由于仿真對初始值的要求,上述寄存器都應考慮有reset信號的接入,以提供仿真時各寄存器的初值。頂層文件的設計按照流水線MIPS微處理器的原理框圖連接各模塊即可。為方便測試,可將關鍵變量輸出,關鍵變量有:指令指針PC、指令碼Instruction、流水線插入氣泡標志Stall、分支標志JumpFlag(即JR,J,Z)、ALU輸入輸出(ALU_A、ALU_B、ALUResult)和數據存儲器的輸出MemDout_wb。實驗代碼見附錄二。實驗設備裝有ISE、ModelSim SE和ChipScope Pro軟件的計算機;XUP Virtex- Pro開發系統一套;SVGA顯示器一臺。實驗仿真結果與
44、分析ID級仿真Decode子模塊的仿真測試指令為:Instruction = 32h0800000b; Instruction = 32h8d2c0008; 由此判斷該模塊符合設計要求。(2)ID模塊仿真測試指令仍為Decode模塊的測試指令,由于已確定Decode模塊設計正確,故只觀察出Decode輸出信號外的信號。a) Instruction = 32h; JR、J、Z都為0,PC輸入只為NextPC=PC+4,符合要求。PC_IFWrite=0,PC保持。符合設計要求JR、J、Z=100 PC=JrAddrJR、J、Z=010 PC=JumpAddrJR、J、Z=001 PC=branc
45、hAddr符合設計要求初始指令為J指令,J=1,所以IF_flash=1,清空IF/ID級寄存器,下一周期指令=0.J=1,使PC跳轉beq分支成立,Z=1,IF_flash=1,清空IF/ID級寄存器,下一周期指令=0.bne分支不成立數據相關,可以看到前兩個指令的結果正確轉發到操作數A與B加立即數4,下一周期操作數B=4,$0始終寄存0,操作數A=0,故ALUResult=4沒有跳轉,可以看到PC正常增加加立即數42,下一周期操作數B=42,$0始終寄存0,操作數A=0,故ALUResult=42同樣的LW指令,下一周期不存在數據冒險 Sll位移運算,操作數為Sa=2LW指令,$t1寄存4
46、,即為操作數A,操作數B為立即數8$t3SW指令,操作數B為立即數0c。儲存$t3=0000007e,在兩周期后存入DataRAM數據冒險,阻塞信號Stall=1,流水線被阻塞SLTU指令,無符號判斷大小,AB?1:0,結果正確J指令,向本身跳轉,不斷循環(A), .b(B1), .ci(Binvert), .s(sum), .co();JR、J、Z都為0,PC輸入只為NextPC=PC+4,符合要求。PC_IFWrite=0,PC保持。符合設計要求JR、J、Z=100 PC=JrAddrJR、J、Z=010 PC=JumpAddrJR、J、Z=001 PC=branchAddr符合設計要求初
47、始指令為J指令,J=1,所以IF_flash=1,清空IF/ID級寄存器,下一周期指令=0.J=1,使PC跳轉beq分支成立,Z=1,IF_flash=1,清空IF/ID級寄存器,下一周期指令=0.bne分支不成立數據相關,可以看到前兩個指令的結果正確轉發到操作數A與B加立即數4,下一周期操作數B=4,$0始終寄存0,操作數A=0,故ALUResult=4沒有跳轉,可以看到PC正常增加加立即數42,下一周期操作數B=42,$0始終寄存0,操作數A=0,故ALUResult=42同樣的LW指令,下一周期不存在數據冒險 Sll位移運算,操作數為Sa=2LW指令,$t1寄存4,即為操作數A,操作數B
48、為立即數8$t3SW指令,操作數B為立即數0c。儲存$t3=0000007e,在兩周期后存入DataRAM數據冒險,阻塞信號Stall=1,流水線被阻塞SLTU指令,無符號判斷大小,AB?1:0,結果正確J指令,向本身跳轉,不斷循環 always (*) begin case(ALUCode) alu_add: Result=sum; alu_and: Result=A&B; alu_xor: Result=AB; alu_or: Result=A|B; alu_nor: Result=(A|B); alu_sub: Result=sum; alu_andi: Result=A&16d0,B1
49、5:0; alu_xori: Result=A16d0,B15:0; alu_ori: Result=A|16d0,B15:0; alu_sll: Result=BA; alu_srl: ResultA; alu_sra: ResultA; alu_slt: Result=(A31&(B31)|(A31B31)&sum31); alu_sltu: Result=(A31)&B31)|(A31B31)&sum31); alu_jr: Result=A; default: Result=32b0; endcase endendmodule頂層模塊module MipsPipelineCPU(clk
50、, reset, JumpFlag, Instruction_id, ALU_A, ALU_B, ALUResult, PC, RegWriteData_wb,Stall); input clk; input reset; output2:0 JumpFlag; output 31:0 Instruction_id; output 31:0 ALU_A; output 31:0 ALU_B; output 31:0 ALUResult; output 31:0 PC;output 31:0 RegWriteData_wb; output Stall;lk(clk), .reset(reset)
51、, .Z(Z), .J(J), .JR(JR), .PC_IFWrite(PC_IFWrite), .JumpAddr(JumpAddr), .JrAddr(JrAddr), .BranchAddr(BranchAddr), nstruction_if(Instruction_if), .PC(PC), .NextPC_if(NextPC_if); (Instruction_if), .en(PC_IFWrite), .r(IF_flush|reset), .clk(clk), .q(Instruction_id); dffre #(32) dffre2( .d(NextPC_if), .en
52、(PC_IFWrite), .r(IF_flush|reset), .clk(clk), .q(NextPC_id);lk(clk),.Instruction_id(Instruction_id), .NextPC_id(NextPC_id), .RegWrite_wb(RegWrite_wb), .RegWriteAddr_wb(RegWriteAddr_wb), .RegWriteData_wb(RegWriteData_wb), .MemRead_ex(MemRead_ex), .RegWriteAddr_ex(RegWriteAddr_ex), .MemtoReg_id(MemtoRe
53、g_id), .RegWrite_id(RegWrite_id), .MemWrite_id(MemWrite_id), .MemRead_id(MemRead_id), .ALUCode_id(ALUCode_id), .ALUSrcA_id(ALUSrcA_id), .ALUSrcB_id(ALUSrcB_id), .RegDst_id(RegDst_id), .Stall(Stall), .Z(Z), .J(J), .JR(JR), .PC_IFWrite(PC_IFWrite), .BranchAddr(BranchAddr), .JumpAddr(JumpAddr),.JrAddr(
54、JrAddr),.Imm_id(Imm_id), .Sa_id(Sa_id), .RsData_id(RsData_id), .RtData_id(RtData_id),.RtAddr_id(RtAddr_id),.RdAddr_id(RdAddr_id),.RsAddr_id(RsAddr_id);(MemtoReg_id,RegWrite_id), .r(Stall|reset), .clk(clk), .q(MemtoReg_ex,RegWrite_ex); dffr #(2) M_I_E( .d(MemWrite_id,MemRead_id), .r(Stall|reset), .clk(clk), .q(MemWrite_ex,MemRead_ex); dffr #(8) EX_I_E( .d(ALUCode_id,ALUSrcA_id,ALUSrcB_id,RegDst_id), .r(Stall|reset), .clk(clk), .q(ALUCode_ex,ALUSrcA_ex,ALUSrcB_ex,RegDst_ex); dffr #(32) Data_Sa(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工作與生活兩不誤的策略
- 工作中的自律性對提高效率的影響
- 工業自動化發展趨勢及技術革新
- 工業設計的美學與產品設計實踐
- 工作效率提升技巧與策略
- 工業領域物聯網環保應用研究
- 工作模式變革下的組織文化創新
- 工作流程優化與持續改進方法
- 工廠安全生產與應急預案制作
- 工程建筑中巖土工程的實踐應用
- 福建省2025年6月普通高中學業水平合格性考試地理模擬卷二(含答案)
- 2025年山東省濟寧市泗水縣中考三模地理試題(含答案)
- 2025年文件歸檔管理考試題及答案分析
- 文明小學生主題班會課件
- 2024年中考歷史試題分類匯編:世界近代史(原卷版+解析)
- 購買私人地皮合同范本
- T/CWPIA 2-2020戶外重組竹地板鋪裝技術規范
- 2025屆黃岡市重點中學八下數學期末統考試題含解析
- 2025年英語四級考試模擬試卷及答案
- 跨學科視域下道德與法治與心理健康教育融合的探究
- 智能在線問卷調查系統開發合同
評論
0/150
提交評論