第五章逻辑、移位操作与空指令的实现

上一章建立了原始的OpenMIPS五级流水线结构,但是只实现了一条ori指令,从本章开始,将逐步完善。本章首先讨论了流水线数据相关问题,然后修改OpenMIPS以解决问题。接着对逻辑、移位操作和空指令的指令格式、用法进行了一一说明。

5.1流水线数据相关问题

流水线中经常有一些被称为“相关”的情况发生,它使得指令序列中下一条指令无法按照设计周期执行,这些“相关”会降低流水线的性能,流水线中的相关分为以下三种类型。
  • 结构相关:在指令执行过程中,由于硬件资源满足不了指令执行的要求,发生硬件资源冲突而产生的相关。比如:指令和数据都共享一个存储器,,在某个时钟周期,流水线既要完成某条指令对存储器的数据的访问操作,又要完成后续的取指令操作,这样就会发生存储器访问冲突,产生结构相关。
  • 数据相关:指的是在流水线中执行的几条指令中,一条指令依赖于前面的指令的执行结果
  • 控制相关:流水线中的分支指令或者其他需要改写PC的指令造成的相关。
本章重点讨论数据相关的问题。流水线数据相关又分为三种情况:RAW、WAR、WAW.
  • RAW:即Read After Write,假设指令j是在指令i后面执行的指令,RAW表示指令i将数据写入寄存器后,指令j才能从这个寄存器读取数据。如果指令j在指令i写入寄存器前尝试读出该寄存器的内容,得到不正确的数据。
  • WAR:即Write After Read,假设指令j是在指令i后面指令的指令,WAR表示指令i读出数据后,指令j才能写这个寄存器。如果指令j在指令i读取数据前就写入该寄存器,将使得指令i读出的数据不正确。
  • WAW:即Write After Write,假设指令j是在指令i后面执行的指令,WAW表示指令i将数据写入寄存器后,指令j才能将数据写入这个寄存器。如果指令j在治疗i之前写入该寄存器,将使得该寄存器的值不是最新值。

从ori指令的实现过程可以知道,只有在流水线的回写阶段才会写寄存器(实际上,其他指令也是一样的,在后面实现其余指令时,会更清楚),因此不存在WAW相关,又因为只能在流水线译码阶段读寄存器、回写阶段写寄存器,不存在WAR相关,所以在OpenMIPS流水线只存在RAW相关。RAW相关有三种情况。

  • 相邻指令间存在数据相关
    考虑如下代码
    在这里插入图片描述奥,对啦还记得ori(上面的图片上是啥意思吗),是把$0和0x1100(零扩展后)执行逻辑“或”运算。存在寄存器$1内哦,要记得温故而知新~~

第一条ori指令将会写寄存器$1,随后的第2条ori指令需要读出$1的数据,但是第1条ori指令在回写阶段才会将其运算结果写入$1,而第二条ori指令在译码阶段就要读取$1的值,此时第一条ori指令还处于执行阶段,所以得到的必然不是第一条ori指令计算得出的结果,这种被称为相邻指令间存在数据相关,也可称为流水线译码、执行阶段存在数据相关。
在这里插入图片描述

  • 相隔1条指令间存在数据相关
    考虑如下代码
    在这里插入图片描述
    第一条ori指令将写寄存器$1,第三条ori指令在译码阶段需要读取寄存器$1,此时第一条ori指令还在访存阶段,所

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值