目录
前言
昨天复(yu)习了单周期的 mips 流水线数据通路,知晓了硬件结构如何通过一系列的控制信号,完成不同指令的区别处理。
然而单周期的数据通路是一种理想化的情况,因为整个指令执行的过程,占用了全部的硬件。事实上,为了效率,流水化的硬件结构在同一时刻最多被 5 个指令分享(对应 mips 的 5 个阶段),这就带来了数据一致性的问题。
流水化的数据通路通过中间缓存的方式,避免了数据冲突,并且巧妙地将 5 个阶段的硬件使用,按照逻辑分隔,真正实现了流水化执行指令。
墙裂推荐先阅读:

流水线思想
从逻辑上将一条指令分为 5 个阶段,分别是:
- 取指令(IF)
- 译码(ID)
- 执行(EX)
- 内存访问(MEM)
- 写回(WB)
因为任何一条指令都需要 5 个步骤,于是从硬件层面可以划分出 5 个不同的阶段。
按照这种方式划分,只要某个部件完成了它的工作,马上就可以执行下一条指令的对应部分,这使得流水化得以实现,大大提高效率:
注:用的是我 之前博客 的图,以洗衣服为例(懒得画新图了
加速比
如上图,假设流水线各个级所花费的时间一致(假设都为 1 个时钟周期),并且没有什么冒险的情况(理想化),那么:
- 串行执行 n 条指令,需要 5n 个周期
- 流水化执行 n 条指令,需要 n+2 个周期(看上文的图就懂了为啥+2)
- 加速比为 5n÷(n+2)=5
如果每个指令花费的时间不等,并且指令序列不是无限长,那么加速比会进一步下降。(因为吞吐率减少,同时不能忽略+2)
流水化的数据通路
流水化意味着每个部件独立,可是事与愿违。同一条指令,下一个阶段的部件总需要依赖上一个部件的结果。
以 ID 和 EX 阶段为例,EX 阶段需要 ID 阶段给出的控制信号和寄存器数据,才能放进 ALU 中进行运算。
举个例子:流水化执行指令1,2。目前执行到指令 1 的 EX 阶段了,需要指令 1 ID 阶段的数据。但是因为只有一套硬件,此时 ID 部件已经填充了指令 2 的数据,再进行存取就会出错: