电子科大系统结构实验解决控制冒险_第1页
电子科大系统结构实验解决控制冒险_第2页
电子科大系统结构实验解决控制冒险_第3页
电子科大系统结构实验解决控制冒险_第4页
电子科大系统结构实验解决控制冒险_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、电3科短北学实验报生口课程名称:计算机系统结构实验学院:计算机科学与工程学院专业:计算机科学与技术指导教师:好老师学生姓名:爱学习的大哥哥2014666666666实验成绩:日期:2017年5月26日电子科技大学计算机学院实验中心电子科技大学实验报告一、实验项目名称:解决控制冒险二、实验室名称:主楼A2-412实验时间:2017年5月26日三、实验目的在给出的流水线代码基础上,增加ID级关闭写使能信号,以解决不正确分支指令的影响。通过完成这次实验,加深对控制冒险现象的产生和消除控制冒险的原理的理解,提高编程和测试的能力。四、实验原理(一)转移相关问题转移指令改变程序顺序执行的特性。由于是流水线

2、操作,在转移发生之前,若干条转移指令的后续指令已被取到流水线处理机中。这就是所谓的转移相关问题(branchhazard,有时也称之为控制相关问题(controlhazard)。回顾我们前面介绍的处理转移相关问题的4种技术:借要消除 L错误指令的执行影响冻结或冲刷流水线假设转移不发生处理每条转移指令都当作未发生转移假设转移发生Treateverybranchastaken延迟转移以上任何一种方法都会使硬件固定,编译时会根据硬件机制和转移行为对代码进行调度,以获取最佳性能。(二)消除无条件转移指令的后一条指令影响每条指令在ID时判断在当前在EXE阶段的操作码暂存器的值是否是无条件转移指令:如果是

3、,那么不使能当前在ID阶段的那条指令的WZ、WMEM和WREG的信号,这样这条指令的执行就对程序的逻辑没有影响。不使能WZ - WMEM 和WREG的方法(三)条件转移指令条件转移指令的实现思想与无条件转移指令有所类似,但不完全相同。首先对于条件转移指令本身来说,需要判断Z标志是否能用。若Z标志还没有准备好,则要暂停流水线一个时钟周期。这一点和判断数据相关极为相似。但由于转移指令只可能改变PC而不改变其它状态,因此用不着封锁WZ,WMEM,WREG(对转移指令来讲,这些信号原本就为0)。因为如果处在译码级的是条件转移指令,而且处在EXE级的是ALU类型的指令(就要写Z标志到流水线寄存器Z了),

4、则要等到ALU指令写完Z后,再判断转移与否,为此要暂停一个周期(或者如前所述,插入一条nop指令)。对于条件转移指令的下一条指令的处理办法与无条件指令不同。因为条件转移的下一条指令有可能执行也有可能不执行,需要在对无条件转移指令的处理策略上进行扩展:条件转移的下一条指令在ID时判断在当前在EXE阶段的操作码暂存器的值是否是条件转移指令并且判断是否转移成功(Z的值没变),如果发现成功,那么不使能当前在ID阶段的那条指令的WZ、WMEM和WREG的信号,这条指令的执行就对程序的逻辑没有影响(与无条件处理方式相同);如果发现转移不成功,说明本条指令为有效指令,使能当前在ID阶段的那条指令的WZ、WM

5、EM和WREG的信号,本条指令正常执行。五、实验内容在给出的流水线代码基础上,增加ID级关闭写使能信号,以解决不正确分支指令的影响。六、实验器材(设备、元器件)ISEDesignSuite14.臻成开发环境,编程语言:VerilogHDL硬件描述语言七、实验步骤1、新建项目,将上个实验完成的解决数据冒险与数据前推的代码拷贝进来2、在直接跳转中,需要废除跳转指令的下一条(当译码出跳转指令时,下一条已经流出,所以要废除掉);而在条件跳转中,需要根据z的值来判断是否废除下一条指令。在代码中译码级,pcsource定义如下assignpcsource1=i_jr|i_j|i_jal;/选择下一条指令的

6、地址,00选PC+4,01选转移地址,10选寄存器内地址,11选跳转地址assignpcsource0=i_beq&rsrtequ|i_bne&rsrtequ|i_j|i_jal;LOADDEPEN,BTAKEN,ID_branch);如果是直接跳转,那么一定废除,pcsource=11,如果是条件跳转,废除的条件就是pcsource=01,暂不考虑jr指令,那么要废除下一条指令的条件就是pcsource=0Q3、在顶层模块添加变量wirewz;/决定是否写z值wire1:0exepcsource;/exepcsource主要用在条件跳转wz需要在id级计算出来,然后传递到ex

7、e级,如果废除指令那么wz=0;exepcsourceW之相反,从exe级传递到id级,用来指示下一条指令是否废除。4、增加这两个变量后,顶层模块id级与exe级的代码如下pipeidid_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);pipeexee

