流水线的艺术
6.1 介绍
对于ASIC,可以通过流水线提高吞吐量,但是也会带来系统延时和面积的增加。流水线通过在较长的组合逻辑中插入寄存器降低组合逻辑的延迟,来提高时钟频率并提高性能。
组合路径延迟为X个时间单位,在下图中通过插入三个寄存器被分割为多个小块,寄存器间的延迟为Y个时间单位,Y<X ;加入寄存器时钟频率明显增加,但是同时也增加额外的开销,并且增加了系统的延迟。
6.2 影响最大时钟频率的因素
时钟频率是数据流入系统后在输出端出现的速率。下图是两级流水线的理想情况。
对于没有任何抖动的理想时钟,时钟信号同时到达两个寄存器块,假设寄存器A时钟到输出的延迟 (Tcqa)为0,器B数据建立保持时间(分别为 Tsb和 Thb)为0,最大时钟频率Fmax是通过组合逻辑路径延迟的倒数,即:
Fmax = 1/Tpeiod =1/Tcomb
6.2.1 时钟偏移
在实际电路中,由于存在线路上的传播延迟,寄存器B的时钟输入相对于寄存器A可能会有一些延迟,这种现象称为“时钟偏移”,在相邻两个寄存器的时钟延迟大于这两个寄存器之间的数据路径延迟,就会产生负时钟偏移。这种情况下,先到的时钟会引起竞争条件(即数据还未成功锁存,时钟就触发了寄存器)。
6.2.2 时钟抖动
到达电路中某一点的连续时钟边沿之间间隔的变化称为时钟抖动。时钟抖动会影响时钟的占空比。
计算寄存器“bf”到输出“o”之间精确的组合延迟。
上面等式中的组合延迟部分可以通过添加多个触发器来减少,因此增加了电路操作的最大频率。这种减少流水线各阶段组合延迟的方法能显著提升电路的吞吐率
6.3 流水线
流水线使用存储器件将时钟周期内关键路径(最大组合延迟的路径)分割开来。减小了关键路径上各阶段延迟并使电路以更高频率工作。但是使用并行电路进行同样的k次操作,比重复使用某一逻辑k次在面积和功耗方面的开支更大,因为使用了更多的触发器和额外逻辑,导致了更多的连线。
6.4 来自于流水线的性能提高
流水线的延迟是从数据进入流水线的输入端到这些数据经过处理后从流水线的输出端输出所耗的时间。
Tlatency = Tcomb + Tregister +Tclk
Tregister(寄存器开支) = Tcq + Tstep
Tclk(时钟开支) = Tskw + Tjit
插入流水线后,延时最大的流水器阶段决定时钟周期:
Tpipeline=max{Tcomb} + Tregister +Tclk
而最终系统的延迟:
T=n*Tpipeline =Tcomb+n(Tregister + Tclk)
注意:在使用流水线会引入额外的开销,如时钟偏移和寄存器延迟,限制了流水线所能达到的加速值
6.5 DLX 指令集的实现
DLX是新兴学院派指标结构的理论32位RISC微处理器,每条DLX指令最多由5部分组成。
指令获取(Instruction Fetch,IF)、指令解码 (Instruction DecodeID)、执行/有效地址周期 (Execution/Effective Address Cycle,EX)、存储器访问 (Memory Access,MEM),和写回操作 (Write Back,WB)。
每个DLX 指令最多用5个时钟周期完成。这5个时钟周期为:
1. 指令获取(IF)
IR < = MEM[PC]
NPC < =PC+4
操作:
1、从存储器获取指令(用PC指针)并放入指令寄存器(IR)。
2、IR保存下个时钟周期所需指令。
3、PC值递增4,指向下一个指令地址。
2. 指令解码/寄存器获取(ID)
A<=Reg[IR6...10]
B<=Reg[IR11...15]
IMM<={[IR16]16IR16...31}
操作:
1、分析IR中的指令并访问寄存器堆以读取寄存器
2、将通用寄存器的输出读入两个临时寄存器A和B
3、IR的高16位经过符号扩展保存到临时寄存器IMM中供以后使用
4、由于指令格式是固定的,因此读寄存器和解码可以并行进行,称固定域译码。
3. 执行/有效地址周期(EX)
ALU对上一个时钟周期准备好的操作数进行操作,根据DLX指令的类型进行下面一个功能的一个:
- 访问存储器
操作:ALU通过加法形成有效地址,并将结果放入寄存器ALUoutput中 - 寄存器——寄存器ALU指令
操作:根据操作码对寄存器A和B的数值进行操作,把结果放在临时寄存器ALUoutput中 - 寄存器——立即数ALU指令
操作:根据操作码对寄存器A和IMM的数值进行操作,把结果放在临时寄存器ALUoutput中 - 分支指令
操作:ALU计算出分支的目标地址,检查寄存器A的值来决定是否进行分支
4. 访问存储器/分支完成周期(MEM)
- load:从存储器中返回的数值存入LMD寄存器中
- store:将寄存器B写入存储器
5. 写回周期(WB)
- 寄存器-寄存器ALU指令
- 寄存器-立即数周期
- 取指令
操作:将结果写回寄存器堆中,结果可能来自存储器或者ALU
6.6 流水线对吞吐量的影响
注意: 引入流水线时会引入额外的开销,如时钟偏移和寄存器延迟。
6.7 流水线冒险
(1)结构冒险:由于资源冲突而使硬件无法支持所有的指令组合同时执行
(2)数据冒险:指令执行需要之前指令的计算结果,而这个结果在流水线还没有计算出来
(3)控制冒险:分支的流水线和其他指令改变程序计数器的值
(4)存储器的冒险
通用方法:停止流水线直至风险消除,在流水线中插入多个“气泡”。