電子科大系統(tǒng)結(jié)構(gòu)實驗解決控制冒險_第1頁
電子科大系統(tǒng)結(jié)構(gòu)實驗解決控制冒險_第2頁
電子科大系統(tǒng)結(jié)構(gòu)實驗解決控制冒險_第3頁
電子科大系統(tǒng)結(jié)構(gòu)實驗解決控制冒險_第4頁
電子科大系統(tǒng)結(jié)構(gòu)實驗解決控制冒險_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、實驗報告課程名稱:計算機系統(tǒng)結(jié)構(gòu)實驗學院:計算機科學與工程學院專業(yè):計算機科學與技術指導教師:好老師學生姓名:愛學習的大哥哥 實驗成績:日期:2017年5月26日電子科技大學計算機學院實驗中心 電 子 科 技 大 學實 驗 報 告一、 實驗項目名稱:解決控制冒險二、 實驗室名稱:主樓A2-412 實驗時間:2017年5月26日三、 實驗目的在給出的流水線代碼基礎上,增加ID級關閉寫使能信號,以解決不正確分支指令的影響。通過完成這次實驗,加深對控制冒險現(xiàn)象的產(chǎn)生和消除控制冒險的原理的理解,提高編程和測試的能力。四、 實驗原理(一) 轉(zhuǎn)移相關問題轉(zhuǎn)移指令改變程序順序執(zhí)行的特性。由于是流水線操作,在

2、轉(zhuǎn)移發(fā)生之前,若干條轉(zhuǎn)移指令的后續(xù)指令已被取到流水線處理機中。這就是所謂的轉(zhuǎn)移相關問題(branch hazard),有時也稱之為控制相關問題(control hazard)。回顧我們前面介紹的處理轉(zhuǎn)移相關問題的4種技術:以上任何一種方法都會使硬件固定,編譯時會根據(jù)硬件機制和轉(zhuǎn)移行為對代碼進行調(diào)度,以獲取最佳性能。(二) 消除無條件轉(zhuǎn)移指令的后一條指令影響每條指令在ID時判斷在當前在EXE階段的操作碼暫存器的值是否是無條件轉(zhuǎn)移指令:如果是,那么不使能當前在ID階段的那條指令的WZ、WMEM和WREG的信號,這樣這條指令的執(zhí)行就對程序的邏輯沒有影響。(三) 條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令的實現(xiàn)思想與無

3、條件轉(zhuǎn)移指令有所類似,但不完全相同。首先對于條件轉(zhuǎn)移指令本身來說,需要判斷Z標志是否能用。若Z標志還沒有準備好,則要暫停流水線一個時鐘周期。這一點和判斷數(shù)據(jù)相關極為相似。但由于轉(zhuǎn)移指令只可能改變PC而不改變其它狀態(tài),因此用不著封鎖WZ,WMEM,WREG(對轉(zhuǎn)移指令來講,這些信號原本就為0)。因為如果處在譯碼級的是條件轉(zhuǎn)移指令,而且處在EXE級的是ALU類型的指令(就要寫Z標志到流水線寄存器Z了),則要等到ALU指令寫完Z后,再判斷轉(zhuǎn)移與否,為此要暫停一個周期(或者如前所述,插入一條nop指令)。對于條件轉(zhuǎn)移指令的下一條指令的處理辦法與無條件指令不同。因為條件轉(zhuǎn)移的下一條指令有可能執(zhí)行也有可能

4、不執(zhí)行,需要在對無條件轉(zhuǎn)移指令的處理策略上進行擴展:條件轉(zhuǎn)移的下一條指令在ID時判斷在當前在EXE階段的操作碼暫存器的值是否是條件轉(zhuǎn)移指令并且判斷是否轉(zhuǎn)移成功(Z的值沒變),如果發(fā)現(xiàn)成功,那么不使能當前在ID階段的那條指令的WZ、WMEM和WREG的信號,這條指令的執(zhí)行就對程序的邏輯沒有影響(與無條件處理方式相同);如果發(fā)現(xiàn)轉(zhuǎn)移不成功,說明本條指令為有效指令,使能當前在ID階段的那條指令的WZ、WMEM和WREG的信號,本條指令正常執(zhí)行。五、 實驗內(nèi)容在給出的流水線代碼基礎上,增加ID級關閉寫使能信號,以解決不正確分支指令的影響。六、 實驗器材(設備、元器件)ISE Design Suite