8、xe_stage(wz,ealuc,ealuimm,ea,eb,eimm,eshift,ern0,epc4,/指令执行EXEejal,ern,ealu,z,malu,wmo,exeadepend,exebdepend);5、力口入exepcsource,根据步骤2的分析,如果pcsource=00,就废除掉下一条指令,即wreg>wmem>wz全部置0,这里需要注意的是,wz的值有多种表示方法,由于wz只在控制冒险中使用,并且在控制冒险中wreg=wmem=wz,所以这里可以直接将wreg的值赋给wz,也可以wz=exepcsource0(pcsource0=i_beq&r

9、srtequ|i_bne&rsrtequ|i_j|i_jal,在条件跳转中pcsource0=i_beq&rsrtequ|i_bnassignwreg=(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);assignwmem=i_sw&wpc&(exepcso

10、urce0=0)&(exepcsource1=0);/为1时写存储器,否则不写assignwz=wregid级cu模块完整代码如下:modulepipeidcu(rsrtequ,func,op,wreg,m2reg,wmemaluc,regrt,aluimmsext,pcsource,shift,jal,/*数据前推加入的参数*/exe_rd,mem_rd,exe_wreg,mem_wreg,idadepend,idbdepend,rs,rt,rd,exe_m2reg,wpc,exepcsource,wz);input1:0exepcsource;input4:0exe_rd,mem_

11、rd,rs,rt,rdinputexe_wreg,mem_wreg,exe_m2reg;output1:0idadepend,idbdepend;outputwpc;/wreg是否写寄存器ALU结果写入寄存器/dm2reg为1时将存储器数据写入寄存器,否则将/dwmem为1时写存储器,否则不写/daluimm为1时ALUb输入端使用立即数/dshift为1时ALUa输入端使用移位位数/djal为1时执行jal指令,否则不是inputrsrtequ;input5:0func,op;outputwz,wreg,m2reg,wmemregrt,aluimm,sext,shift,jal;output

12、4:0aluc;output1:0pcsource;wirei_add,i_sub,i_mul,i_and,i_or,i_xor,i_sll,i_srl,i_sra,i_jr;/对指令进行译码wirei_addi , i_muli , i_andi , i_ori , i_xori , i_lwand ( i_add,op 5,op 4,op 3,op 2,and ( i_sub,op 5,op 4,op 3,op 2,and ( i_mul,op 5,op 4,op 3,op 2,and ( i_and,op 5,op 4,op 3,op 2,i_sw , i_beq , i_bne , i

13、_lui , i_j , i_jal ;op 1 ,op 0,func2,func1 , func 0);op 1 ,op 0,func2,func1, func 0);op 1 ,op 0,func2,func1, func 0);op 1, op 0, func 2,func1, func 0);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,func

14、1,func0);and(i_srl,op5,op4,op3,op2,op1,op0,func2,func1,func0);and(i_sll,op5,op4,op3,op2,op1,op0,func2,func1,func0);and(i_jr,op5,op4,op3,op2,op1,op0,func2,func1,func0);andaddiandirtmuliop5,op5,op4,op3,op2,op1,op0);op4,op3,op2,op1,op0);andandandandandandandandandandwireandiorixoriIwsw_beqbnelui_j,_jal

15、irsiandiwireop5,,op5,,op5,op4,op3,op4,op3,op2,op1,op0);op2,op1,op4,op3,op2,op1,op0);op0);,op5,op4,op3,op2,op1,op0);,op5,op4,op3,op2,op1,op0);,op5,op4,op3,op2,op1,op0);,op5,op4,op3,op2,op1,op0);,op5,op4,op3,op2,op1,op0);op5,op4,op3,op2,op1,op0);,op5,op4,op3,op2,op1,=i_add|i_sub|i_mul|i_and|i_or|i_xor

16、|i_ori|i_xori|i_lw|i_sw|i_beqop0);|i_jr|i_addi|i_muli|i_bne;=i_add|i_sub|i_mul|i_and|i_or/|i_xor|i_sra|i_srl|i_sll|i_sw|i_beq控制信号的生成|i_bne;/assignwreg=(寄存器堆中某存器,i_add|i_sub否则不写|i_mul|i_and|i_or|i_xor|i_sll|/wreg为1时写isrlilwi_sra|i_luiiaddi|i_jal|i_muli)&wpci_andi|i_ori|i_xori&(exepcsource0=0)

17、(exepcsourceassign的寄存器是rtassign不是1=0);regrt=i_addi,否则为rdjal=i_jal;|i_muli|i_andi|i_ori|i_xori|i_lwilui/regrt为1时目assignm2reg=i_lw/为时将存储器数据写入寄存器,否则将/为1时执行jalALU结果写入寄存器指令,否则assignassignshift=isllaluimm=iaddi输入端使用立即数assignassignassign的控制码sextalucaluc=iaddi4=i_sra3=i_subisrl|i_muliimulii_sra;/为1时ALUa输入端使

