ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:319.68KB ,
资源ID:14268221      下载积分:5 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-14268221.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(电子科大系统结构实验解决控制冒险.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

电子科大系统结构实验解决控制冒险.docx

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

2、一)转移相关问题转移指令改变程序顺序执行的特性。由于是流水线操作,在转移发生之前,若干条转移指令的后续指令已被取到流水线处理机中。这就是所谓的转移相关问题(branch hazard),有时也称之为控制相关问题(control hazard)。回顾我们前面介绍的处理转移相关问题的4种技术:以上任何一种方法都会使硬件固定,编译时会根据硬件机制和转移行为对代码进行调度,以获取最佳性能。(二)消除无条件转移指令的后一条指令影响每条指令在ID时判断在当前在EXE阶段的操作码暂存器的值是否是无条件转移指令:如果是,那么不使能当前在ID阶段的那条指令的WZ、WMEM和WREG的信号,这样这条指令的执行就对

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

4、办法与无条件指令不同。因为条件转移的下一条指令有可能执行也有可能不执行,需要在对无条件转移指令的处理策略上进行扩展:条件转移的下一条指令在ID时判断在当前在EXE阶段的操作码暂存器的值是否是条件转移指令并且判断是否转移成功(Z的值没变),如果发现成功,那么不使能当前在ID阶段的那条指令的WZ、WMEM和WREG的信号,这条指令的执行就对程序的逻辑没有影响(与无条件处理方式相同);如果发现转移不成功,说明本条指令为有效指令,使能当前在ID阶段的那条指令的WZ、WMEM和WREG的信号,本条指令正常执行。五、实验内容在给出的流水线代码基础上,增加ID级关闭写使能信号,以解决不正确分支指令的影响。六

5、、实验器材(设备、元器件)ISE Design Suite 集成开发环境,编程语言:Verilog HDL硬件描述语言七、实验步骤1、新建项目,将上个实验完成的解决数据冒险与数据前推的代码拷贝进来2、在直接跳转中,需要废除跳转指令的下一条(当译码出跳转指令时,下一条已经流出,所以要废除掉);而在条件跳转中,需要根据z的值来判断是否废除下一条指令。在代码中译码级,pcsource定义如下assign pcsource1=i_jr|i_j|i_jal;/选择下一条指令的地址,00选PC+4,01选转移地址,10选寄存器内地址,11选跳转地址assign pcsource0=i_beq&rsrteq

6、u|i_bne&rsrtequ|i_j|i_jal;LOADDEPEN,BTAKEN,ID_branch );如果是直接跳转,那么一定废除,pcsource=11,如果是条件跳转,废除的条件就是pcsource=01,暂不考虑jr指令,那么要废除下一条指令的条件就是pcsource=00;3、在顶层模块添加变量wire wz;/决定是否写z值wire 1:0 exepcsource;/exe pcsource 主要用在条件跳转wz需要在id级计算出来,然后传递到exe级,如果废除指令那么wz=0;exepcsource与之相反,从exe级传递到id级,用来指示下一条指令是否废除。4、增加这两个

7、变量后,顶层模块 id级与exe级的代码如下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,/

8、指令执行EXE ejal,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&rsrtequ|i_bne&rsrtequ|i_j|i_jal,在条件跳转中pcsource0= i_beq&rsrtequ

9、|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 & (exepcsource0=0) & (exepcsource1=0);assign wmem=i_sw & wpc & (exepcsource0=0) & (exepcsource1=0);/为1时写存储器,否则不写assign wz=wregid级cu模块完整代码如下:mo

10、dule pipeidcu(rsrtequ,func, op,wreg,m2reg,wmem,aluc,regrt,aluimm, sext,pcsource,shift,jal, /*数据前推加入的参数*/ 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,exe_m2reg; output 1:0

11、 idadepend,idbdepend; output wpc; /wreg 是否写寄存器 /dm2reg为1时将存储器数据写入寄存器,否则将ALU结果写入寄存器 /dwmem为1时写存储器,否则不写 /daluimm为1时ALUb输入端使用立即数 /dshift为1时ALUa输入端使用移位位数 /djal为1时执行jal指令,否则不是 input rsrtequ; input 5:0 func,op; output wz,wreg,m2reg,wmem,regrt,aluimm,sext,shift,jal; output 4:0 aluc; output 1:0 pcsource; wi

12、re 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,op1,op0,func2,func1,

13、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,op5,op4,op3,op2,op1

14、,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,op2,op1,op0); and(

15、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|i_ori|i_xori|i_lw|i

16、_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 & (exepcsource0=0) & (exepcsource1=0); as

17、sign regrt=i_addi|i_muli|i_andi|i_ori|i_xori|i_lw|i_lui; /regrt为1时目的寄存器是rt,否则为rd assign jal=i_jal; /为1时执行jal指令,否则不是 assign m2reg=i_lw; /为1时将存储器数据写入寄存器,否则将ALU结果写入寄存器 assign shift=i_sll|i_srl|i_sra;/为1时ALUa输入端使用移位位数 assign aluimm=i_addi|i_muli|i_andi|i_ori|i_xori|i_lw|i_lui|i_sw;/为1时ALUb输入端使用立即数 assig

18、n 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_bne;/ALU的控制码 assign aluc0=i_mul|i

19、_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 | i_sll | i_srl | i_sra; assign rs2IsReg=i_and |

20、 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) | (rd=exe_rd)&(exe_wreg=1)&(i_sw); assign mem_b_depen=(rt=mem_rd) & (mem_w

21、reg=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=(mem_b_depen | aluimm | 0 ); assign idbdepend1=(mem_b_depen | exe_b_depen | 0 ); /b_depen 00 b 01

22、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_sw); assign wz=wreg; assign wpc = stall; assign pcsource1=i_jr|i_j|i_jal;/选择下一条指令的地址,00选PC+4,01选转移地址,10选寄存器内地址,11选跳转地址 assign

23、pcsource0=i_beq&rsrtequ|i_bne&rsrtequ|i_j|i_jal;endmodule八、实验数据及结果分析(一)画出修改后的流水线图(二)写出增加的多路选择器的选择信号逻辑函数增加的多路选择器信号逻辑函数如下: /加上数据前推之后变成四选一的多路器 mux4x32 alu_ina (ea,sa,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结果的来源,e

24、jal为0时是ALU内部算出的结果,为1时是PC+8 assign ern=ern0|5ejal;/当jal指令执行时,把返回地址写入31号寄存器 alu al_unit (alua,alub,ealuc,ealu0,z,wz);/ALU增加的多路选择器(四选一)的定义如下:module mux4x32(a0,a1,a2,a3,s,y ); input 31:0 a0,a1,a2,a3; input 1:0 s; output 31:0 y; assign y=(s=2b00)a0:(s=2b01)a1:(s=2b10)a2:a3;/四选一endmodule(三)流水线仿真结果,对仿真结果作必

25、要说明1.首先测试无条件跳转jump指令,代码如下 /测试branch指令(无条件转移) assign rom6h00=32h;/ jump,2; 跳转到 add r3,r1,r2 assign rom6h01=32h28003c62;/ ori r2,r3,15; assign rom6h02=32h00100c22;/ add r3,r1,r2; assign rom6h03=32h00100c22;/ add r3,r1,r2; assign rom6h04=32h00100c22;/ add r3,r1,r2; assign rom6h05=32h00000000;在指令中,第一条指令

26、便是一条无条件跳转指令,要跳转到地址为2 的指令,控制冒险应废除掉ori指令,即r2不写入r3|15(15),到了add指令时,alu结果应为0运行程序,观察结果分析一下,在300ns时,计算出ori指令的值为15,但是并没有写入寄存器,因为在400ns时alu的值为0,故证明了无条件跳转的控制冒险消除成功。2.测试条件跳转branch,代码如下 /测试branch指令的停顿 assign rom6h00=32h;/lui r1,0 0 assign rom6h01=32h3c100422; /beq next(beq r1 r2 1) assign rom6h02=32h;/ori r4,r

27、1,80 80 assign rom6h03=32h00202124;/sub r8,r9,r4 fff assign rom6h04=32h;/addi r5,r0,4 4 assign rom6h05=32h;/store r2,0x0(r4) 80在代码中,可以看到beq判断r1,r2是否相同,因为二者都是0,自然要跳转到下一条语句,也就是sub语句,因此ori指令没有执行,ori指令也正是前面提到要废除的指令,ori中将r4的值设为r1|80(80),如果控制冒险消除正确,r4的值不会发生改变,也就是执行到sub指令时,alu计算出r8的值仍然为0。运行程序,查看测试结果:接下来,进行

28、分析,在第400ns,alu的值为bf800050(80),但是此时因为检测到了控制冒险,因此该值并没有写入r4,这一点从图中在下一个时钟周期(500ns)alu的值为0可以得到验证,因为如果r4写入80,alu的值应为-80,因此,条件转移的控制冒险成功消除。九、总结、改进建议及心得体会(一)总结:经过对代码的改写,包括添加变量、模块参数、修改模块代码、增改连线、反复测试、修改等,成功地通过WZ、WMEM、WREG信号消除了无条件转移语句和条件转移语句的后一条指令的影响,较好的完成了本次实验。(二)改进建议:如果能够有板子可以跑一下,就更有意思了,像之前的计算机组成原理那样,实验的最后一步是下载到板子上运行。(三)心得体会:1、先搞懂原理,画图,再编程2、编写多组指令进行测试,并且注意查看内部寄存器的值,而不仅仅是查看结果。

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2