1. 概念
所谓流水线设计,实际上是把规模较大,层次较多的组合逻辑电路分为几个级,在每一级插入寄存器组并暂存中间数据。
2. 特点
流水线处理时提高组合逻辑设计的处理速度和吞吐量的最常用手段。
-
某个组合逻辑设计的处理流程可以分为若干步骤
-
整个数据处理过程是“单向流”,即没有反馈或者迭代运算,前一个步骤的输出是下一个步骤的输入,则可以考虑采用流水线设计方法提高系统的数据处理频率,即吞吐量。
3. 注意事项
流水线设计的关键在于,整个设计时序必须安排合理。要求操作步骤划分合理。前级操作时间最好与后级的操作时间比较接近,在这种情况下,前级的输出可以直接作为后级的输入。如果前级的操作时间小于后级的操作时间,而实际的吞吐量要求很高,则必须通过复制逻辑,将数据分流,或者在前级对数据采用存储,后处理方式,否则会造成后级数据溢出。
流水线的优点:可以缩短时钟的周期并提高吞吐能力。而流水线的缺点在于:
(1)产生了输入-输出延迟:由于插入了流水线寄存器,会导致第一个输出必须在K个clk之后才能得到。而之后每个clk都能得到一个输出。 (2)流水线技术是用空间(硬件)的复杂度来换取时间(性能)的复杂度。由上述分析可知,电路中插入了流水线计数器,必然会导致电路的面积增大。 所以:流水线深度并不是越大越好。在提高电路速度和吞吐的同时,电路的面积也随之加大。所以必须根据具体的需求来对流水深度进行择优选择。
4. 流水线冒险
- 结构冒险
定义 :因缺乏硬件支持而导致指令不能在预定的时钟周期内执行的情况。即硬件不支持多条指令在同一时钟周期执行。
解决方法:①不同的存储器进行操作,分为指令存储器和数据存储器。②让流水线发生停顿,即产生空泡(Bubble或Stall)。
- 数据冒险
定义:无法提供指令所需数据而导致指令不能在预定的时钟周期内执行的情况。即一条指令的执行需要等待另一条指令执行完成后所产生的数据。
解决方法:①前推(Forwarding):也叫旁路,是从内部寄存器而非程序员可见的寄存器或存储器中提前取出数据。(前推是根据顺序所起的名字,旁路是根据结构所起的名字)。②插入空泡。
- 控制冒险
定义:也叫分支冒险,决策依赖于一条指令的结果,而其他指令正在执行中。比如说分支跳转指令,必须等ALU给出结果后才知道该跳转到哪一条语句。通常由于程序计数器PC的值发生变化导致的。
解决方法:需要通过动态分支预测指令进行解决。
5. 提高流水线效率的方法
参考链接