流水线
通过在组合逻辑后加入流水线寄存器实现流水线,有了流水线能在一个时钟周期中发射一条指令并完成一条指令
流水线的断流叫做流水线冒险主要有1)数据冒险2)控制冒险
数据冒险
数据冒险是指下一条流水线用到上一条指令写入的数据,也就是写后读。
处理方法
- 用暂停来避免数据冒险
- 用转发来避免数据冒险:不写入寄存器,直接将结果作为下一条指令的输入
控制冒险
例如ret返回指令和call跳转指令会是流水线产生控制冒险
处理方法
- 暂停避免
在第3个周期执行ret的时候我们在DEM三个阶段插入三个bubble空指令,一旦ret执行到写入阶段,我们就知道了下一条指令的PC地址,我们开始正常执行下一条指令流水行(在第7个周期)
一般情况下,我们都是执行条件分支,当条件分支是错误的时候,在周期4发现预测错误之前,已经取出了两条指令,此时,跳转指令正在通过执行阶段。在周期5中,流水线往译码和执行阶段中插入气泡,取消了两条预测分支指令,同时去除跳转后面的那条指令