一些好玩的流水线设计理念 /延迟槽

记录一些好玩的CPU流水线设计

这里是针对单发射5级流水线:

转移延迟槽

跳转指令有很多,

J指令,jar,beq,bnq指令,都是跳转指令。

指令分析

下面对其气泡性进行分析。以5级流水线为例

首先你要明白一个道理,就是这些指令都是什么时候出结果,比如beq指令是在执行后才知道满不满足条件,所以就会出现两个气泡[两个时钟周期的流水线停顿]。

如果是J指令,无条件跳转指令,其并不会产生影响,因为你J指令是可以在一个时钟周期内完成的,在取指阶段判断是j指令,在完成对其目标地址的获取,下一个时钟周期就能跳转到其所需的位置,不会产生影响。

无条件间接转移指令:

这个就不像J指令,J指令你还可以说取值阶段一次性算好,但jr rs 指令,是需要访寄存器的,访问寄存器是需要在译码阶段完成,然后再到执行周期才能将目标地址送到PC寄存器中,再到下一个时钟周期送到 指令存储器。

所以最快你需要在译码阶段获得转移目标地址。会有一个时钟周期停顿的可能。

beq指令就不用说了,比较两个rs rt的值,相等/不等 这个需要等到执行后才知道,所以会有两个时钟周期停顿的可能。

但可以优化一下,就是说,在译码阶段让它算算得了,这也没必要用ALU,这样的话,就只需要停顿一个时钟周期了。

延迟槽

那么这个时钟周期应该如何消去呢?

常见的思维方式有两种:继续优化/另辟蹊径。

继续优化:再看看能不能提前一个阶段完成相应的计算,比如在译码阶段完成计算,不过显然不太可能,一个时钟周期,只能完成译码的工作,容不下比较了。

另辟蹊径:即能不能再安插那么一条指令,让它运行在这个气泡/时钟周期里。

这就是延迟转移技术了。

你看 beq指令相关的也就两个寄存器,那么和这两个寄存器不相关的指令,是不是可以从上面移到这个气泡里来运行呢?这样这个空间就十分有效的利用起来了

经验分享 程序员 微信小程序 职场和发展