5、14.7集成開發(fā)環(huán)境,編程語言:Verilog HDL硬件描述語言七、 實驗步驟1、新建項目,將上個實驗完成的解決數(shù)據(jù)冒險與數(shù)據(jù)前推的代碼拷貝進來2、在直接跳轉(zhuǎn)中,需要廢除跳轉(zhuǎn)指令的下一條(當譯碼出跳轉(zhuǎn)指令時,下一條已經(jīng)流出,所以要廢除掉);而在條件跳轉(zhuǎn)中,需要根據(jù)z的值來判斷是否廢除下一條指令。在代碼中譯碼級,pcsource定義如下assign pcsource1=i_jr|i_j|i_jal;/選擇下一條指令的地址,00選PC+4,01選轉(zhuǎn)移地址,10選寄存器內(nèi)地址,11選跳轉(zhuǎn)地址assign pcsource0=i_beq&rsrtequ|i_bne&rsrtequ|i

6、_j|i_jal;LOADDEPEN,BTAKEN,ID_branch );如果是直接跳轉(zhuǎn),那么一定廢除,pcsource=11,如果是條件跳轉(zhuǎn),廢除的條件就是pcsource=01,暫不考慮jr指令,那么要廢除下一條指令的條件就是pcsource=00;3、在頂層模塊添加變量wire wz;/決定是否寫z值wire 1:0 exepcsource;/exe pcsource 主要用在條件跳轉(zhuǎn)wz需要在id級計算出來,然后傳遞到exe級,如果廢除指令那么wz=0;exepcsource與之相反,從exe級傳遞到id級,用來指示下一條指令是否廢除。4、增加這兩個變量后,頂層模塊 id級與exe級

7、的代碼如下pipeid id_stage (dpc4,inst, /指令譯碼ID級 wrn,wdi,wwreg,clock,resetn, bpc,jpc,pcsource,dwreg,dm2reg,dwmem,daluc,daluimm,da,db,dimm,drn,dshift,djal,z, ern,mrn,ewreg,mwreg,idadepend,idbdepend,em2reg,wpc,exepcsource,wz); pipeexe exe_stage (wz,ealuc,ealuimm,ea,eb,eimm,eshift,ern0,epc4,/指令執(zhí)行EXE ejal,ern,

8、ealu,z, malu,wmo,exeadepend,exebdepend); 5、加入exepcsource后,根據(jù)步驟2的分析,如果pcsource!=00,就廢除掉下一條指令,即wreg、wmem、wz全部置0,這里需要注意的是,wz的值有多種表示方法,由于wz只在控制冒險中使用,并且在控制冒險中wreg=wmem=wz,所以這里可以直接將wreg的值賦給wz,也可以wz=exepcsource0(pcsource0=i_beq&rsrtequ|i_bne&rsrtequ|i_j|i_jal,在條件跳轉(zhuǎn)中pcsource0= i_beq&rsrtequ|i_bn

9、e)assign wreg=(i_add|i_sub|i_mul|i_and|i_or|i_xor|i_sll| /wreg為1時寫寄存器堆中某一寄存器,否則不寫 i_srl|i_sra|i_addi|i_muli|i_andi|i_ori|i_xori| i_lw|i_lui|i_jal) & wpc & (exepcsource0=0) & (exepcsource1=0);assign wmem=i_sw & wpc & (exepcsource0=0) & (exepcsource1=0);/為1時寫存儲器,否則不寫assign wz=w

10、regid級cu模塊完整代碼如下:module pipeidcu(rsrtequ,func, op,wreg,m2reg,wmem,aluc,regrt,aluimm, sext,pcsource,shift,jal, /*數(shù)據(jù)前推加入的參數(shù)*/ exe_rd,mem_rd,exe_wreg,mem_wreg,idadepend,idbdepend,rs,rt,rd,exe_m2reg,wpc,exepcsource,wz ); input 1:0 exepcsource; input 4:0 exe_rd,mem_rd,rs,rt,rd; input exe_wreg,mem_wreg,ex

11、e_m2reg; output 1:0 idadepend,idbdepend; output wpc; /wreg 是否寫寄存器 /dm2reg為1時將存儲器數(shù)據(jù)寫入寄存器,否則將ALU結(jié)果寫入寄存器 /dwmem為1時寫存儲器,否則不寫 /daluimm為1時ALUb輸入端使用立即數(shù) /dshift為1時ALUa輸入端使用移位位數(shù) /djal為1時執(zhí)行jal指令,否則不是 input rsrtequ; input 5:0 func,op; output wz,wreg,m2reg,wmem,regrt,aluimm,sext,shift,jal; output 4:0 aluc; outp

