1、流水线的工作原理
典型的流水线设计是将原本一个时钟周期完成的较大的组合逻辑通过合理的切割后分由多个时钟周期来完成,这样一来该部分逻辑运行的时钟频率就会有明显的提升,尤其是当为关键路径时,采用流水线设计后整个系统的性能会得到提升。
原因在于缩短了关键路径的长度。(结合Tsu和Thold那个计算公式来理解,减少了关键路径就减少了Tdelay的大小。)
2、经典的五级流水线
图片来源于:https://www.rvmcu.com/campus.html中的大学计划中的课程资源PPT
经典的五级流水线就是由取值、译码、执行、写回、访存这五个步骤构成的。
3、流水线深度是否越深越好?
流水线的不同深度都有优缺点,需要根据不同的应用场景进行合理的选择。如果追求性能,级数可以多一点;如果追求面积和功耗,那么级数可以少一点。
流水线加深的正面意义:流水线的级数越多,意味着流水线被切割得越细,每一级流水线内容容纳的硬件逻辑便越少。在两级寄出器之间的硬件逻辑越少,则意味着能够运行到更高的主频(可参考时钟最高时钟频率的计算)。因此现代处理器流水线深度极深主要是由于处理器追求高频的指标所驱使的。主频越高,也意味着流水线的吞吐率越高,从而性能越高,这是流水线深度加深的正面意义。(eg:高端的Cortex-A系列由于有十几级的流水线,所以能够运行到高达2GHZ的主频,Intel的x86处理器甚至采用几十级的流水线深度将主频推到3-4GHz的高度)
流水线的负面意义:(1)由于每一级流水线都由寄存器组成,更多的流水线级数要消耗更多的寄存器,以及更多的面积开销。
(2)由于每一级流水线都需要进行握手,流水线最后一级的反压信号可能会一直串扰到最前一级造成严重的时序问题,都需要使用一些比较高级的技巧来解决这类反压时序问题。
(3)流水线冲刷pipeline Flush:由于流水线的取指令阶段无法得知条件跳转的结果是到底跳还是不跳,因此只能进行预测,而到了流水线末端才能够通过实际的运算得知该分支真的该跳还是不该跳。如果发现真实的结果与之前预测的结果不相符,则意味着预测失败,需要将所有预期的错误指令全部丢掉。重新取正确的指令流,这个过程叫做流水线冲刷。虽然可以使用分支预测器来保证前期的分支预测尽可能准确,但是也没办法做到万无一失。流水线越深,则意味着已经预取了更多的错误指令流,则意味着浪费和损失越严重。
4、流水线和状态机的关系
处理器就一定需要流水线吗?
答案是不一定,比如8051内核(8位单片机)微架构采用的是类似于状态机的方式而不是流水线。从功能上来讲处理器完全可以不要流水线,而使用状态机的方式来实现,只不过这种方法的性能比较差,在现代处理器设计中比较罕见。
分析:
流水线的本质:
(1)流水线并不局限于处理器的设计中,在ASIC电路实现中都广泛采用流水线思想。流水线本质上可以理解为一直以面积换性能,以空间换时间的手段。以五级流水线为例,其增加了5组寄存器,每一个流水线级数内部都有各自的组合逻辑数据通路,彼此之间没有复用资源,因此其面积开销比较大。但是不同的流水级数同时可以做不同的事情,而达到流水的效果,优化了时序,提高了性能,增加了吞吐率。
(2)与流水线相对应的另一种策略是状态机,状态机的“取反”就是流水线,同样在所有的ASIC电路中都有着广泛的应用。状态机本质上可以理解为以性能换面积、以时间换空间。
(3)流水线和状态机的关系,还有一种说法称为“展开”和“折叠”。
状态机和流水线本质上都是一种在电路设计时在性能和面积上的一种取舍。假设不采用流水线,而采用状态机来完成,那么完成一条指令的所有操作需要多个时钟周期,每个时钟周期完成状态机的一个状态(状态分别为取指、译码、执行、访存、写回)。通过使用状态机可以节约流水线中的寄存器开销,还可以复用组合逻辑数据通路,因此面积开销比较小。但是每条指令需要5个周期才能完成,吞吐率和性能很差。
5、流水线中的反压
(1)取消握手
(2)加入乒乓缓存
(3)加入前向旁路缓存