电子科大-系统结构实验-解决数据冒险.docVIP

电子科大-系统结构实验-解决数据冒险.doc

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PAGE1 / NUMPAGES2 . . 实验报告 课程名称:计算机系统结构实验 学  院:计算机科学与工程学院 专  业:计算机科学与技术 指导教师:好老师 学生姓名:爱学习的小学生 2014666666666 实验成绩: 日  期:2017年5月19日 电子科技大学计算机学院实验中心 电 子 科 技 大 学 实 验 报 告 实验项目名称:解决数据冒险 实验室名称:主楼A2-412 实验时间:2017年5月19日 实验目的 在给出的流水线代码基础上,增加内部前推数据通路、暂停流水线数据通路和关闭写使能信号的数据通路,解决普通的数据冒险和load数据冒险,通过完成本次实验,更好地理解和掌握解决数据冒险的原理,学以致用,增强编写程序的能力。 实验原理 数据冒险的定义 由于流水线上指令重叠执行,改变了原来串行执行的读/写操作数顺序,使得后面依赖前面指令结果的指令得不到准备好的数据,这样的现象叫做数据冒险(数据相关)。 回顾数据冒险的程序例子 I1: add r1,r2,r3 I2: sub r4,r1,r5 I3: and r6,r7,r1 I4: or r8,r1,r9 I5: addi r10,r1,100 I1下面有3条指令不能从寄存器r1读出正确的数据。 数据冒险的解决方案 暂停流水线 如上图所示,暂停流水线到最初的指令执行完毕,可以解决数据冒险,但是会涉及到两个问题,即“如何检测出数据冒险”和“如何暂停流水线”。 如何检测数据冒险? a.比较器; I1指令写目的寄存器rd,I2和I3的源操作数是寄存器rs1或rs2中的数据, I2、I3的rs1或rs2与I1的目的寄存器号rd相等时才有可能发生数据冒险。 b.操作码参与检测; 由于指令格式中源寄存器号rs2与立即数部分重叠,而立即数是不会出现冒险的,因此,指令操作码必须要参与检测(区分是寄存器操作数还是立即数)。 c.WREG信号也应参与检测(实际上,WREG也是从操作码中得出的); 如何暂停流水线? 暂停条件判断电路STALL的输入包括OPCODE,ID_rsl,ID_rs2,EXE_rd,EXE_WREG,MEM_rd和MEM_WREG。输出为DEPEN。 封锁本条指令所产生的影响的方法是把DEPEN分别和译码器的输出Decoder_WZ,Decoder_WMEM和Decoder_WREG相与,再送到ID级和EXE级之间的流水线寄存器的输入端。 因为只有这些写信号才改变处理机或存储器的状态,因而我们不必去封锁其它诸如ALUOP或多路器的选择信号。 封锁其后续指令的方法是禁止向IR及PC写入新的数据,即把DEPEN接到IR和PC的写使能端WIR和WPC。当这两个信号为0时,禁止向IR和PC写人数据。 内部前推技术 数据相关本质:一条指令执行时要用到上面指令的计算结果,但这个结果尚未被写入寄存器堆。而实质上,此时结果已经由ALU计算出来了,在流水线寄存器R和C中。 由此,我们可以在ALU的两个数据输入端各加一个多路器,使R和C中的数据能被直接送到ALU的输入端,这就是所谓的内部前推。 以下是检测数据相关的完整信号: EXE_A_DEPEN=(ID_rs1= =EXE_rd)(EXE_WREG= =1)(ID_rs1IsReg) EXE_B_DEPEN=(ID_rs2= =EXE_rd)(EXE_WREG= =1)(ID_rs2IsReg) +(ID_rd= =EXE_rd)(EXE_WREG= =1)(store) MEM_A_DEPEN=(ID_rs1= =MEM_rd)(MEM_WREG= =1)(ID_rs1IsReg) MEM_B_DEPEN=(ID_rs2= =MEM_rd)(MEM_WREG= =1)(ID_rs2IsReg) +(ID_rd= =MEM_rd)(MEM_WREG= =1)(store) ID_rs1IsReg=and+andi+or+ori+add+addi+sub+subi+load+store ID_rs2IsReg=and+or+add+sub (EXE_WREG= =1)表示EXE级的指令确实要更新寄存器,没被取消 (ID_rs1IsReg)条件是为了确认是寄存器,而不是立即数 EXE_rd表示EXE级的流水线目标寄存器rd DEPEN=A_DEPEN + B_DEPEN A_DEPEN=EXE_A_DEPEN + MEM_A_DEPEN B_DEPEN=EXE_B_DEPEN + MEM_B_DEPEN load指令的处理——暂停与内部前推相结合 ALU指令在EXE级结束后,结果就出现在流水线

文档评论(0)

ygxt89 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档