12、ut 1:0 pcsource; wire i_add,i_sub,i_mul,i_and,i_or,i_xor,i_sll,i_srl,i_sra,i_jr; /對指令進行譯碼 wire i_addi,i_muli,i_andi,i_ori,i_xori,i_lw,i_sw,i_beq,i_bne,i_lui,i_j,i_jal;and(i_add,op5,op4,op3,op2,op1,op0,func2,func1,func0);and(i_sub,op5,op4,op3,op2,op1,op0,func2,func1,func0);and(i_mul,op5,op4,op3,op2,o

13、p1,op0,func2,func1,func0);and(i_and,op5,op4,op3,op2,op1,op0,func2,func1,func0);and(i_or,op5,op4,op3,op2,op1,op0,func2,func1,func0);and(i_xor,op5,op4,op3,op2,op1,op0,func2,func1,func0);and(i_sra,op5,op4,op3,op2,op1,op0,func2,func1,func0);and(i_srl,op5,op4,op3,op2,op1,op0,func2,func1,func0);and(i_sll,

14、op5,op4,op3,op2,op1,op0,func2,func1,func0);and(i_jr,op5,op4,op3,op2,op1,op0,func2,func1,func0); and(i_addi,op5,op4,op3,op2,op1,op0); and(i_muli,op5,op4,op3,op2,op1,op0); and(i_andi,op5,op4,op3,op2,op1,op0); and(i_ori,op5,op4,op3,op2,op1,op0); and(i_xori,op5,op4,op3,op2,op1,op0); and(i_lw,op5,op4,op3

15、,op2,op1,op0); and(i_sw,op5,op4,op3,op2,op1,op0); and(i_beq,op5,op4,op3,op2,op1,op0); and(i_bne,op5,op4,op3,op2,op1,op0); and(i_lui,op5,op4,op3,op2,op1,op0); and(i_j,op5,op4,op3,op2,op1,op0); and(i_jal,op5,op4,op3,op2,op1,op0); wire i_rs=i_add|i_sub|i_mul|i_and|i_or|i_xor|i_jr|i_addi|i_muli| i_andi|

16、i_ori|i_xori|i_lw|i_sw|i_beq|i_bne; wire i_rt=i_add|i_sub|i_mul|i_and|i_or|i_xor|i_sra|i_srl|i_sll|i_sw|i_beq|i_bne; /控制信號的生成/ assign wreg=(i_add|i_sub|i_mul|i_and|i_or|i_xor|i_sll| /wreg為1時寫寄存器堆中某一寄存器,否則不寫 i_srl|i_sra|i_addi|i_muli|i_andi|i_ori|i_xori| i_lw|i_lui|i_jal) & wpc & (exepcsource

17、0=0) & (exepcsource1=0); assign regrt=i_addi|i_muli|i_andi|i_ori|i_xori|i_lw|i_lui; /regrt為1時目的寄存器是rt,否則為rd assign jal=i_jal; /為1時執(zhí)行jal指令,否則不是 assign m2reg=i_lw; /為1時將存儲器數(shù)據(jù)寫入寄存器,否則將ALU結(jié)果寫入寄存器 assign shift=i_sll|i_srl|i_sra;/為1時ALUa輸入端使用移位位數(shù) assign aluimm=i_addi|i_muli|i_andi|i_ori|i_xori|i_lw|i_

18、lui|i_sw;/為1時ALUb輸入端使用立即數(shù) assign sext=i_addi|i_muli|i_lw|i_sw|i_beq|i_bne;/為1時符號拓展,否則零拓展 assign aluc4=i_sra;/ALU的控制碼 assign aluc3=i_sub|i_or|i_ori|i_xor|i_xori| i_srl|i_sra|i_beq|i_bne;/ALU的控制碼 assign aluc2=i_sll|i_srl|i_sra|i_lui;/ALU的控制碼 assign aluc1=i_and|i_andi|i_or|i_ori|i_xor|i_xori|i_beq|i_bn

19、e;/ALU的控制碼 assign aluc0=i_mul|i_muli|i_xor|i_xori|i_sll|i_srl|i_sra|i_beq|i_bne;/ALU的控制碼 assign wmem=i_sw & wpc & (exepcsource0=0) & (exepcsource1=0);/為1時寫存儲器,否則不寫 /assign wmem=i_sw & wpcir; /判斷相關性 assign rs1IsReg=i_and | i_andi | i_or | i_ori | i_add | i_addi | i_sub | i_lw | i_sw |

