![數(shù)字系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)-流水線MIPS微處理器設(shè)計(jì)(完整版)資料_第1頁(yè)](http://file4.renrendoc.com/view/20924afdc5e9c1579938c47921e87360/20924afdc5e9c1579938c47921e873601.gif)
![數(shù)字系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)-流水線MIPS微處理器設(shè)計(jì)(完整版)資料_第2頁(yè)](http://file4.renrendoc.com/view/20924afdc5e9c1579938c47921e87360/20924afdc5e9c1579938c47921e873602.gif)
![數(shù)字系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)-流水線MIPS微處理器設(shè)計(jì)(完整版)資料_第3頁(yè)](http://file4.renrendoc.com/view/20924afdc5e9c1579938c47921e87360/20924afdc5e9c1579938c47921e873603.gif)
![數(shù)字系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)-流水線MIPS微處理器設(shè)計(jì)(完整版)資料_第4頁(yè)](http://file4.renrendoc.com/view/20924afdc5e9c1579938c47921e87360/20924afdc5e9c1579938c47921e873604.gif)
![數(shù)字系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)-流水線MIPS微處理器設(shè)計(jì)(完整版)資料_第5頁(yè)](http://file4.renrendoc.com/view/20924afdc5e9c1579938c47921e87360/20924afdc5e9c1579938c47921e873605.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
數(shù)字系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)--流水線MIPS微處理器設(shè)計(jì)(完整版)資料(可以直接使用,可編輯優(yōu)秀版資料,歡迎下載)
一、實(shí)驗(yàn)?zāi)康臄?shù)字系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)--流水線MIPS微處理器設(shè)計(jì)(完整版)資料(可以直接使用,可編輯優(yōu)秀版資料,歡迎下載)(1)了解提高CPU性能的方法。(2)理解數(shù)據(jù)冒險(xiǎn)、控制冒險(xiǎn)的概念以及流水線沖突的解決方法。(3)掌握流水線MIPS微處理器的工作原理。(4)掌握流水線MIPS微處理器的測(cè)試方法。二、實(shí)驗(yàn)任務(wù)設(shè)計(jì)一個(gè)32位流水線MIPS微處理器,具體要求如下設(shè)計(jì)要求:(1)至少執(zhí)行下列MIPS32指令。算數(shù)運(yùn)算指令:ADDADDUSUBSUBUADDIADDU邏輯運(yùn)算指令:ANDORNORXORANDIORIXORISLTSLTISLTUSLTIU移位指令:SLLSLLVSRLSRLVSRA條件分支指令:BEQBNEBGEZBGTZBLEZBLTZ無(wú)條件跳轉(zhuǎn)指令:JJR數(shù)據(jù)傳輸指令:LWSW空指令:NOP(2)在用5級(jí)流水線技術(shù),對(duì)數(shù)據(jù)冒險(xiǎn)實(shí)現(xiàn)轉(zhuǎn)發(fā)或阻塞功能。(3)在XUPVietex-IIPro開發(fā)系統(tǒng)中實(shí)現(xiàn)MIPS微處理器,要求CPU的運(yùn)行速度大于25MHz.三、實(shí)驗(yàn)原理1.流水線MIPSCPU總體設(shè)計(jì)流水線是數(shù)字系統(tǒng)中一種提高系統(tǒng)穩(wěn)定性和工作速度的方法,廣泛應(yīng)用在高檔CPU的構(gòu)建中。根據(jù)MIPS處理器指令的特點(diǎn),將整體的處理過(guò)程分為取指令(IF)、指令譯碼、執(zhí)行、存儲(chǔ)器訪問(wèn)和寄存器寫回五級(jí),對(duì)應(yīng)多周期CPU的五個(gè)處理階段。如圖1所示,一個(gè)指令的執(zhí)行需要五個(gè)時(shí)鐘周期,每個(gè)時(shí)鐘周期上升沿來(lái)臨時(shí),此指令所代表的一系列數(shù)據(jù)和控制信息轉(zhuǎn)移到下一級(jí)處理。圖1流水線流水作業(yè)示意圖一條MIPS指令分為五個(gè)處理步驟,即五級(jí)流水線,的具體執(zhí)行過(guò)程如圖2所示。圖2五級(jí)流水線MIPSCPU初步原理框圖流水線寄存器:為了在其它四級(jí)流水線中各條指令保持各自的值,從指令存儲(chǔ)器中讀出的指令必須保存在寄存器中。同樣的方法應(yīng)用到每個(gè)流水線步驟中,需要在上圖中各級(jí)之間加入寄存器,如圖3所示。圖3.在各級(jí)分割線添加寄存器后的框圖由于在流水線中,數(shù)據(jù)和控制信息將在時(shí)鐘上升沿轉(zhuǎn)移到下一級(jí),所以規(guī)定流水線轉(zhuǎn)移的變量命名遵守如下格式:名稱_流水線級(jí)名稱。例如,在ID級(jí)指令譯碼電路(DECODE)產(chǎn)生的寄存器寫允許信號(hào)RegWrite在ID級(jí)、EX級(jí)、MEM級(jí)和WB級(jí)上的命名分別為RegWrite_id、RegWrite_ex、RegWrite_men和RegWrite_wb。在頂層文件中,類似的變量名稱有近百個(gè),這樣的命名方式起到了很好的識(shí)別作用。1.MIPS指令格式:①R型指令格式本實(shí)驗(yàn)需要實(shí)現(xiàn)的R型指令有:I)算術(shù)邏輯運(yùn)算指令: ADD、ADDU、SUB、SUBU、AND、OR、NOR、XOR、SLT、SLTUII)移位指令:SLLV、SRLV、SRAV、SLL、SRL、SRAIII)寄存器跳轉(zhuǎn)指令:JR②I型指令格式本實(shí)驗(yàn)需要實(shí)現(xiàn)的I型指令有:I)存儲(chǔ)器訪問(wèn)指令:LW、SWII)立即數(shù)算術(shù)邏輯運(yùn)算指令:ADDI、ADDIU、ANDI、ORI、XORI、SLTI、SLTIUIII)分支指令:BEQ、BNE、BGEZ、BGTZ、BLEZ、BLTZ分支地址為:PC+4+(sign-extend(Imm)<<2)③J型指令格式本實(shí)驗(yàn)需要實(shí)現(xiàn)的J型指令只有:無(wú)條件跳轉(zhuǎn)指令:J跳轉(zhuǎn)地址為:{PC[31:28],IR[25:0],2’b00}特別注意:寄存器跳轉(zhuǎn)指令JR不是J型指令,而是R型指令,其指令格式為:跳轉(zhuǎn)地址為:$ra,寄存器號(hào)為rs移位指令SLL、SRL、SRA只有rt一個(gè)源操作數(shù):3、取字指令的操作過(guò)程:rt<=Mem[rs+sign_extend(imm)]存字指令的操作過(guò)程:Mem[rs+sign_extend(imm)]<=rt4、I型指令中立即數(shù)算術(shù)邏輯運(yùn)算指令對(duì)立即數(shù)(Imm)的處理應(yīng)分為兩類情況考慮:當(dāng)指令為ADDI、ADDIU、SLTI、SLTIU時(shí),指令中的16位立即數(shù)(Imm)應(yīng)做符號(hào)擴(kuò)展為32位。此符號(hào)擴(kuò)展電路在ID級(jí)完成。當(dāng)指令為ANDI、ORI、XORI時(shí),Imm應(yīng)做“0”擴(kuò)展為32位??紤]到資源的限制,在執(zhí)行ANDI、ORI、XORI指令時(shí),“0”擴(kuò)展功能放在ALU內(nèi)部(即EX級(jí))完成。流水線中的控制信號(hào)為保證CPU按照指令正常運(yùn)行,分別設(shè)置各個(gè)級(jí)的控制信號(hào):IF級(jí):取指令級(jí)。從ROM中讀取指令,并在下一個(gè)時(shí)鐘沿到來(lái)時(shí)把指令送到ID級(jí)的指令緩沖器中。該級(jí)控制信號(hào)決定下一個(gè)指令指針的PCSource信號(hào)、阻塞流水線的PC_IFwrite信號(hào)、清空流水線的IF_flush信號(hào)。ID級(jí):指令譯碼器。對(duì)IF級(jí)來(lái)的指令進(jìn)行譯碼,并產(chǎn)生相應(yīng)的控制信號(hào)。整個(gè)CPU的控制信號(hào)基本都是在這級(jí)上產(chǎn)生。該級(jí)自身不需任何控制信號(hào)。流水線冒險(xiǎn)檢測(cè)也在該級(jí)進(jìn)行,冒險(xiǎn)檢測(cè)電路需要上一條指令的MemRead,即在檢測(cè)到冒險(xiǎn)條件成立時(shí),冒險(xiǎn)檢測(cè)電路產(chǎn)生stall信號(hào)清空ID/EX寄存器,插入一個(gè)流水線氣泡。(3)EX級(jí):執(zhí)行級(jí)。該級(jí)進(jìn)行算術(shù)或邏輯操作。此外LW、SW指令所用的RAM訪問(wèn)地址也是在本級(jí)上實(shí)現(xiàn)??刂菩盘?hào)有ALUCode、ALUSrcA、ALUScrB和RegDst,根據(jù)這些信號(hào)確定ALU操作、選擇兩個(gè)ALU操作數(shù)A、B,并確定目標(biāo)寄存器。另外,數(shù)據(jù)轉(zhuǎn)發(fā)也在該級(jí)完成。數(shù)據(jù)轉(zhuǎn)發(fā)控制電路產(chǎn)生ForwardA和ForwardB兩組控制信號(hào)。(4)MEM級(jí):存儲(chǔ)器訪問(wèn)級(jí)。只有在執(zhí)行LW、SW指令時(shí)才對(duì)存儲(chǔ)器進(jìn)行讀寫,對(duì)其他指令只起到一個(gè)周期的作用。該級(jí)只需存儲(chǔ)器寫操作允許信號(hào)MemWrite。(5)WB級(jí):寫回級(jí)。該級(jí)把指令執(zhí)行的結(jié)果回寫到寄存器文件中。該級(jí)設(shè)置信號(hào)MemtoReg和寄存器寫操作允許信號(hào)RegWrite,其中MemtoReg決定寫入寄存器的數(shù)據(jù)來(lái)自于MEM級(jí)上的緩沖值或來(lái)自于MEM級(jí)上的存儲(chǔ)器。3、流水線冒險(xiǎn)在流水線CPU中,多條指令通知執(zhí)行,由于各種各樣的原因,在下一個(gè)時(shí)鐘周期中下一條指令不能執(zhí)行,這種情況稱為冒險(xiǎn)。冒險(xiǎn)分為三類:①結(jié)構(gòu)冒險(xiǎn):硬件不支持多條指令在同一個(gè)時(shí)鐘周期內(nèi)執(zhí)行。MIPS指令集專為流水線設(shè)計(jì),因此在MIPSCPU中不存在此類冒險(xiǎn)。②數(shù)據(jù)冒險(xiǎn):在一個(gè)操作必須等待另一操作完成后才能進(jìn)行時(shí),流水線必須停頓,這種情況稱為數(shù)據(jù)冒險(xiǎn)。數(shù)據(jù)冒險(xiǎn)分為兩類:ⅰ數(shù)據(jù)相關(guān):流水線內(nèi)部其中任何一條指令要用到任何其他指令的計(jì)算結(jié)果時(shí),將導(dǎo)致數(shù)據(jù)冒險(xiǎn)。通??梢杂脭?shù)據(jù)轉(zhuǎn)發(fā)(數(shù)據(jù)定向)來(lái)解決此類冒險(xiǎn)。ⅱ數(shù)據(jù)冒險(xiǎn):此類冒險(xiǎn)發(fā)生在當(dāng)定向的目標(biāo)階段在時(shí)序上早于定向的源階段時(shí),數(shù)據(jù)轉(zhuǎn)發(fā)無(wú)效。通常是引入流水線阻塞,即氣泡(bubble)來(lái)解決。。③控制冒險(xiǎn):CPU需要根據(jù)分支指令的結(jié)果做出決策,而此時(shí)其他指令可能還在執(zhí)行中,這時(shí)會(huì)出現(xiàn)控制冒險(xiǎn),也稱為分支冒險(xiǎn)。解決此類冒險(xiǎn)的常用方法是延遲分支。3.1數(shù)據(jù)相關(guān)與轉(zhuǎn)發(fā)下面通過(guò)具體例子來(lái)闡述數(shù)據(jù)相關(guān)。見圖3.1圖3.圖3.1數(shù)據(jù)相關(guān)性后4條指令都依賴于第一條指令得到寄存器$2的結(jié)果,但sub指令要在第五周期才寫回寄存器$2,但在第三、四、五個(gè)時(shí)鐘周期$2分別要被and、or和add三個(gè)指令用到,所以這三個(gè)指令得到的是錯(cuò)誤的未更新的數(shù)據(jù),會(huì)引起錯(cuò)誤的結(jié)果;而第六個(gè)時(shí)鐘周期$2要被sw指令用到,此時(shí)得到的才是正確的已更新的數(shù)據(jù)。這種數(shù)據(jù)之間的互相關(guān)聯(lián)引起的冒險(xiǎn)就是數(shù)據(jù)相關(guān)??梢钥闯觯?dāng)一條依賴關(guān)系的方向與時(shí)間軸的方向相反時(shí),就會(huì)產(chǎn)生數(shù)據(jù)冒險(xiǎn)。(1)一階數(shù)據(jù)相關(guān)與轉(zhuǎn)發(fā)(EX冒險(xiǎn))首先討論指令sub與and之間的相關(guān)問(wèn)題。sub指令在第五周期寫回寄存器$2,而and指令在第四周期就對(duì)sub指令的結(jié)果$2提出申請(qǐng),顯然將得到錯(cuò)誤的未更新的數(shù)據(jù)。像這類第I條指令的源操作寄存器與第I-1條指令(即上一條指令)的目標(biāo)寄存器相重,導(dǎo)致的數(shù)據(jù)相關(guān)稱為一階數(shù)據(jù)相關(guān)。見圖3.2中實(shí)線所示。圖3.2一階數(shù)據(jù)相關(guān)實(shí)例圖可以發(fā)現(xiàn),sub指令的結(jié)果其實(shí)在EX級(jí)結(jié)尾,即第三周期末就產(chǎn)生了;而and指令在第四時(shí)鐘周期向sub指令結(jié)果發(fā)出請(qǐng)求,請(qǐng)求時(shí)間晚于結(jié)果產(chǎn)生時(shí)間,所以只需要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ā)由Forwardingunit單元控制,判斷轉(zhuǎn)發(fā)條件是否成立。轉(zhuǎn)發(fā)機(jī)制硬件實(shí)現(xiàn)見圖3.3。圖3.3轉(zhuǎn)發(fā)機(jī)制的硬件實(shí)現(xiàn)轉(zhuǎn)發(fā)條件ForwardA、ForwardB作為數(shù)據(jù)選擇器的地址信號(hào),轉(zhuǎn)發(fā)條件不成立時(shí),ALU操作數(shù)從ID/EX流水線寄存器中讀?。晦D(zhuǎn)發(fā)條件成立時(shí),ALU操作數(shù)取自數(shù)據(jù)旁路。轉(zhuǎn)發(fā)條件:MEM級(jí)指令是寫操作,即RegWrite_mem=1;MEM級(jí)指令寫回的目標(biāo)寄存器不是$0,即RegWriteAddr_mem≠0;MEM級(jí)指令寫回的目標(biāo)寄存器與在EX級(jí)指令的源寄存器是同一寄存器,即RegWriteAddr_mem=RsAddr_ex或RegWriteAddr_mem=RtAddr_ex。(2)二階數(shù)據(jù)相關(guān)與轉(zhuǎn)發(fā)(MEM冒險(xiǎn))現(xiàn)在討論sub指令與or指令之間的相關(guān)問(wèn)題。sub指令在第5時(shí)鐘周期寫回寄存器,而or指令也在第5時(shí)鐘周期對(duì)sub指令的結(jié)果提出了請(qǐng)求,很顯然or指令讀取的數(shù)據(jù)是未被更新的錯(cuò)誤內(nèi)容。這類數(shù)據(jù)相關(guān)稱為二階數(shù)據(jù)相關(guān)。見圖3.4中實(shí)線所示。圖3.4二階數(shù)據(jù)相關(guān)實(shí)例圖如前所述,or指令在第五時(shí)鐘周期向sub指令結(jié)果發(fā)出請(qǐng)求時(shí),sub指令的結(jié)果已經(jīng)產(chǎn)生。所以,我們同樣采用“轉(zhuǎn)發(fā)”,即通過(guò)MEM/WB流水線寄存器,將sub指令結(jié)果轉(zhuǎn)發(fā)給or指令,而不需要先寫回寄存器堆。如圖3.4中虛線所示。轉(zhuǎn)發(fā)數(shù)據(jù)為RegWriteData_wb轉(zhuǎn)發(fā)條件:WB級(jí)指令是寫操作,即RegWrite_wb=1;WB級(jí)指令寫回的目標(biāo)寄存器不是$0,即RegWriteAddr_wb≠0;WB級(jí)指令寫回的目標(biāo)寄存器與在EX級(jí)指令的源寄存器是同一寄存器,即RegWriteAddr_wb=RsAddr_ex或RegWriteAddr_wb=RtAddr_ex;EX冒險(xiǎn)不成立,即RegWriteAddr_mem≠RsAddr_ex或RegWriteAddr_mem=RtAddr_ex。(3)三階數(shù)據(jù)相關(guān)與轉(zhuǎn)發(fā)最后討論sub指令與add指令之間的相關(guān)問(wèn)題。sub指令與add指令在第五時(shí)鐘周期內(nèi)同時(shí)讀寫同一個(gè)寄存器。這類數(shù)據(jù)相關(guān)稱之為三階數(shù)據(jù)相關(guān)。如圖3.5中實(shí)線所示。圖3.5三階數(shù)據(jù)相關(guān)實(shí)例圖假設(shè)寄存器的寫操作發(fā)生在時(shí)鐘周期的上升沿,而讀操作發(fā)生在時(shí)鐘周期的下降沿,那么讀操作將讀取到最新寫入的內(nèi)容。在這種假設(shè)條件下將不會(huì)發(fā)生數(shù)據(jù)冒險(xiǎn)。這就要求流水線中的寄存器具有“先寫后讀(ReadAfterWrite)”的特性。這類“寫操作發(fā)生在時(shí)鐘周期的上升沿,讀操作發(fā)生在時(shí)鐘周期的下降沿”的寄存器雖然在理論上是可實(shí)現(xiàn)的,但是不適合應(yīng)用于同步系統(tǒng),因?yàn)樗坏绊懴到y(tǒng)的運(yùn)行速度,而且影響系統(tǒng)的穩(wěn)定性,是不可取的。因此,我們采用“轉(zhuǎn)發(fā)”機(jī)制來(lái)解決三階數(shù)據(jù)相關(guān)冒險(xiǎn)。該部分轉(zhuǎn)發(fā)電路我們放在寄存器堆的設(shè)計(jì)中完成。如圖3.5中虛線所示。轉(zhuǎn)發(fā)數(shù)據(jù)為RegWriteData_wb。轉(zhuǎn)發(fā)條件為:WB級(jí)指令是寫操作,即RegWrite_wb=1;WB級(jí)指令寫回的目標(biāo)寄存器不是$0,即RegWriteAddr_wb≠0;WB級(jí)指令寫回的目標(biāo)寄存器與在ID級(jí)指令的源寄存器是同一寄存器,即RegWriteAddr_wb=RsAddr_id或RegWriteAddr_wb=RtAddr_id。3.2數(shù)據(jù)冒險(xiǎn)與阻塞當(dāng)一條指令試圖讀取一個(gè)寄存器,而它前一條指令是lw指令,并且該lw指令寫入的是同一個(gè)寄存器時(shí),定向轉(zhuǎn)發(fā)的方法就無(wú)法解決問(wèn)題。如圖3.6所示這類冒險(xiǎn)不同于數(shù)據(jù)相關(guān)冒險(xiǎn),需要單獨(dú)一個(gè)“冒險(xiǎn)檢測(cè)單元(HazardDetector)”,它在ID級(jí)完成。冒險(xiǎn)成立的條件為:上一條指令是lw指令,即MemRead_ex=1;在EX級(jí)的lw指令與在ID級(jí)的指令讀寫的是同一個(gè)寄存器,即RegWriteAddr_ex=RsAddr_id或RegWriteAddr_ex=RtAddr_id。冒險(xiǎn)的解決:引入流水線阻塞當(dāng)HazardDetector檢測(cè)到冒險(xiǎn)條件成立時(shí),在lw指令和下一條指令之間插入阻塞,即流水線氣泡(bubble),使后一條指令延遲一個(gè)時(shí)鐘周期執(zhí)行,這樣就將該冒險(xiǎn)轉(zhuǎn)化為二階數(shù)據(jù)相關(guān),可用轉(zhuǎn)發(fā)解決。如圖3.7所示。圖3.7流水線氣泡的引入需要注意的是,如果處于ID級(jí)的指令被阻塞,那么處于IF級(jí)的指令也必須阻塞,否則,處于ID級(jí)的指令就會(huì)丟失。防止這兩條指令繼續(xù)執(zhí)行的方法是:保持PC寄存器和IF/ID流水線寄存器不變,同時(shí)插入一個(gè)流水線氣泡。具體實(shí)現(xiàn)方法如下:流水線氣泡的插入:在ID級(jí)檢測(cè)到冒險(xiǎn)條件時(shí),HazardDetector輸出一個(gè)信號(hào):stall,將ID/EX流水線寄存器中的EX、MEM和WB級(jí)控制信號(hào)全部清零。這些信號(hào)傳遞到流水線后面的各級(jí),由于控制信號(hào)均為零,所以不會(huì)對(duì)任何寄存器和存儲(chǔ)器進(jìn)行寫操作。保持PC寄存器和IF/ID流水線寄存器不變:在ID級(jí)檢測(cè)到冒險(xiǎn)條件時(shí),HazardDetector輸出一個(gè)信號(hào):PC_IFWrite,作為使能信號(hào)同時(shí)送給PC寄存器和IF/ID流水線寄存器。冒險(xiǎn)成立時(shí),該信號(hào)為低電平,禁止PC寄存器和IF/ID流水線寄存器接收新數(shù)據(jù)。3.3分支冒險(xiǎn)還有一類冒險(xiǎn)是包含分支的流水線冒險(xiǎn),下圖。圖3.8分支冒險(xiǎn)實(shí)例流水線每個(gè)時(shí)鐘周期都得取指令才能維持運(yùn)行,但分支指令必須等到MEM級(jí)才能確定是否執(zhí)行分支。這種為了確定預(yù)取正確的指令而導(dǎo)致的延遲叫做控制冒險(xiǎn)或分支冒險(xiǎn)。一種比較普遍的提高分支阻塞速度的方法是假設(shè)分支不發(fā)生,并繼續(xù)執(zhí)行順序的指令流。如果分支發(fā)生的話,就丟棄已經(jīng)預(yù)取并譯碼的指令,指令的執(zhí)行沿著分支目標(biāo)繼續(xù)。由于分支指令直到MEM級(jí)才能確定下一條指令的PC,這就意味著為了丟棄指令必須將流水線中的IF、ID和EX級(jí)的指令都清除掉(flush)。這種優(yōu)化方法的代價(jià)較大,效率較低。如果我們能在流水線中提前分支指令的執(zhí)行過(guò)程,那么就能減少需要清除的指令數(shù)。這是一種提高分支效率的方法,降低了執(zhí)行分支的代價(jià)。因此我們采用提前分支指令的方法解決分支冒險(xiǎn)。提前分支指令需要提前完成兩個(gè)操作:計(jì)算分支的目的地址:由于已經(jīng)有了PC值和IF/ID流水線寄存器中的指令值,所以可以很方便地將EX級(jí)的分支地址計(jì)算電路移到ID級(jí)。我們針對(duì)所有指令都執(zhí)行分支地址的計(jì)算過(guò)程,但只有在需要它的時(shí)候才會(huì)用到。判斷分支指令的跳轉(zhuǎn)條件:我們將用于判斷分支指令成立的Zero信號(hào)檢測(cè)電路(Ztest)從ALU中獨(dú)立出來(lái),并將它從EX級(jí)提前至ID級(jí)。具體的設(shè)計(jì)將在ID級(jí)設(shè)計(jì)中介紹。在提前完成以上兩個(gè)操作之外,我們還需丟棄IF級(jí)的指令。具體做法是:加入一個(gè)控制信號(hào)IF_flush,做為IF/ID流水線寄存器的清零信號(hào)。當(dāng)分支冒險(xiǎn)成立,即Z=1,則IF_flush=1,否則IF_flush=0,故IF_flush=Z??紤]到本系統(tǒng)還要實(shí)現(xiàn)的無(wú)條件跳轉(zhuǎn)指令:J和JR,在執(zhí)行這兩個(gè)指令時(shí)也必須要對(duì)IF/ID流水線寄存器進(jìn)行清空,因此,IF_flush的表達(dá)式應(yīng)表示為:IF_flush=Z||J||JR。綜合以上分析,最終的無(wú)冒險(xiǎn)的流水線MIPSCPU原理框圖如圖3.9。圖3.9無(wú)冒險(xiǎn)的流水線MIPSCPU總體原理框圖四、流水線MIPS微處理器的設(shè)計(jì)根據(jù)流水線不同階段,將系統(tǒng)劃分為IF、ID、EX和MEM四大模塊,WB部分功能電路非常簡(jiǎn)單,可直接在頂層文件中設(shè)計(jì)。另外,系統(tǒng)還包括IF/ID、ID/EX、EX/MEM、MEM/WB四個(gè)流水線寄存器。1、取指令級(jí)模塊(IF)的設(shè)計(jì)IF模塊由指令指針寄存器PC、指令存儲(chǔ)器子模塊InstructionROM、指令指針選擇器MUX和一個(gè)32位加法器組成,IF級(jí)模塊接口信息如下表所示:引腳名稱方向說(shuō)明clkInput系統(tǒng)時(shí)鐘reset系統(tǒng)復(fù)位信號(hào),高電平有效Z分支指令的條件判斷結(jié)果J跳轉(zhuǎn)指令JR寄存器跳轉(zhuǎn)指令PC_IFWrite阻塞流水線的信號(hào),低電平有效JumpAddr[31:0]J指令跳轉(zhuǎn)地址JrAddr[31:0]JR指令跳轉(zhuǎn)地址BranchAddr[31:0]條件分支地址Instruction_if[31:0]Output指令機(jī)器NextPC_if[31:0]下一個(gè)PC值指令存儲(chǔ)器ROM用XilinxCOREGenerator實(shí)現(xiàn)產(chǎn)生的ROM無(wú)法滿足流水線CPU的指令要求,我們需用VerilogHDL設(shè)計(jì)一個(gè)ROM陣列。考慮到FPGA的資源,指令存儲(chǔ)器可設(shè)計(jì)為容量各為26×32bit的ROM。設(shè)計(jì)ROM時(shí)需將測(cè)試的機(jī)器碼寫入,課程提供一段簡(jiǎn)單測(cè)試程序的機(jī)器碼,機(jī)器碼存于PipelineDemo.coe文件中。課程已提供該ROM的代碼,已設(shè)計(jì)好上述測(cè)試程序機(jī)器碼的指令存儲(chǔ)器,文件名為InstructionROM.v。指令指針選擇器(PC)指令指針選擇器為一8選1數(shù)據(jù)選擇器,選擇信號(hào)為PCSource={JR,J,Z},具體含義如下表:地址PC來(lái)源{JR,J,Z}=100JR指令的跳轉(zhuǎn)地址{JR,J,Z}=010J指令的跳轉(zhuǎn)地址{JR,J,Z}=001Branch指令的分支地址{JR,J,Z}=000下一條指令地址PC+4PC寄存器當(dāng)發(fā)生數(shù)據(jù)冒險(xiǎn)時(shí),需要保持PC寄存器不變,因此PC寄存器是一個(gè)帶使能端的D型寄存器,使能信號(hào)為PC_IFWrite。2、指令譯碼模塊(ID)的設(shè)計(jì)指令譯碼模塊的主要作用是從機(jī)器碼中解析出指令,并根據(jù)解析結(jié)果輸出各種控制信號(hào)。ID模塊主要有指令譯碼(Decode)、寄存器堆(Registers)、冒險(xiǎn)監(jiān)測(cè)、分支檢測(cè)和加法器等組成。ID模塊的接口信息如下表所示:引腳名稱方向說(shuō)明clkInput系統(tǒng)時(shí)鐘Instruction_id[31:0]指令機(jī)器碼NextPC_id[31:0]指令指針RegWrite_wb寄存器寫允許信號(hào),高電平有效RegWriteAddr_wb[4:0]寄存器的寫地址RegWriteData_wb[31:0]寫入寄存器的數(shù)據(jù)MemRead_ex冒險(xiǎn)檢測(cè)的輸入RegWriteAddr_ex[4:0]MemtoReg_idOutput決定回寫的數(shù)據(jù)來(lái)源(0:ALU1:存儲(chǔ)器)RegWrite_id寄存器寫允許信號(hào),高電平有效MemWrite_id存儲(chǔ)器寫允許信號(hào),高電平有效MemRead_id存儲(chǔ)器讀允許信號(hào),高電平有效ALUCode_id[4:0]決定ALU采用何種運(yùn)算ALUSrcA_id決定ALU的A操作數(shù)的來(lái)源(0:rs1:Sa)ALUSrcB_id決定ALU的B操作數(shù)的來(lái)源(0:rt1:Imm)RegDst_id決定Register回寫是采用的地址(rt/rd)StallID/EX寄存器清空信號(hào),高電平插入一個(gè)流水線氣泡Z分支指令的條件判斷結(jié)果J跳轉(zhuǎn)指令JR寄存器跳轉(zhuǎn)指令PC_IFWrite阻塞流水線的信號(hào),低電平有效BranchAddr[31:0]條件分支地址JumpAddr[31:0]跳轉(zhuǎn)地址Imm_id[31:0]符號(hào)擴(kuò)展成32位的立即數(shù)Sa_id[31:0]0擴(kuò)展成32位的移位立即數(shù)RsData_id[31:0]Rs寄存器數(shù)據(jù)RtData_id[31:0]Rt寄存器數(shù)據(jù)RdAddr_id[4:0]Rd寄存器地址RsAddr_id[4:0]Rs寄存器地址RtAddr_id[4:0]Rt寄存器地址指令譯碼(Decode)子模塊的設(shè)計(jì)Decode控制器的主要作用是根據(jù)指令確定各個(gè)控制信號(hào)的值,是一個(gè)組合電路。我們將指令分成八類:R_type1:ADD、ADDU、SUB、SUBU、AND、OR、NOR、XOR、SLT、SLTU、SLLV、SRLV、SRAVR_type2:SLL、SRL、SRAJR_type:JRJ_type:JI_type:ADDI、ADDIU、ANDI、ORI、XORI、SLTI、SLTIUBranch:BEQ、BNE、BGEZ、BGTZ、BLEZ、BLTZLW:LWSW:SWDecode輸出的九組控制信號(hào):RegWrite決定是否對(duì)寄存器(Registers)進(jìn)行寫操作。當(dāng)RegWrite高電平有效時(shí),將數(shù)據(jù)寫入指定的寄存器中。需要寫回寄存器的指令有:LW、R_type1、R_type2和I_type,則RegWrite_id=LW||R_type1||R_type2||I_typeRegDst決定目標(biāo)寄存器是rt還是rd。當(dāng)RegDst=0時(shí),rt為目標(biāo)寄存器;當(dāng)RegDst=1時(shí),rd為目標(biāo)寄存器。需要寫回寄存器的指令類型有:LW、R_type1、R_type2和I_type。其中,R_type1和R_type2的目標(biāo)寄存器是rd,而LW和I_type的目標(biāo)寄存器是rt。所以:RegDst_id=R_type1||R_type2MemWrite決定是否對(duì)數(shù)據(jù)存儲(chǔ)器進(jìn)行寫操作。當(dāng)MemWrite有效時(shí),將數(shù)據(jù)寫入數(shù)據(jù)存儲(chǔ)器指定的位置。需要對(duì)寫存儲(chǔ)器的指令只有SW,所以:MemWrite_id=SWMemRead決定是否對(duì)數(shù)據(jù)存儲(chǔ)器進(jìn)行讀操作。當(dāng)MemRead有效時(shí),讀取數(shù)據(jù)存儲(chǔ)器指定位置的數(shù)據(jù)。需要對(duì)讀存儲(chǔ)器的指令只有LW,所以:MemRead_id=LWMemtoReg決定寫入寄存器(registers)的數(shù)據(jù)來(lái)自ALU還是數(shù)據(jù)存儲(chǔ)器。?當(dāng)MemtoReg=0時(shí),數(shù)據(jù)來(lái)自ALU;當(dāng)MemtoReg=1時(shí),數(shù)據(jù)來(lái)自數(shù)據(jù)存儲(chǔ)器。需要寫回寄存器的指令類型有:LW、R_type1、R_type2和I_type。其中,只有LW寫回寄存器的數(shù)據(jù)取自存儲(chǔ)器,所以:MemtoReg_id=LWALUSrcA決定ALU第一操作數(shù)來(lái)源。當(dāng)ALUSrcA=0時(shí),ALU第一操作數(shù)A(詳見轉(zhuǎn)發(fā)電路設(shè)計(jì));當(dāng)ALUSrcA=1時(shí),ALU第一操作數(shù)來(lái)源于0擴(kuò)展的用于移位指令的5位sa。八種指令類型中J_tpye、JR_tpye及Branch類型指令沒有使用ALU;其他使用ALU的指令類型中LW、SW、R_type1和I_type均采用的rs作為ALU第一操作數(shù),只有R_type2的第一操作數(shù)采用的是0擴(kuò)展的sa,所以:ALUSrcA_id=R_type2ALUSrcB決定ALU第二操作數(shù)來(lái)源。當(dāng)ALUSrcB=0時(shí),ALU第二操作數(shù)B。當(dāng)ALUSrcB=1時(shí),ALU第二操作數(shù)來(lái)源于符號(hào)擴(kuò)展的16位Imm。八種指令類型中J_tpye、JR_tpye及Branch類型指令沒有使用ALU。其他使用ALU的指令類型中R_type1和R_type2采用rt作為ALU第二操作數(shù),而LW、SW、I_type的第二操作數(shù)采用的是符號(hào)擴(kuò)展的立即數(shù)Imm段,所以:ALUSrcB_id=LW||SW||I_typePCSource決定寫入PC寄存器的來(lái)源。PCSource由JR_tpye、J_tpye及Z決定:即:PCSource={JR,J,Z}?PCSource=000時(shí),寫入值為下一條指令的地址PC+4;?PCSource=001時(shí),寫入值為Branch指令的分支地址;?PCSource=010時(shí),寫入值為J指令的跳轉(zhuǎn)地址;?PCSource=100時(shí),寫入值為JR指令的跳轉(zhuǎn)地址。ALUCode決定ALU的功能,由指令中的op段、rt段和funct段決定。功能表如下:opfunctionrt運(yùn)算ALUcodeBEQ_opxxxxxxxxxxZ=(A==B)5'd10BNE_opxxxxxxxxxxZ=~(A==B)5'd11BGEZ_opxxxxx5'd1Z=(A>=0)5'd12BGTZ_opxxxxx5'd0Z=(A>0)5'd13BLEZ_opxxxxx5'd0Z=(A<=1)5'd14BLTZ_opxxxxx5'd0Z=(A<0)5'd15R_type_opADD_functxxxxx加5'd0ADDU_functxxxxxAND_functxxxxx與5'd1XOR_functxxxxx異或5'd2OR_functxxxxx或5'd3NOR_functxxxxx或非5'd4SUB_functxxxxx減5'd5SUBU_functxxxxxSLT_OP_functxxxxxA<B?1:05'd19SLTU_OP_functxxxxxA<B?1:0(無(wú)符號(hào)數(shù))5'd20SLL_functxxxxxB>>A5'd16SLLV_functxxxxxSRL_functxxxxxB<<A5'd17SRLV_functxxxxxSRA_functxxxxxB>>>A5'd18ARAV_functxxxxxADDI_opxxxxxxxxxx加5'd0ADDIU_opxxxxxxxxxxANDI_opxxxxxxxxxx與5'd1XORI_opxxxxxxxxxx異或5'd2ORI_opxxxxxxxxxx或5'd3SLTI_opxxxxxxxxxxA<B?1:05'd19SLTIU_opxxxxxxxxxxA<B?1:0(無(wú)符號(hào)數(shù))5'd20SW_opxxxxxxxxxx加(計(jì)算地址)5'd0LW_opxxxxxxxxxx分支檢測(cè)(BranchTest)電路的設(shè)計(jì)Zero檢測(cè)電路主要用于判斷Branch指令的分支條件是否成立,其中BEQ、BNE兩個(gè)操作數(shù)為RsData與RtData,而BGEZ、BGTZ、BLEZ和BLTZ指令則為RsData與常數(shù)0比較,所以輸出信號(hào)Z的表達(dá)式為:RsData[31]||~(|RsData[31:0]);ALUCode=alu_blezRsData[31];ALUCode=alu_bltz~RsData[31]&&(|RsData[31:0]);ALUCode=alu_bgtzZ=~RsData[31];ALUCode=alu_bgez|(RsData[31:0]^RtData[31:0]);ALUCode=alu_bne&(RsData[31:0]~^RtData[31:0]);ALUCode=alu_beq0;ALUCode=OTHER寄存器堆(Registers)子模塊的設(shè)計(jì)寄存器堆由32個(gè)32位寄存器組成,這些寄存器通過(guò)寄存器號(hào)進(jìn)行讀寫存取。寄存器堆的原理框圖如下圖所示。因?yàn)樽x取寄存器不會(huì)更改其內(nèi)容,故只需提供寄存號(hào)即可讀出該寄存器內(nèi)容。讀取端口采用數(shù)據(jù)選擇器即可實(shí)現(xiàn)讀取功能。應(yīng)注意“0”號(hào)寄存器為常數(shù)0.對(duì)于往寄存器里寫數(shù)據(jù),需要目標(biāo)寄存器號(hào)(WriteRegister)、待寫入數(shù)據(jù)(WriteData)、寫允許信號(hào)(RegWrite)三個(gè)變量。圖3.13中5位二進(jìn)制譯碼器完成地址譯碼,其輸出控制目標(biāo)寄存器的寫使能信號(hào)EN,決定將數(shù)據(jù)WriteData寫入哪個(gè)寄存器。在流水線CPU設(shè)計(jì)中,寄存器堆設(shè)計(jì)還應(yīng)解決三階數(shù)據(jù)相關(guān)的數(shù)據(jù)轉(zhuǎn)發(fā)問(wèn)題。當(dāng)滿足三階數(shù)據(jù)相關(guān)條件時(shí),寄存器具有ReadafterWrite的特性。為實(shí)現(xiàn)該功能,在寄存器堆的基礎(chǔ)上加一轉(zhuǎn)發(fā)電路。如下圖所示。圖中轉(zhuǎn)發(fā)檢測(cè)電路的輸出表達(dá)式為RsSel=RegWrite_wb&&(~(RegWriteAddr_wb==0))&&(RegWriteAddr_wb==RsAddr_id)RtSel=RegWrite_wb&&(~(RegWriteAddr_wb==0))&&(RegWriteAddr_wb==RtAddr_id)冒險(xiǎn)檢測(cè)功能電路(HazardDeterctor)的設(shè)計(jì)冒險(xiǎn)成立的條件為:上一條指令是LW指令,即MemRead_ex=1;在EX級(jí)的LW指令與在ID級(jí)的指令讀寫的是同一個(gè)寄存器,即RegWriteAddr_ex=RsAddr_id或RegWriteAddr_ex=RtAddr_id解決冒險(xiǎn)的方法為:插入一個(gè)流水線氣泡Stall清空ID/EX寄存器并且阻塞流水線ID級(jí)、IF級(jí)流水線,有:Stall=((RegWriteAddr_ex==RsAddr_id)||(RegWriteAddr_ex==RtAddr_id))&&MemRead_ex保持PC寄存器和IF/ID流水線寄存器不變,有:PC_IFWrite=~Stall其它單元電路的設(shè)計(jì)Branch指令分支地址的計(jì)算電路:BranchAddr=NextPC_id+(sign-extend(Imm_id)<<2)JR指令跳轉(zhuǎn)地址的計(jì)算電路:JRAddr=RsData_idJ指令跳轉(zhuǎn)地址的計(jì)算電路:Jaddr={NextPC_id[31:28],IR_id[25:0],2’b00}符號(hào)擴(kuò)展的方法—針對(duì)有符號(hào)數(shù)?如果最高位(即符號(hào)位)是0,則要擴(kuò)展的高位用0補(bǔ)齊;如果最高位是1,則用1補(bǔ)齊。?例:8位的+1,表示為二進(jìn)制為,擴(kuò)展成160擴(kuò)展的方法—針對(duì)無(wú)符號(hào)數(shù)?要擴(kuò)展的高位用0補(bǔ)齊。?例:16位二進(jìn)制0xFFFF,0擴(kuò)展成32位為0x0000FFFF。3、執(zhí)行模塊(EX)的設(shè)計(jì)執(zhí)行模塊主要有ALU子模塊、轉(zhuǎn)發(fā)電路Forwarding以及若干數(shù)據(jù)選擇器組成。這行模塊的接口信息如下表所示:引腳名稱方向說(shuō)明RegDst_exInput決定Register回寫時(shí)采用的地址(rt/rd)ALUCode_ex[4:0]決定ALU采用何種運(yùn)算ALUSrcA_ex決定ALU的A操作數(shù)的來(lái)源(rs/Sa)ALUSrcB_ex決定ALU的B操作數(shù)的來(lái)源(rt/Imm)Imm_ex[31:0]立即數(shù)Sa_ex[31:0]移位位數(shù)RsAddr_ex[4:0]Rs寄存器地址,即Instruction_id[25:21]RtAddr_ex[4:0]Rt寄存器地址,即Instruction_id[20:16]RdAddr_ex[4:0]Rd寄存器地址,即Instruction_id[15:11]RsData_ex[31:0]Rs寄存器數(shù)據(jù)RtData_ex[31:0]Rt寄存器數(shù)據(jù)RegWriteData_wb[31:0]寫入寄存器的數(shù)據(jù)ALUResult_mem[31:0]ALU輸出數(shù)據(jù)RegWriteAddr_wb[4:0]寄存器的寫地址RegWriteAddr_mem[4:0]RegWrite_wb寄存器寫允許信號(hào)RegWrite_memRegWriteAddr_ex[4:0]Output寄存器的寫地址ALUResult_ex[31:0]ALU運(yùn)算結(jié)果MemWriteData_ex[31:0]寄存器的回寫數(shù)據(jù)ALU_A[31:0]ALU操作數(shù),測(cè)試時(shí)使用ALU_B[31:0]ALU子模塊的設(shè)計(jì)ALU是提供CPU基本運(yùn)算能力的重要電路。ALU執(zhí)行何種運(yùn)算,由控制單元中的ALU控制器輸出的ALUCode信號(hào)決定。ALU功能見下表:為了提高運(yùn)算速度,可將各種運(yùn)算同時(shí)執(zhí)行,得到的運(yùn)算結(jié)果由ALUCode信號(hào)進(jìn)行挑選。ALU的基本結(jié)構(gòu)如下圖所示。加、減電路的設(shè)計(jì)考慮減法、比較(SLT、SLTI)均可用加法器和必要的輔助電路來(lái)實(shí)現(xiàn)。上圖中的Binvert信號(hào)控制加減運(yùn)算:Binvert=~(ALUCode==alu_add)對(duì)ALU來(lái)說(shuō),它的兩個(gè)操作數(shù)輸入時(shí)都已經(jīng)是補(bǔ)碼形式,當(dāng)要完成兩個(gè)操作數(shù)的減法時(shí),即A補(bǔ)-B補(bǔ),可將減法轉(zhuǎn)換為加法,利用加法器來(lái)實(shí)現(xiàn):A補(bǔ)-B補(bǔ)=A補(bǔ)+(-B補(bǔ))=A補(bǔ)+(B補(bǔ))補(bǔ)=A補(bǔ)+(B補(bǔ))反+1加法器完成的功能為:sum=A+B^{32{Binvert}}+Binvert當(dāng)Binvert=0時(shí),sum=A+B^0+0=A+B;當(dāng)Binvert=1時(shí),sum=A+B^{32’b1}+1=A-B;(B^{32’b1}即對(duì)B按位取反)即可完成加減運(yùn)算。由于32位加法器的運(yùn)算速度影響著CPU頻率的高低,因此設(shè)計(jì)一個(gè)高速加法器尤為重要,本實(shí)驗(yàn)采用lab7中介紹的32位進(jìn)位選擇加法器。比較電路的設(shè)計(jì)考慮對(duì)于比較運(yùn)算,如果最高為不同,即A[31]≠B[31],則根據(jù)A[31]、B[31]決定比較結(jié)果,但應(yīng)注意有符號(hào)數(shù)和無(wú)符號(hào)數(shù)比較運(yùn)算的區(qū)別。1、在有符號(hào)數(shù)比較SLT運(yùn)算中,判斷A<B的方法為:若A為負(fù)數(shù)、B為0或正數(shù):A[31]&&(~B[31])若A、B符號(hào)相同,A-B為負(fù):(A[31]~^B[31])&&sum[31]則SLTResult=(A[31]&&(~B[31]))||((A[31]~^B[31])&&sum[31])2、在無(wú)符號(hào)數(shù)比較SLT運(yùn)算中,判斷A<B的方法為:若A最高位為0、B最高位為1:(~A[31])&&B[31]若A、B最高位相同,A-B為負(fù):(A[31]~^B[31])&&sum[31]則SLTResult=((~A[31])&&B[31])||((A[31]~^B[31])&&sum[31])算術(shù)右移運(yùn)算電路的設(shè)計(jì)考慮VerilogHDL的算術(shù)右移的運(yùn)算符為“>>>”。要實(shí)現(xiàn)算術(shù)右移應(yīng)注意,被移位的對(duì)象必須定義為reg類型,但是在SRA指令,被移位的對(duì)象操作數(shù)B為輸入信號(hào),不能定義為reg類型,因此必須引入reg類型中間變量B_reg,相應(yīng)的VerilogHDL語(yǔ)句為:regsigned[31:0]B_reg;always@(B)beginB_reg=B;end引入reg類型的中間變量B_reg后,就可對(duì)B_reg進(jìn)行算術(shù)右移操作。邏輯運(yùn)算與、或、或非、異或、邏輯移位等運(yùn)算較為簡(jiǎn)單,只是要注意一點(diǎn),ANDI、XORI、ORI三條指令的立即數(shù)為16位無(wú)符號(hào)數(shù),應(yīng)“0擴(kuò)展”為32位無(wú)符號(hào)數(shù),在運(yùn)算的同時(shí)完成“0擴(kuò)展”。如:ADDI指令的運(yùn)算為A&{16’b0,B[15:0]}。轉(zhuǎn)發(fā)電路Forwarding的設(shè)計(jì)操作數(shù)A和B由數(shù)據(jù)選擇器決定,數(shù)據(jù)選擇器的地址信號(hào)即為ForwardA和ForwardB。其含義如下表:地址操作數(shù)來(lái)源說(shuō)明ForwardA=00RsData_ex操作數(shù)A來(lái)自寄存器堆ForwardA=01RegWriteData_wb操作數(shù)A來(lái)自二階數(shù)據(jù)相關(guān)的轉(zhuǎn)發(fā)數(shù)據(jù)ForwardA=10ALUresult_mem操作數(shù)A來(lái)自一階數(shù)據(jù)相關(guān)的轉(zhuǎn)發(fā)數(shù)據(jù)ForwardB=00RtData_ex操作數(shù)B來(lái)自寄存器堆ForwardB=01RegWriteData_wb操作數(shù)B來(lái)自二階數(shù)據(jù)相關(guān)的轉(zhuǎn)發(fā)數(shù)據(jù)ForwardB=10ALUresult_mem操作數(shù)B來(lái)自一階數(shù)據(jù)相關(guān)的轉(zhuǎn)發(fā)數(shù)據(jù)ForwardA[0]=RegWrite_wb&&(RegWriteAddr_wb!=0)&&(RegWriteAddr_mem!=RsAddr_ex)&&(RegWriteAddr_wb==RsAddr_ex);ForwardA[1]=RegWrite_mem&&(RegWriteAddr_mem!=0)&&(RegWriteAddr_mem==RsAddr_ex);ForwardB[0]=RegWrite_wb&&(RegWriteAddr_wb!=0)&&(RegWriteAddr_mem!=RtAddr_ex)&&(RegWriteAddr_wb==RtAddr_ex);ForwardB[1]=RegWrite_mem&&(RegWriteAddr_mem!=0)&&(RegWriteAddr_mem==RtAddr_ex);四、存儲(chǔ)器訪問(wèn)MEM模塊的設(shè)計(jì)數(shù)據(jù)存儲(chǔ)器利用XilinxCoreGenerator實(shí)現(xiàn)??紤]到FPGA的資源,數(shù)據(jù)存儲(chǔ)器可設(shè)計(jì)為容量各為26×32bit單端口RAM。由于MIPS系統(tǒng)的32位字地址由4個(gè)字節(jié)組成,根據(jù)“對(duì)齊限制”要求字地址必須是4的倍數(shù),也就是說(shuō)字地址的低兩位必須是0,所以字地址的低兩位不接入電路。故我們?cè)O(shè)計(jì)的數(shù)據(jù)RAM的地址應(yīng)該接的信號(hào)是ALUResult_mem[7:2]。由于Virtex-IIPro系列的FPGA只能產(chǎn)生帶寄存器的內(nèi)核RAM,所以存儲(chǔ)器輸出繞過(guò)MEM/WB流水線寄存器,直接接入WB級(jí)的數(shù)據(jù)選擇器。五、流水線寄存器的設(shè)計(jì)流水線寄存器負(fù)責(zé)將流水線的各部分分開,共有IF/ID、ID/EX、EX/MEM、MEM/WB四組。根據(jù)前面的介紹可知,四組流水線寄存器要求不完全相同,因此設(shè)計(jì)也有不同考慮。(1)EX/MEM、MEM/WB兩組流水線寄存器只是普通D型寄存器。(2)當(dāng)流水線發(fā)生數(shù)據(jù)冒險(xiǎn)時(shí),需清空ID/EX流水線寄存器而插入一個(gè)氣泡,因此ID/EX流水線寄存器是一個(gè)帶同步清零功能的D型寄存器,清零信號(hào)為Stall。(3)當(dāng)流水線發(fā)生數(shù)據(jù)冒險(xiǎn)時(shí),需保持IF/ID流水線寄存器不變,因此IF/ID流水線寄存器具有使能信號(hào)輸入,使能信號(hào)為PC_IFWrite;當(dāng)流水線發(fā)生分支冒險(xiǎn)時(shí),需清空IF/ID流水線寄存器,清零信號(hào)為IF_flush。因此,IF/ID流水線寄存器是一個(gè)帶使能功能、同步清零功能的D型寄存器。需要注意的是,由于仿真對(duì)初始值的要求,上述寄存器都應(yīng)考慮有reset信號(hào)的接入,以提供仿真時(shí)各寄存器的初值。六、頂層文件的設(shè)計(jì)按照流水線MIPS微處理器的原理框圖連接各模塊即可。為方便測(cè)試,可將關(guān)鍵變量輸出,關(guān)鍵變量有:指令指針PC、指令碼Instruction、流水線插入氣泡標(biāo)志Stall、分支標(biāo)志JumpFlag(即{JR,J,Z})、ALU輸入輸出(ALU_A、ALU_B、ALUResult)和數(shù)據(jù)存儲(chǔ)器的輸出MemDout_wb。五、實(shí)驗(yàn)代碼見上傳的solution六、實(shí)驗(yàn)設(shè)備裝有ISE、ModelSimSE和ChipScopePro軟件的計(jì)算機(jī);XUPVirtex-ⅡPro開發(fā)系統(tǒng)一套;SVGA顯示器一臺(tái)。實(shí)驗(yàn)仿真結(jié)果與分析1.IF級(jí)仿真分析1.1順序執(zhí)行分析:起初reset信號(hào)高電平,初始PC為0。在之后的一段時(shí)間內(nèi),{JR,J,Z}一直都是{0,0,0},沒有跳轉(zhuǎn)和分支指令,CPU每運(yùn)行一周期,PC遞增4。1.2JR跳轉(zhuǎn)分析:當(dāng)JR為高電平時(shí),PC的為0x34,與JrAddr相同,完成JR跳轉(zhuǎn)。1.3J跳轉(zhuǎn)分析:J=1,當(dāng)時(shí)鐘上升沿到來(lái)時(shí)執(zhí)行無(wú)條件跳轉(zhuǎn)指令,PC跳到JumpAddr=32'h2c;NextPC_if=PC+4。1.4Branch分支分析:Z=1,當(dāng)時(shí)鐘上升沿到來(lái)時(shí)執(zhí)行Branch指令,PC跳到BranchAddr=32'h4;NextPC_if=PC+4。綜上,PC能夠根據(jù){JR,J,Z},完成順序執(zhí)行、JR跳轉(zhuǎn)、J跳轉(zhuǎn)、Branch分支。ALU仿真分析仿真整體波形ALUCodeABALUResultoverflow驗(yàn)證ALUResult00000(add)1000200f000000(add)100001(and)ff0c0e1010df30ff100c00100100c001000010(xor)ff0c0e1010df30ffefd33eef0efd33eef00011(or)ff0c0e1010df30ffffdf3eff0ffdf3eff00100(nor)ff0c0e1010df30ff0020c10000020c10000101(sub)70f0c0e060f0908c160f0908c00110(andi)ff0c0e10ffffe0ff000111(xori)ff0c0e10ffffe0ffff0ceeef0ff0ceeef01000(ori)ff0c0e10ffffe0ffff0ceeff0ff0ceeff10000(sll)ffffe0fffffe0ff00fffe0ff010001(srl)ffffe0ff0ffffe0f00ffffe0f10010(sra)ffffe0fffffffe0f0fffffe0f10011(slt)ff000004700000ff010100(sltu)ff000004700000ff0分析:由仿真波形可知,設(shè)計(jì)的ALU能夠完成實(shí)驗(yàn)所要求的算術(shù)運(yùn)算和邏輯運(yùn)算。Decode仿真分析3.1Instruction=32'h20210042;//addi$t0,$0,42觀察Instruction前六位,op=Instruction[31:26]=001000=ADDI_op,因此該指令A(yù)LUCode=alu_addi=00000,此外MemWrite=0,,MemRead=0,Regwrite=1(目標(biāo)寄存器為rd),MemToReg=0(用ALUResult作為輸出),ALUSrcA=0,ALUSrcB=1(此時(shí)操作數(shù)B=Imm_ex)。因此譯碼結(jié)果完全符合ADDi操作的要求.3.2Instruction=32'h000c4080;//sll$t0,$t4,2 觀察Instruction前六位,op=Instruction[31:26]=000000=R_type_op,func=Instruction[5:0]=000000=SLL_funct。因此該指令A(yù)LUCode=alu_sll=5d’16=10000,此外MemWrite=0,,MemRead=0,Regwrite=1,RegDst=1(寫目標(biāo)寄存器為rd),MemToReg=0(用ALUResult作為輸出),ALUSrcA=1(此時(shí)操作數(shù)A=Sa_ex),ALUSrcB=0。因此譯碼結(jié)果完全符合SLL操作的要求.綜上,驗(yàn)證其他控制信號(hào)均與Instruction相符合。Top仿真分析4.1整體波形分析:與教材表7.20測(cè)試結(jié)果仔細(xì)對(duì)照得,變量的變化情況符合要求。4.2Zero檢測(cè)電路觀察Z信號(hào)可發(fā)現(xiàn)其滿足式子RsData[31]||~(|RsData[31:0]);ALUCode=alu_blezRsData[31];ALUCode=alu_bltz~RsData[31]&&(|RsData[31:0]);ALUCode=alu_bgtzZ=~RsData[31];ALUCode=alu_bgez|(RsData[31:0]^RtData[31:0]);ALUCode=alu_bne&(RsData[31:0]~^RtData[31:0]);ALUCode=alu_beq0;ALUCode=OTHER4.3阻塞分析分析:Stall信號(hào)為高電平時(shí),Instruction與PC均持續(xù)兩個(gè)時(shí)鐘周期,即發(fā)生了阻塞4.4branch分支指令分析:JumpFlag=001,下一個(gè)時(shí)鐘上升沿PC發(fā)生分支。具體分支地址計(jì)算如下:Imm_id={{16{Instruction_id[15]}},Instruction_id[15:0]}=fffffff4;Imm_id_shift=Imm_id<<2=ffffffd0;NextPC_id=32’h34=00000034;BranchAddress=NextPC_id+Imm_id_shift=;與波形相符,仿真正確。4.5IF_flush信號(hào)分析分析:JumpFlag0時(shí),發(fā)生跳轉(zhuǎn),F(xiàn)lush信號(hào)為高電平,下一個(gè)時(shí)鐘信號(hào)上升沿到來(lái)時(shí),將Instruction_id、NextPC_id沖刷掉,置零,符合設(shè)計(jì)要求。4.6Jump分析注意到在波形的最后階段出現(xiàn)PC的循環(huán),JumpFlag=010,發(fā)生跳轉(zhuǎn)指令。分析:JumpAddr={NextPC_id[31:28],Instruction_id[25:0],2'b00}=8H,下一個(gè)時(shí)鐘信號(hào)上升沿到來(lái)時(shí),PC=00000028H,與波形一致,最后PC出現(xiàn)循環(huán)。心得實(shí)驗(yàn)收獲頗豐,真的很感謝自己當(dāng)初做了對(duì)的選擇,選了數(shù)字系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)Ⅱ,雖然學(xué)分只有0.5分,但在實(shí)驗(yàn)過(guò)程中收獲的不僅僅是知識(shí),更是一種心態(tài),只有在良好的心態(tài)下去調(diào)試代碼,才能發(fā)現(xiàn)代碼中的錯(cuò)誤。我們不是久經(jīng)沙場(chǎng)的程序員,在調(diào)試代碼時(shí)難免有點(diǎn)焦慮,操之過(guò)急。我就是將ID模塊中Imm_id粗心寫成了imm_id,導(dǎo)致流水線CPU頂層仿真出錯(cuò),經(jīng)過(guò)長(zhǎng)時(shí)間的低效率的調(diào)試愣是沒找到錯(cuò)誤,心情越來(lái)越煩躁、沮喪,愣愣的對(duì)著電腦發(fā)呆。后來(lái),自己經(jīng)過(guò)反思,痛定思痛,決心靜心好好再調(diào)試一次,從reset=1開始排查代碼中的錯(cuò)誤,終究是發(fā)現(xiàn)了問(wèn)題出現(xiàn)在有一條線沒有連接上的,即imm_id,修改后,流水線工作正常,符合設(shè)計(jì)要求,并且成功通過(guò)唐老師驗(yàn)收,自己也掌握了高效率的排錯(cuò)方法,內(nèi)心的自豪感油然而生,一切都是那么美好,越是絕望之時(shí),越是希望出現(xiàn)之時(shí)。自己對(duì)VerilogHDL語(yǔ)言還是很感興趣的,假期里也看了Veri
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年企業(yè)暫時(shí)性工作合同協(xié)議
- 2025年離婚協(xié)議財(cái)產(chǎn)保護(hù)策劃與實(shí)施策略
- 2025年體育場(chǎng)館管理服務(wù)合同
- 2025年獵頭項(xiàng)目申請(qǐng)報(bào)告
- 2025年高精度二維伺服系統(tǒng)項(xiàng)目規(guī)劃申請(qǐng)報(bào)告
- 2025年住宅租賃協(xié)議法律規(guī)范
- 2025年中國(guó)內(nèi)地建筑工程合同管理全書
- 2025年企業(yè)團(tuán)隊(duì)建設(shè)培訓(xùn)費(fèi)用預(yù)算協(xié)議樣本
- 2025年公司租用辦公地點(diǎn)合同樣本
- 2025年典當(dāng)行經(jīng)營(yíng)許可協(xié)議書
- 物業(yè)園區(qū)污漬清潔工作規(guī)程培訓(xùn)
- 2023高考語(yǔ)文文言文復(fù)習(xí):《說(shuō)苑》練習(xí)題(含答案解析)
- 關(guān)于高中語(yǔ)文教學(xué)中“微課”的運(yùn)用分析獲獎(jiǎng)科研報(bào)告論文
- 社會(huì)化工會(huì)工作者考試試卷及答案
- 設(shè)備本質(zhì)安全課件
- 人力資源管理的戰(zhàn)略定位與實(shí)施
- 《健身氣功八段錦》教案
- 重視心血管-腎臟-代謝綜合征(CKM)
- 小學(xué)生作文方格紙A4紙直接打印版
- 神筆馬良課文原文
- 木質(zhì)包裝材料行業(yè)報(bào)告
評(píng)論
0/150
提交評(píng)論