18、用移位位数|i_andi|i_ori|i_xori|i_lw|i_lui|i_sw;/为1时ALUb;/ALU|i_or|i_lw|i_sw|i_beq|i_bne的控制码;为1时符号拓展,否则零拓展i_ori|i_xorixorisrl|i_sra|i_beqi_bne;/ALUassignassign码alucaluc2=i_sll1=i_andisrliandiassignaluc0=i_mul|muli|i_xor|i_xorii_sra|i_or|i_slliluiiori|i_srl/ALUixor的控制码|i_xori|i_beq|i_sra|i_beq|i_bneassignw

19、mem=i_sw&wpc&(exepcsource0=0)&(exepcsource写存储器,否则不写ibne;/ALU1=/ALU的控制的控制码0);/为1时|/assignwmem=i_sw&wpcir;i_or|i_ori|i_addadd|i_sub|i_sll)&(exe_wreg=1)&)&(mem_wreg=1)&)&(exe_wreg=1)&|i_addiIi_sra(rs1IsReg(rs1IsReg(rs2IsReg|i_subIi_srl;););)IIi_lw/判断相关性assignrs1I

20、sReg=i_and|i_andi|i_sw|i_sll|i_srl|i_sra;assignrs2IsReg=i_and|i_or|i_assignexe_a_depen=(rs=exe_rdassignmem_a_depen=(rs=mem_rdassignexe_b_depen=(rt=exe_rd(rd=exe_rd)&(exe_wreg=1)&(i_sw);assignmem_b_depen=(rt=mem_rd)&(mem_wreg=1)&rd=mem_rd)&(mem_wreg=1)&(i_sw);assignidadepend0=

21、(mem_a_depen|0);assignidadepend1=(mem_a_depen|exe_a_depen|0)/a_depen和b_depen信号全部都需要在暂停流水线时候跟随检测assignidbdepend0=(mem_b_depen|aluimm|0);assignidbdepend1=(mem_b_depen|exe_b_depen|0)/b_depen00b01imm10mem_wb11wb_cassignstall=(rs=exe_rd)&exe_m2reg&rs1IsReg)(rt=exe_rd)&exe_m2reg&rs2IsReg)|

22、(rd=exe_rd)&exe_wreg&i_sw)|(rd=mem_rd)&mem_wreg&i_sw);assignwz=wreg;assignwpc=stall;(rs2IsReg;I)Iassignpcsource1=i_jr|i_j|i_jal10选寄存器内地址,11选跳转地址assignpcsource0=i_beq&rsrtequendmodule;/选择下一条指令的地址,|i_bne&rsrtequ|i_j|00选PC+4,01i_jal;选转移地址,八、实验数据及结果分析(一)画出修改后的流水线图(二)写出增加的多路选择器的选择

23、信号逻辑函数增加的多路选择器信号逻辑函数如下:/加上数据前推之后变成四选一的多路器mux4x32alu_ina(ea,sa,malu,wmo,exe_a_depend,alua);mux4x32alu_inb(eb,eimm,malu,wmo,exe_b_depend,alub);mux2x32save_pc8(ealuO,epc8,ejal,ealu);/选择最后ALU结果的来源,ejal为0时是ALU内部算出的结果,为1时是PC+8assignern=ern0|5ejal;/当jal指令执行时,把返回地址写入31号寄存器alual_unit(alua,alub,ealuc,ealu0,z,

24、wz);/ALU增加的多路选择器(四选一)的定义如下:modulemux4x32(a0,a1,a2,a3,s,y);input31:0a0,a1,a2,a3;input1:0s;output31:0y;assigny=(s=2'b00)?a0:(s=2'b01)?a1:(s=2'b10)?a2:a3;/四选一endmodule(三)流水线仿真结果,对仿真结果作必要说明1 .首先测试无条件跳转jump指令,代码如下/测试branch指令(无条件转移)assignrom6'h00=32'h48000002;/jump,2;跳转到addr3,r1,r2assi

25、gnrom6'h01=32'h28003c62;/orir2,r3,15;assignrom6'h02=32'h00100c22;/addr3,r1,r2;assignrom6'h03=32'h00100c22;/addr3,r1,r2;assignrom6'h04=32'h00100c22;/addr3,r1,r2;assignrom6'h05=32'h00000000;在指令中,第一条指令便是一条无条件跳转指令,要跳转到地址为2的指令,控制冒险应废除掉ori指令,即r2不写入r3|15(15),到了add指令时,alu结果应为0运行程序,观察结果分析一下,在300ns时,计算出ori指令的值为15,但是并没有写入寄存器,因为在400ns时alu的值为0,故证明了无条件跳转的控制冒险消除成功2 .测试条件跳转branch,代码如下/测试branch指令的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论