20、 i_sll | i_srl | i_sra; assign rs2IsReg=i_and | i_or | i_add | i_sub | i_sll | i_sra | i_srl; assign exe_a_depen=(rs=exe_rd) & (exe_wreg=1) & (rs1IsReg); assign mem_a_depen=(rs=mem_rd) & (mem_wreg=1) & (rs1IsReg); assign exe_b_depen=(rt=exe_rd) & (exe_wreg=1) & (rs2IsReg) | (

21、rd=exe_rd)&(exe_wreg=1)&(i_sw); assign mem_b_depen=(rt=mem_rd) & (mem_wreg=1) & (rs2IsReg) | (rd=mem_rd)&(mem_wreg=1)&(i_sw); assign idadepend0= (mem_a_depen | 0); assign idadepend1=(mem_a_depen | exe_a_depen | 0) ; /a_depen 和 b_depen 信號全部都需要在暫停流水線時候跟隨檢測 assign idbdepend0=(me

22、m_b_depen | aluimm | 0 ); assign idbdepend1=(mem_b_depen | exe_b_depen | 0 ); /b_depen 00 b 01 imm 10 mem_wb 11 wb_c assign stall =(rs=exe_rd) & exe_m2reg & rs1IsReg ) | (rt=exe_rd) & exe_m2reg & rs2IsReg) | (rd=exe_rd ) & exe_wreg & i_sw) | (rd=mem_rd) & mem_wreg & i

23、_sw); assign wz=wreg; assign wpc = stall; assign pcsource1=i_jr|i_j|i_jal;/選擇下一條指令的地址,00選PC+4,01選轉(zhuǎn)移地址,10選寄存器內(nèi)地址,11選跳轉(zhuǎn)地址 assign pcsource0=i_beq&rsrtequ|i_bne&rsrtequ|i_j|i_jal;endmodule八、 實驗數(shù)據(jù)及結(jié)果分析(一) 畫出修改后的流水線圖(二) 寫出增加的多路選擇器的選擇信號邏輯函數(shù)增加的多路選擇器信號邏輯函數(shù)如下: /加上數(shù)據(jù)前推之后變成四選一的多路器 mux4x32 alu_ina (ea,sa

24、,malu,wmo,exe_a_depend,alua); mux4x32 alu_inb (eb,eimm,malu,wmo,exe_b_depend,alub); mux2x32 save_pc8(ealu0,epc8,ejal,ealu);/選擇最后ALU結(jié)果的來源,ejal為0時是ALU內(nèi)部算出的結(jié)果,為1時是PC+8 assign ern=ern0|5ejal;/當jal指令執(zhí)行時,把返回地址寫入31號寄存器 alu al_unit (alua,alub,ealuc,ealu0,z,wz);/ALU增加的多路選擇器(四選一)的定義如下:module mux4x32(a0,a1,a2,

25、a3,s,y ); input 31:0 a0,a1,a2,a3; input 1:0 s; output 31:0 y; assign y=(s=2'b00)?a0:(s=2'b01)?a1:(s=2'b10)?a2:a3;/四選一endmodule(三)流水線仿真結(jié)果,對仿真結(jié)果作必要說明1. 首先測試無條件跳轉(zhuǎn)jump指令,代碼如下 /測試branch指令(無條件轉(zhuǎn)移) assign rom6'h00=32'h48000002;/ jump,2; 跳轉(zhuǎn)到 add r3,r1,r2 assign rom6'h01=32'h28003c

26、62;/ ori r2,r3,15; assign rom6'h02=32'h00100c22;/ add r3,r1,r2; assign rom6'h03=32'h00100c22;/ add r3,r1,r2; assign rom6'h04=32'h00100c22;/ add r3,r1,r2; assign rom6'h05=32'h00000000;在指令中,第一條指令便是一條無條件跳轉(zhuǎn)指令,要跳轉(zhuǎn)到地址為2 的指令,控制冒險應廢除掉ori指令,即r2不寫入r3|15(15),到了add指令時,alu結(jié)果應為0運行程序,觀察結(jié)果分析一下,在300ns時,計算出ori指令的值為15,但是并沒有寫入寄存器,因為在400ns時alu的值為0,故證明了無條件跳轉(zhuǎn)的控制冒險消除成功。2. 測試條件跳轉(zhuǎn)branch,代碼如下 /測試branch指令的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論