转移指令的实现
一、延迟槽的定义及说明
在之前设计流水线的时候,存在三种相关,分别为数据相关、结构相关、控制相关。其
中控制相关是指流水线中的转移指令或者其他需要改写 PC 的指令造成的相关。这些指令改
写了 PC 值,所以导致后面进入流水线的几条指令无效。比如:如果转移指令在流水线的执
行阶段进行条件转移条件判断,在发生转移时,会导致当前处于取指、译码阶段的指令无效,
需要重新取指。
如图:
尽管转移指令后面的指令确实不需要执行,但是这样却白白浪费了两个时钟周期,当转
移指令很多的时候,会大大影响流水线性能。
因此我们引入延迟槽概念,规定转移指令后面的指令位置为“延迟槽”,延迟槽中的指
令被称为“延迟槽指令”。该指令总是被执行,与是否被转移没有关系。引入延迟槽后的指
令执行顺序如下图:
但是我们又发现一个问题,因为是在执行阶段开始判断转移,因此前面有两个阶段的指
令已经被读取,使用延迟槽仍然会使得已经进入取指阶段的指令无效,也就是仍然浪费一个
时钟周期。因此我们计划在译码阶段进行转移判断。
那为什么不能用两个延迟槽呢?还有延迟槽的作用到底是什么呢?(我的疑问)