




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、一、 實驗?zāi)康?. 了解提高CPU性能的方法。2. 掌握流水線MIPS微處理器的工作原理。3. 理解數(shù)據(jù)冒險、控制冒險的概念以及流水線沖突的解決方法。4. 掌握流水線MIPS微處理器的測試方法。二、 實驗任務(wù)設(shè)計一個32位流水線MIPS微處理器,具體要求如下:1. 至少運行下列MIPS32指令。(1) 算術(shù)運算指令:ADD、ADDU、SUB、SUBU、ADDI、ADDIU。(2) 邏輯運算指令:AND、OR、NOR、XOR、ANDI、ORI、XORI、SLT、SLTU、SLTI、SLTIU。(3) 移位指令:SLL、SLLV、SRL、SRLV、SRA。(4) 條件分支指令:BEQ、BNE、BG
2、EZ、BGTZ、BLEZ、BLTZ。(5) 無條件跳轉(zhuǎn)指令:J、JR。(6) 數(shù)據(jù)傳送指令:LW、SW。(7) 空指令:NOP。2. 采用5級流水線技術(shù),對數(shù)據(jù)冒險實現(xiàn)轉(zhuǎn)發(fā)或阻塞功能。3. 在XUP Virtex- Pro 開發(fā)系統(tǒng)中實現(xiàn)MIPS微處理器,要求CPU的運行速度大于25MHz。三、 實驗原理1. 總體設(shè)計流水線是數(shù)字系統(tǒng)中一種提高系統(tǒng)穩(wěn)定性和工作速度的方法,廣泛應(yīng)用于高檔CPU的架構(gòu)中。根據(jù)MIPS處理器的特點,將整體的處理過程分為取指令(IF)、指令譯碼(ID)、執(zhí)行(EX)、存儲器訪問(MEM)和寄存器會寫(WB)五級,對應(yīng)多周期的五個處理階段。如圖3.1所示,一個指令的執(zhí)行
3、需要5個時鐘周期,每個時鐘周期的上升沿來臨時,此指令所代表的一系列數(shù)據(jù)和控制信息將轉(zhuǎn)移到下一級處理。圖3.1 流水線流水作業(yè)示意圖由于在流水線中,數(shù)據(jù)和控制信息將在時鐘周期的上升沿轉(zhuǎn)移到下一級,所以規(guī)定流水線轉(zhuǎn)移變量命名遵守如下格式:名稱_流水線級名稱例如:在ID級指令譯碼電路(Decode)產(chǎn)生的寄存器寫允許信號RegWrite在ID級、EX級、MEM級和WB級上的命名分別為RegWrite_id、RegWrite_ex、RegWrite_mem和RegWrite_wb。在頂層文件中,類似的變量名稱有近百個,這樣的命名方式起到了很好的識別作用。1) 流水線中的控制信號(1)IF級:取指令級。
4、從ROM中讀取指令,并在下一個時鐘沿到來時把指令送到ID級的指令緩沖器中。該級控制信號決定下一個指令指針的PCSource信號、阻塞流水線的PC_IFwrite信號、清空流水線的IF_flush信號。(2)ID級:指令譯碼器。對IF級來的指令進行譯碼,并產(chǎn)生相應(yīng)的控制信號。整個CPU的控制信號基本都是在這級上產(chǎn)生。該級自身不需任何控制信號。流水線冒險檢測也在該級進行,冒險檢測電路需要上一條指令的MemRead,即在檢測到冒險條件成立時,冒險檢測電路產(chǎn)生stall信號清空ID/EX寄存器,插入一個流水線氣泡。(3)EX級:執(zhí)行級。該級進行算術(shù)或邏輯操作。此外LW、SW指令所用的RAM訪問地址也是
5、在本級上實現(xiàn)??刂菩盘栍蠥LUCode、ALUSrcA、ALUScrB和RegDst,根據(jù)這些信號確定ALU操作、選擇兩個ALU操作數(shù)A、B,并確定目標寄存器。另外,數(shù)據(jù)轉(zhuǎn)發(fā)也在該級完成。數(shù)據(jù)轉(zhuǎn)發(fā)控制電路產(chǎn)生ForwardA和ForwardB兩組控制信號。(4)MEM級:存儲器訪問級。只有在執(zhí)行LW、SW指令時才對存儲器進行讀寫,對其他指令只起到一個周期的作用。該級只需存儲器寫操作允許信號MemWrite。(5)WB級:寫回級。該級把指令執(zhí)行的結(jié)果回寫到寄存器文件中。該級設(shè)置信號MemtoReg和寄存器寫操作允許信號RegWrite,其中MemtoReg決定寫入寄存器的數(shù)據(jù)來自于MEM級上的緩
6、沖值或來自于MEM級上的存儲器。2)流水線冒險在流水線CPU中,多條指令通知執(zhí)行,由于各種各樣的原因,在下一個時鐘周期中下一條指令不能執(zhí)行,這種情況稱為冒險。冒險分為三類:結(jié)構(gòu)冒險:硬件不支持多條指令在同一個時鐘周期內(nèi)執(zhí)行。MIPS指令集專為流水線設(shè)計,因此在MIPS CPU中不存在此類冒險。數(shù)據(jù)冒險:在一個操作必須等待另一操作完成后才能進行時,流水線必須停頓,這種情況稱為數(shù)據(jù)冒險。數(shù)據(jù)冒險分為兩類:數(shù)據(jù)相關(guān):流水線內(nèi)部其中任何一條指令要用到任何其他指令的計算結(jié)果時,將導(dǎo)致數(shù)據(jù)冒險。通??梢杂脭?shù)據(jù)轉(zhuǎn)發(fā)(數(shù)據(jù)定向)來解決此類冒險。數(shù)據(jù)冒險:此類冒險發(fā)生在當定向的目標階段在時序上早于定向的源階段時
7、,數(shù)據(jù)轉(zhuǎn)發(fā)無效。通常是引入流水線阻塞,即氣泡(bubble)來解決??刂泼半U:CPU需要根據(jù)分支指令的結(jié)果做出決策,而此時其他指令可能還在執(zhí)行中,這時會出現(xiàn)控制冒險,也稱為分支冒險。解決此類冒險的常用方法是延遲分支。2.1)數(shù)據(jù)相關(guān)與轉(zhuǎn)發(fā)下面通過具體例子來闡述數(shù)據(jù)相關(guān)。見圖3.2圖3.2 數(shù)據(jù)相關(guān)性問題實例圖可見,后4條指令都依賴于第一條指令得到寄存器$2的結(jié)果,但sub指令要在第五周期才寫回寄存器$2,但在第三、四、五個時鐘周期$2分別要被and、or和add三個指令用到,所以這三個指令得到的是錯誤的未更新的數(shù)據(jù),會引起錯誤的結(jié)果;而第六個時鐘周期$2要被sw指令用到,此時得到的才是正確的已
8、更新的數(shù)據(jù)。這種數(shù)據(jù)之間的互相關(guān)聯(lián)引起的冒險就是數(shù)據(jù)相關(guān)??梢钥闯?,當一條依賴關(guān)系的方向與時間軸的方向相反時,就會產(chǎn)生數(shù)據(jù)冒險。(1)一階數(shù)據(jù)相關(guān)與轉(zhuǎn)發(fā)(EX冒險)首先討論指令sub與and之間的相關(guān)問題。sub指令在第五周期寫回寄存器$2,而and指令在第四周期就對sub指令的結(jié)果$2提出申請,顯然將得到錯誤的未更新的數(shù)據(jù)。像這類第I條指令的源操作寄存器與第I-1條指令(即上一條指令)的目標寄存器相重,導(dǎo)致的數(shù)據(jù)相關(guān)稱為一階數(shù)據(jù)相關(guān)。見圖3.3中實線所示。 圖3.3 一階數(shù)據(jù)相關(guān)實例圖可以發(fā)現(xiàn),sub指令的結(jié)果其實在EX級結(jié)尾,即第三周期末就產(chǎn)生了;而and指令在第四時鐘周期向sub指令結(jié)果
9、發(fā)出請求,請求時間晚于結(jié)果產(chǎn)生時間,所以只需要sub指令結(jié)果產(chǎn)生之后直接將其轉(zhuǎn)發(fā)給and指令就可以避免一階數(shù)據(jù)相關(guān)。如圖3.3虛線所示。轉(zhuǎn)發(fā)數(shù)據(jù)為ALUResult_mem數(shù)據(jù)轉(zhuǎn)發(fā)由Forwarding unit單元控制,判斷轉(zhuǎn)發(fā)條件是否成立。轉(zhuǎn)發(fā)機制硬件實現(xiàn)見圖3.4圖3.4 轉(zhuǎn)發(fā)機制的硬件實現(xiàn)轉(zhuǎn)發(fā)條件ForwardA、ForwardB作為數(shù)據(jù)選擇器的地址信號,轉(zhuǎn)發(fā)條件不成立時,ALU操作數(shù)從ID/EX流水線寄存器中讀??;轉(zhuǎn)發(fā)條件成立時,ALU操作數(shù)取自數(shù)據(jù)旁路。轉(zhuǎn)發(fā)條件: MEM級指令是寫操作,即RegWrite_mem=1; MEM級指令寫回的目標寄存器不是$0,即RegWriteAdd
10、r_mem0; MEM級指令寫回的目標寄存器與在EX級指令的源寄存器是同一寄存器,即RegWriteAddr_mem=RsAddr_ex 或 RegWriteAddr_mem=RtAddr_ex。(2)二階數(shù)據(jù)相關(guān)與轉(zhuǎn)發(fā)(MEM冒險)接下來討論sub指令與or指令之間的相關(guān)問題。sub指令在第5時鐘周期寫回寄存器,而or指令也在第5時鐘周期對sub指令的結(jié)果提出了請求,很顯然or指令讀取的數(shù)據(jù)是未被更新的錯誤內(nèi)容。這類第I條指令的源操作寄存器與第I-2條指令(即之上第二條指令)的目標寄存器相重,導(dǎo)致的數(shù)據(jù)相關(guān)稱為二階數(shù)據(jù)相關(guān)。見圖3.5中實線所示。圖3.5 一階數(shù)據(jù)相關(guān)實例圖如前所述,or指令
11、在第五時鐘周期向sub指令結(jié)果發(fā)出請求時,sub指令的結(jié)果已經(jīng)產(chǎn)生。所以,我們同樣采用“轉(zhuǎn)發(fā)”,即通過MEM/WB流水線寄存器,將sub指令結(jié)果轉(zhuǎn)發(fā)給or指令,而不需要先寫回寄存器堆。如圖3.5中虛線所示。轉(zhuǎn)發(fā)數(shù)據(jù)為RegWriteData_wb轉(zhuǎn)發(fā)條件: WB級指令是寫操作,即RegWrite_wb=1; WB級指令寫回的目標寄存器不是$0,即RegWriteAddr_wb0; WB級指令寫回的目標寄存器與在EX級指令的源寄存器是同一寄存器,即RegWriteAddr_wb=RsAddr_ex 或 RegWriteAddr_wb=RtAddr_ex; EX冒險不成立,即RegWriteAdd
12、r_memRsAddr_ex 或 RegWriteAddr_mem=RtAddr_ex。(3)三階數(shù)據(jù)相關(guān)與轉(zhuǎn)發(fā)最后討論sub指令與add指令之間的相關(guān)問題。sub指令與add指令在第五時鐘周期內(nèi)同時讀寫同一個寄存器。這類同一周期內(nèi)同時讀寫同一個寄存器的數(shù)據(jù)相關(guān)稱之為三階數(shù)據(jù)相關(guān)。如圖3.6中實線所示。圖3.6 三階數(shù)據(jù)相關(guān)實例圖假設(shè)寄存器的寫操作發(fā)生在時鐘周期的上升沿,而讀操作發(fā)生在時鐘周期的下降沿,那么讀操作將讀取到最新寫入的內(nèi)容。在這種假設(shè)條件下將不會發(fā)生數(shù)據(jù)冒險。這就要求流水線中的寄存器具有“先寫后讀(Read After Write)”的特性。這類“寫操作發(fā)生在時鐘周期的上升沿,讀操
13、作發(fā)生在時鐘周期的下降沿”的寄存器雖然在理論上是可實現(xiàn)的,但是不適合應(yīng)用于同步系統(tǒng),因為它不但影響系統(tǒng)的運行速度,而且影響系統(tǒng)的穩(wěn)定性,是不可取的。因此,我們采用“轉(zhuǎn)發(fā)”機制來解決三階數(shù)據(jù)相關(guān)冒險。該部分轉(zhuǎn)發(fā)電路我們放在寄存器堆的設(shè)計中完成。如圖3.6中虛線所示。轉(zhuǎn)發(fā)數(shù)據(jù)為RegWriteData_wb。轉(zhuǎn)發(fā)條件為: WB級指令是寫操作,即RegWrite_wb=1; WB級指令寫回的目標寄存器不是$0,即RegWriteAddr_wb0; WB級指令寫回的目標寄存器與在ID級指令的源寄存器是同一寄存器,即RegWriteAddr_wb=RsAddr_id 或 RegWriteAddr_wb=
14、RtAddr_id。2.2)數(shù)據(jù)冒險與阻塞當一條指令試圖讀取一個寄存器,而它前一條指令是lw指令,并且該lw指令寫入的是同一個寄存器時,定向轉(zhuǎn)發(fā)的方法就無法解決問題。如圖3.7所示圖3.7 數(shù)據(jù)冒險與阻塞實例圖注意到lw指令只能在第四時鐘周期從內(nèi)存中讀出數(shù)據(jù),因此它和緊隨其后的and指令之間的依賴關(guān)系與時序方向是相反的,這種冒險是無法通過轉(zhuǎn)發(fā)來實現(xiàn)的。這類冒險不同于數(shù)據(jù)相關(guān)冒險,需要單獨一個“冒險檢測單元(Hazard Detector)”,它在ID級完成。冒險成立的條件為: 上一條指令是lw指令,即MemRead_ex=1; 在EX級的lw指令與在ID級的指令讀寫的是同一個寄存器,即RegW
15、riteAddr_ex=RsAddr_id 或 RegWriteAddr_ex=RtAddr_id。冒險的解決:為解決數(shù)據(jù)冒險,我們引入流水線阻塞。當Hazard Detector檢測到冒險條件成立時,在lw指令和下一條指令之間插入阻塞,即流水線氣泡(bubble),使后一條指令延遲一個時鐘周期執(zhí)行,這樣就將該冒險轉(zhuǎn)化為二階數(shù)據(jù)相關(guān),可用轉(zhuǎn)發(fā)解決。如圖3.8所示。圖3.8 流水線氣泡的引入需要注意的是,如果處于ID級的指令被阻塞,那么處于IF級的指令也必須阻塞,否則,處于ID級的指令就會丟失。防止這兩條指令繼續(xù)執(zhí)行的方法是:保持PC寄存器和IF/ID流水線寄存器不變,同時插入一個流水線氣泡。具
16、體實現(xiàn)方法如下:在ID級檢測到冒險條件時, HazardDetector輸出兩個信號:Stall與PC_IFWrite。Stall信號將ID/EX流水線寄存器中的EX、MEM和WB級控制信號全部清零。這些信號傳遞到流水線后面的各級,由于控制信號均為零,所以不會對任何寄存器和存儲器進行寫操作,高電平有效。PC_IFWrite信號禁止PC寄存器和IF/ID流水線寄存器接收新數(shù)據(jù),低電平有效。2.3)分支冒險還有一類冒險是包含分支的流水線冒險,下圖。圖3.10 分支冒險實例流水線每個時鐘周期都得取指令才能維持運行,但分支指令必須等到MEM級才能確定是否執(zhí)行分支。這種為了確定預(yù)取正確的指令而導(dǎo)致的延遲
17、叫做控制冒險或分支冒險。一種比較普遍的提高分支阻塞速度的方法是假設(shè)分支不發(fā)生,并繼續(xù)執(zhí)行順序的指令流。如果分支發(fā)生的話,就丟棄已經(jīng)預(yù)取并譯碼的指令,指令的執(zhí)行沿著分支目標繼續(xù)。由于分支指令直到MEM級才能確定下一條指令的PC,這就意味著為了丟棄指令必須將流水線中的IF、ID和EX級的指令都清除掉(flush)。這種優(yōu)化方法的代價較大,效率較低。如果我們能在流水線中提前分支指令的執(zhí)行過程,那么就能減少需要清除的指令數(shù)。這是一種提高分支效率的方法,降低了執(zhí)行分支的代價。因此我們采用提前分支指令的方法解決分支冒險。提前分支指令需要提前完成兩個操作: 計算分支的目的地址:由于已經(jīng)有了PC值和IF/ID
18、流水線寄存器中的指令值,所以可以很方便地將EX級的分支地址計算電路移到ID級。我們針對所有指令都執(zhí)行分支地址的計算過程,但只有在需要它的時候才會用到。 判斷分支指令的跳轉(zhuǎn)條件:我們將用于判斷分支指令成立的Zero信號檢測電路(Z test )從ALU中獨立出來,并將它從EX級提前至ID級。具體的設(shè)計將在ID級設(shè)計中介紹。在提前完成以上兩個操作之外,我們還需丟棄IF級的指令。具體做法是:加入一個控制信號IF_flush,做為IF/ID流水線寄存器的清零信號。當分支冒險成立,即Z=1,則IF_flush=1,否則IF_flush=0,故IF_flush = Z??紤]到本系統(tǒng)還要實現(xiàn)的無條件跳轉(zhuǎn)指令
19、:J和JR,在執(zhí)行這兩個指令時也必須要對IF/ID流水線寄存器進行清空,因此, IF_flush的表達式應(yīng)表示為:IF_flush = Z | J | JR。2. MIPS指令格式1) R型指令格式op、funct:共同決定指令名稱,都為6位;rs :指定第一操作數(shù)的寄存器地址,為5位;rt :指定第二操作數(shù)的寄存器地址,為5位;rd :指定目標寄存器地址,為5位;sa :位移運算的移動位數(shù),為5位。本實驗要實現(xiàn)的R型指令有: 算術(shù)邏輯運算指令:ADD、ADDU、SUB、SUBU、AND、OR、NOR、XOR 、SLT、SLTU 移位指令:SLLV、SRLV、SRAV、SLL、SRL、SRA
20、寄存器跳轉(zhuǎn)指令:JR2) I型指令格式op :決定指令名稱,為6位;rs :指定第一操作數(shù)的寄存器地址,為5位;rt :儲存結(jié)果的寄存器地址,為5位;Imm:立即數(shù),為16位。本實驗要實現(xiàn)的I型指令有: 存儲器訪問指令:LW、SW 立即數(shù)算術(shù)邏輯運算指令:ADDI、ADDIU、ANDI、ORI、XORI、SLTI、SLTIU 分支指令:BEQ、BNE、BGEZ、BGTZ、BLEZ、BLTZ注: I型指令中立即數(shù)算術(shù)邏輯運算指令對立即數(shù)(Imm)的處理應(yīng)分為兩類情況考慮:當指令為ADDI、ADDIU、SLTI、SLTIU時,指令中的16位立即數(shù)(Imm)應(yīng)做符號擴展為32位:sign-exten
21、d(Imm)。此符號擴展電路在ID級完成。當指令為ANDI、ORI、XORI時,Imm應(yīng)做“0”擴展為32位。考慮到資源的限制,在執(zhí)行ANDI、ORI、XORI指令時,“0”擴展功能放在ALU內(nèi)部(即EX級)完成。 對于條件分支指令:不執(zhí)行分支語句時,跳轉(zhuǎn)地址應(yīng)為下一條地址;執(zhí)行分支語句時,跳轉(zhuǎn)地址應(yīng)為下一條地址加上跳轉(zhuǎn)指令數(shù),即為立即數(shù)。由于跳轉(zhuǎn)方向有兩個:向前與向后,故立即數(shù)存在正負性,應(yīng)該有符號擴展為32位:sign-extend(Imm)。如果能夠?qū)⒘⒓磾?shù)的位數(shù)擴充,跳轉(zhuǎn)指令的范圍將大大增加。由于CPU中指令的起始地址都是4的倍數(shù),因此它們地址的后兩位都是0,那么跳過的指令數(shù)后兩位也應(yīng)
22、為2b00,故可將16為立即數(shù)左移兩位擴充為18位,尋址地址范圍也擴大4倍。因此分支地址可表示為PC+4+sign-extend(Imm)2. 對于取字指令LW操作為: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
23、_functAB?1:05d19SLTU_functAB?1:0(無符號數(shù))5d20SLL_functBA5d17SRLV_functSRA_functBA5d18SRAV_functopfunctrt運算ALUCodeADDI_op加5d0ADDIU_opANDI_op與5d6XORI_op異或5d7ORI_op或5d8SLTI_opAB?1:05d19SLTIU_opAB?1:0(無符號數(shù))5d20SW_op加(計算地址)5d0LW_op(2) 分支檢測(Branch Test)電路的設(shè)計Zero檢測電路主要用于判斷Branch指令的分支條件是否成立,其中BEQ、BNE兩個操作數(shù)為RsDa
24、ta與RtData,而BGEZ、BGTZ、BLEZ和BLTZ指令則為RsData與常數(shù)0比較,所以輸出信號Z的表達式為:RsData31 | (| RsData31: 0) ; 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_
25、beq0; ALUCode=OTHER(3) 寄存器堆(Registers)的設(shè)計寄存器堆由32個32位寄存器組成,這些寄存器通過寄存器號進行讀寫存取。寄存器堆的原理框圖如圖3.13所示。因為讀取寄存器不會更改其內(nèi)容,故只需提供寄存號即可讀出該寄存器內(nèi)容。讀取端口采用數(shù)據(jù)選擇器即可實現(xiàn)讀取功能。應(yīng)注意“0”號寄存器為常數(shù)0.對于往寄存器里寫數(shù)據(jù),需要目標寄存器號(WriteRegister)、待寫入數(shù)據(jù)(WriteData)、寫允許信號(RegWrite)三個變量。圖3.13中5位二進制譯碼器完成地址譯碼,其輸出控制目標寄存器的寫使能信號EN,決定將數(shù)據(jù)WriteData寫入哪個寄存器。在流水
26、線CPU設(shè)計中,寄存器堆設(shè)計還應(yīng)解決三階數(shù)據(jù)相關(guān)的數(shù)據(jù)轉(zhuǎn)發(fā)問題。當滿足三階數(shù)據(jù)相關(guān)條件時,寄存器具有Read after Write的特性。為實現(xiàn)該功能,在寄存器堆的基礎(chǔ)上加一轉(zhuǎn)發(fā)電路。如圖3.14所示。圖中轉(zhuǎn)發(fā)檢測電路的輸出表達式為RsSel=RegWrite_wb&(RegWriteAddr_wb=0)&(RegWriteAddr_wb=RsAddr_id)RtSel=RegWrite_wb&(RegWriteAddr_wb=0)&(RegWriteAddr_wb=RtAddr_id)(4) 冒險檢測功能(Hazard Deterctor)的設(shè)計由前面分析可知,冒險成立的條件為: 上一條指
27、令是LW指令,即MemRead_ex=1; 在EX級的LW指令與在ID級的指令讀寫的是同一個寄存器,即RegWriteAddr_ex=RsAddr_id 或 RegWriteAddr_ex=RtAddr_id解決冒險的方法為: 插入一個流水線氣泡Stall清空ID/EX寄存器并且阻塞流水線ID級、IF級流水線,有:Stall=(RegWriteAddr_ex=RsAddr_id)|(RegWriteAddr_ex=RtAddr_id)&MemRead_ex 保持PC寄存器和IF/ID流水線寄存器不變,有:PC_IFWrite=Stall(5) 其它單元電路的設(shè)計 Branch指令分支地址的計算
28、電路:BranchAddr=NextPC_id+(sign-extend(Imm_id)2) JR指令跳轉(zhuǎn)地址的計算電路:JRAddr=RsData_id J指令跳轉(zhuǎn)地址的計算電路:Jaddr=NextPC_id31:28,IR_id25:0,2b00 符號擴展的方法針對有符號數(shù) 如果最高位(即符號位)是0,則要擴展的高位用0補齊;如果最高位是1,則用1補齊。 例: 8位的+1,表示為二進制為00000001,擴展成16位的話,符號擴展為0000000000000001;8位的-1,表示成二進制為11111111,擴展成16位的話,符號擴展為1111111111111111 。 0擴展的方法針
29、對無符號數(shù) 要擴展的高位用0補齊。 例:16位二進制0xFFFF(無符號數(shù)65535), 0擴展成32位為0x0000FFFF (無符號數(shù)65535) 。4. 執(zhí)行模塊EX的設(shè)計執(zhí)行模塊主要有ALU子模塊、轉(zhuǎn)發(fā)電路Forwarding以及若干數(shù)據(jù)選擇器組成。這行模塊的接口信息如下表所示:引腳名稱方向說 明RegDst_exInput方向決定Register回寫時采用的地址(rt/rd)ALUCode_ex4:0決定ALU采用何種運算ALUSrcA_ex決定ALU的A操作數(shù)的來源(rs/Sa)ALUSrcB_ex決定ALU的B操作數(shù)的來源(rt/Imm)引腳名稱說 明Imm_ex31:0Inpu
30、t立即數(shù)Sa_ex31:0移位位數(shù)RsAddr_ex4:0Rs寄存器地址,即Instruction_id25:21RtAddr_ex4:0Rt寄存器地址,即Instruction_id20:16RdAddr_ex4:0Rd寄存器地址,即Instruction_id15:11RsData_ex31:0Rs寄存器數(shù)據(jù)RtData_ex31:0Rt寄存器數(shù)據(jù)RegWriteData_wb31:0寫入寄存器的數(shù)據(jù)ALUResult_mem31:0ALU輸出數(shù)據(jù)RegWriteAddr_wb4:0寄存器的寫地址RegWriteAddr_mem4:0RegWrite_wb寄存器寫允許信號RegWrite_
31、memRegWriteAddr_ex4:0Output寄存器的寫地址ALUResult_ex31:0ALU運算結(jié)果MemWriteData_ex31:0寄存器的回寫數(shù)據(jù)ALU_A31:0ALU操作數(shù),測試時使用ALU_B31:0(1) ALU子模塊的設(shè)計ALU是提供CPU基本運算能力的重要電路。ALU執(zhí)行何種運算,由控制單元中的ALU控制器輸出的ALUCode信號決定。ALU功能見下表:ALUCodeALUResultalu_add = 5b00000A+Balu_and = 5b00001A&Balu_xor = 5b00010ABalu_or = 5b00011A|Balu_nor = 5
32、b00100(A|B)alu_sub = 5b00101A-Balu_andi= 5b00110A&16b0,B15:0alu_xori= 5b00111A16b0,B15:0alu_ori = 5b01000A|16b0,B15:0alu_sll = 5b10000BAalu_sra = 5b10010BAalu_slt = 5b10011AB?1:0,其中A、B為有符號數(shù)alu_sltu= 5b10100AB?1:0,其中A、B為無符號數(shù)為了提高運算速度,可將各種運算同時執(zhí)行,得到的運算結(jié)果由ALUCode信號進行挑選。ALU的基本結(jié)構(gòu)如圖3.16所示。圖3.16 ALU的基本結(jié)構(gòu)a) 加
33、、減電路的設(shè)計考慮減法、比較(SLT、SLTI)及部分分支指令(BEQ、BNE)均可用加法器和必要的輔助電路來實現(xiàn)。圖3.16中的Binvert信號控制加減運算:Binvert=(ALUCode=alu_add)對ALU來說,它的兩個操作數(shù)輸入時都已經(jīng)是補碼形式,當要完成兩個操作數(shù)的減法時,即A補-B補,可將減法轉(zhuǎn)換為加法,利用加法器來實現(xiàn):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-
34、B;(B32b1即對B按位取反)即可完成加減運算。由于32位加法器的運算速度影響著CPU頻率的高低,因此設(shè)計一個高速加法器尤為重要,本實驗采用lab7中介紹的32位進位選擇加法器。b) 比較電路的設(shè)計考慮對于比較運算,如果最高為不同,即A31B31,則根據(jù)A31、B31決定比較結(jié)果,但應(yīng)注意有符號數(shù)和無符號數(shù)比較運算的區(qū)別。在有符號數(shù)比較SLT運算中,判斷AB的方法為:若A為負數(shù)、B為0或正數(shù):A31&(B31)若A、B符號相同,A-B為負:(A31B31) & sum31則SLTResult=(A31&(B31) |( (A31B31) & sum31)在無符號數(shù)比較SLT運算中,判斷AB的
35、方法為:若A最高位為0、B最高位為1:(A31 )&B31若A、B最高位相同,A-B為負:(A31B31) & sum31則SLTResult=(A31 )&B31) |( (A31B31) & sum31)c) 算術(shù)右移運算電路的設(shè)計考慮Verilog HDL的算術(shù)右移的運算符為“”。要實現(xiàn)算術(shù)右移應(yīng)注意,被移位的對象必須定義為reg類型,但是在SRA指令,被移位的對象操作數(shù)B為輸入信號,不能定義為reg類型,因此必須引入reg類型中間變量B_reg,相應(yīng)的Verilog HDL語句為:reg signed 31:0 B_reg;always (B) beginB_reg = B; end引
36、入reg類型的中間變量B_reg后,就可對B_reg進行算術(shù)右移操作。d) 邏輯運算與、或、或非、異或、邏輯移位等運算較為簡單,只是要注意一點,ANDI、XORI、ORI三條指令的立即數(shù)為16位無符號數(shù),應(yīng)“0擴展”為32位無符號數(shù),在運算的同時完成“0擴展”。如:ADDI指令的運算為A&16b0,B15:0。(2) 轉(zhuǎn)發(fā)電路Forwarding的設(shè)計操作數(shù)A和B由數(shù)據(jù)選擇器決定,數(shù)據(jù)選擇器的地址信號即為ForwardA和ForwardB。其含義如下表:地址操作數(shù)來源說明ForwardA=00RsData_ex操作數(shù)A來自寄存器堆ForwardA=01RegWriteData_wb操作數(shù)A來自
37、二階數(shù)據(jù)相關(guān)的轉(zhuǎn)發(fā)數(shù)據(jù)ForwardA=10ALUresult_mem操作數(shù)A來自一階數(shù)據(jù)相關(guān)的轉(zhuǎn)發(fā)數(shù)據(jù)ForwardB=00RtData_ex操作數(shù)B來自寄存器堆ForwardB=01RegWriteData_wb操作數(shù)B來自二階數(shù)據(jù)相關(guān)的轉(zhuǎn)發(fā)數(shù)據(jù)ForwardB=10ALUresult_mem操作數(shù)B來自一階數(shù)據(jù)相關(guān)的轉(zhuǎn)發(fā)數(shù)據(jù)由前面介紹的一、二階數(shù)據(jù)相關(guān)判斷條件,不難得到:ForwardA0=RegWrite_wb&(RegWriteAddr_wb!=0) &(RegWriteAddr_mem!=RsAddr_ex) &(RegWriteAddr_wb=RsAddr_ex);Forward
38、A1=RegWrite_mem&(RegWriteAddr_mem!=0) &(RegWriteAddr_mem=RsAddr_ex); ForwardB0=RegWrite_wb&(RegWriteAddr_wb!=0) &(RegWriteAddr_mem!=RtAddr_ex) &(RegWriteAddr_wb=RtAddr_ex);ForwardB1=RegWrite_mem&(RegWriteAddr_mem!=0) &(RegWriteAddr_mem=RtAddr_ex);5. 存儲器訪問MEM模塊的設(shè)計數(shù)據(jù)存儲器利用Xilinx Core Generator實現(xiàn)??紤]到FPG
39、A的資源,數(shù)據(jù)存儲器可設(shè)計為容量各為2632bit單端口RAM。由于MIPS系統(tǒng)的32位字地址由4 個字節(jié)組成,根據(jù)“對齊限制”要求字地址必須是4的倍數(shù),也就是說字地址的低兩位必須是0,所以字地址的低兩位不接入電路。故我們設(shè)計的數(shù)據(jù)RAM的地址應(yīng)該接的信號是ALUResult_mem7:2。由于VIRTEXII PRO只能產(chǎn)生帶寄存器的內(nèi)核RAM,所以存儲器輸出繞過MEM/WB流水線寄存器,直接接入WB級的數(shù)據(jù)選擇器。圖3.17與圖3.18中的虛線就是表示這種含義.6. 寫回級WB模塊的設(shè)計WB部分非常簡單,只有一個數(shù)據(jù)選擇器選擇寫回的數(shù)據(jù)來源,可在頂層模塊中直接實現(xiàn)。7. 取指令級IF模塊的
40、設(shè)計IF模塊由指令指針寄存器PC、指令存儲器子模塊Instruction ROM、指令指針選擇器MUX和一個32位加法器組成,IF級模塊接口信息如下表所示:引腳名稱方向說 明clkInput系統(tǒng)時鐘reset系統(tǒng)復(fù)位信號,高電平有效Z分支指令的條件判斷結(jié)果J跳轉(zhuǎn)指令JR寄存器跳轉(zhuǎn)指令PC_IFWrite阻塞流水線的信號,低電平有效JumpAddr31:0J指令跳轉(zhuǎn)地址JrAddr31:0JR指令跳轉(zhuǎn)地址BranchAddr31:0條件分支地址Instruction_if31:0Output指令機器NextPC_if31:0下一個PC值(1) 指令存儲器ROM用Xilinx CORE Gener
41、ator實現(xiàn)產(chǎn)生的ROM無法滿足流水線CPU的指令要求,我們需用Verilog HDL設(shè)計一個ROM陣列??紤]到FPGA的資源,指令存儲器可設(shè)計為容量各為2632bit的ROM。設(shè)計ROM時需將測試的機器碼寫入,課程提供一段簡單測試程序的機器碼,機器碼存于PipelineDemo.coe文件中。課程已提供該ROM的代碼,已設(shè)計好上述測試程序機器碼的指令存儲器,文件名為InstructionROM.v。需要注意的是,ROM的地址信號同RAM一樣有“對齊限制”的要求,因此, ROM的地址應(yīng)該接的信號是PC7:2。(2) 指令指針選擇器指令指針選擇器為一8選1數(shù)據(jù)選擇器,選擇信號為PCSource=
42、JR,J,Z,具體含義如下表:地址PC來源JR,J,Z= 100JR指令的跳轉(zhuǎn)地址JR,J,Z= 010J指令的跳轉(zhuǎn)地址JR,J,Z= 001Branch指令的分支地址JR,J,Z= 000下一條指令地址PC+4(3) PC寄存器當發(fā)生數(shù)據(jù)冒險時,需要保持PC寄存器不變,因此PC寄存器是一個帶使能端的D型寄存器,使能信號為PC_IFWrite。8. 流水線寄存器的設(shè)計流水線寄存器負責將流水線的各部分分開,共有IF/ID、ID/EX、EX/MEM、MEM/WB四組。根據(jù)前面的介紹可知,四組流水線寄存器要求不完全相同,因此設(shè)計也有不同考慮。(1)EX/MEM、MEM/WB兩組流水線寄存器只是普通D
43、型寄存器。(2)當流水線發(fā)生數(shù)據(jù)冒險時,需清空ID/EX流水線寄存器而插入一個氣泡,因此ID/EX流水線寄存器是一個帶同步清零功能的D型寄存器,清零信號為Stall。(3)當流水線發(fā)生數(shù)據(jù)冒險時,需保持IF/ID流水線寄存器不變,因此IF/ID流水線寄存器具有使能信號輸入,使能信號為PC_IFWrite;當流水線發(fā)生分支冒險時,需清空IF/ID流水線寄存器,清零信號為IF_flush。因此,IF/ID流水線寄存器是一個帶使能功能、同步清零功能的D型寄存器。需要注意的是,由于仿真對初始值的要求,上述寄存器都應(yīng)考慮有reset信號的接入,以提供仿真時各寄存器的初值。9. 頂層文件的設(shè)計按照流水線MIPS微處理器的原理框圖連接各模塊即可。為方便測試,可將關(guān)鍵變量輸出,關(guān)鍵變量有:指令指針PC、指令碼Instruction、流水線插入氣泡標志Stall、分支標志JumpFlag(即JR,J,Z)、ALU輸入輸出(ALU_A、ALU_B、ALUResult)和數(shù)據(jù)存
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度房屋抵押權(quán)設(shè)立合同
- 教育信息化解決方案項目投資合同
- 物流配送損害免責聲明
- 教育培訓服務(wù)責任豁免協(xié)議
- 文化產(chǎn)業(yè)投資開發(fā)協(xié)議書
- 攝影工作室拍攝作品著作權(quán)歸屬聲明
- 農(nóng)業(yè)現(xiàn)代化高效節(jié)水灌溉技術(shù)推廣方案
- 企業(yè)產(chǎn)品質(zhì)量危機處理預(yù)案
- 高考文言文雙文本專練:《史記》《論語》
- 近期項目成果回顧與反思
- 2023年高三新高考英語復(fù)習備考策略及方法指導(dǎo)(深度課件)
- 數(shù)字信號處理(課件)
- 社會主義核心價值觀-團課課件
- 城市社會學(2015)課件
- 年產(chǎn)2萬噸馬來酸二乙酯技改建設(shè)項目環(huán)評報告書
- 中國古代文論教程完整版課件
- 中班美工區(qū)角活動教案10篇
- SJG 103-2021 無障礙設(shè)計標準-高清現(xiàn)行
- 皇冠假日酒店智能化系統(tǒng)安裝工程施工合同范本
- 路面工程重點、關(guān)鍵、和難點工程的施工方案(技術(shù)標)
- 合肥市城市大腦·數(shù)字底座白皮書2020
評論
0/150
提交評論