硬件架构的艺术(六)

流水线可以增加电路每个时钟周期的计算吞吐率,但是也会带来系统延迟和面积的增加。(流水线通过在较长的组合逻辑中插入寄存器降低组合逻辑的延迟,来提高时钟频率并提高性能)
在这里插入图片描述
组合路径延迟为X个时间单位,在下图中通过插入三个寄存器被分割为多个小块,寄存器间的延迟为Y个时间单位,Y<X ;加入寄存器时钟频率明显增加,但是同时也增加额外的开销,并且增加了系统的延迟。
在这里插入图片描述
(一)影响最大时钟频率的因素:
流水线的理想路径
在这里插入图片描述
Tcomb:寄存器A和B间的组合延迟
Ts:寄存器的建立时间
Th:寄存器的保持时间
Tcqa:寄存器的时钟输出延迟

最大时钟频率通过组合逻辑的最大路径延迟的倒数:Fmax=1/Tcomb
(1)时钟偏移
在实际电路中,由于存在线路上的传播延迟,寄存器B的时钟输入相对于寄存器A可能会有一些延迟,这种现象称为“时钟偏移”,在相邻两个寄存器的时钟延迟大于这两个寄存器之间的数据路径延迟,就会产生负时钟偏移。这种情况下,先到的时钟会引起竞争条件(即数据还未成功锁存,时钟就触发了寄存器)
(2)时钟抖动
到达电路中某一点的连续时钟边沿之间间隔的变化称为时钟抖动
在这里插入图片描述
流水线真实路径
在这里插入图片描述
从寄存器bf到输出o之间精确的组合延迟:
{Tff}]max = {Tcq + Tcomb +Tset + Tskw +Tjit }max

在这里插入图片描述
Tcq:寄存器“bf”的时钟输出延迟
Tcomb:组合逻辑的延迟
Tset :触发器的建立时间
Tskw +Tjit :时钟偏移和时钟抖动对组合延迟的总贡献
组合延迟部分可以通过添加多个触发器来减小,来增大电路的最大频率。
流水线使用存储器件将时钟周期内关键路径(最大组合延迟的路径)分割开来。减小了关键路径上各阶段延迟并使电路以更高频率工作。但是使用并行电路进行同样的k次操作,比重复使用某一逻辑k次在面积和功耗方面的开支更大,因为使用了更多的触发器和额外逻辑,导致了更多的连线。

(二)流水线
正如前文,对于非流水线电路
在这里插入图片描述
Tstage = max{Tcomb} + Tregister +Tclk
Tregister = Tcq + Tstep
Tclk = Tskw + Tjit
所以对于任意流水线阶段,最小可能的时钟周期为:
Tpipeline=Tcomb/n + Tregister +Tclk;
而最终系统的延迟:
T=n*Tpipeline =Tcomb+n(Tregister + Tclk)
注意:在使用流水线会引入额外的开销,如时钟偏移和寄存器延迟,限制了流水线所能达到的加速值

(三)DLX指令集的实现
每条DLX指令最多由5个部分组成:
(1)指令获取(Instruction Fetch,IF)

IR<= MEM[PC]
NPC<= PC +4

操作:
1、从存储器获取指令并放入指令寄存器(IR)
2、IR保存下个时钟周期所需指令
3、PC值递增4,指向下一个指令地址

(2)指令解码(Instruction Decode,ID)

A<=Reg[IR6...10]
B<=Reg[IR11...15]
IMM<={[IR16]16IR16...31}

操作:
1、分析IR中的指令并访问寄存器堆以读取寄存器
2、将通用寄存器的输出读入两个临时寄存器A和B
3、IR的高16位经过符号扩展保存到临时寄存器IMM中供以后使用

(3)执行/有效地址周期(Execution)
a)访问存储器

ALUoutput <= A +IMM

操作:ALU通过加法形成有效地址,并将结果放入寄存器ALUoutput中
b)寄存器-寄存器ALU指令

ALUoutput <= A op B

操作:根据操作码对寄存器A和B的数值进行操作,把结果放在临时寄存器ALUoutput中
c)寄存器-立即数ALU指令

ALUoutput<= A op IMM

操作:根据操作码对寄存器A和IMM的数值进行操作,把结果放在临时寄存器ALUoutput中
d) 分支指令

ALUoutput <=NPC +IMM
Cond <= (A OP 0)

操作:ALU计算出分支的目标地址,检查寄存器A的值来决定是否进行分支
(4)存储器访问(Memory Access,MEM)
load:从存储器中返回的数值存入LMD寄存器中

LMD<=Mem[ALUoutput]

store:将寄存器B写入存储器

Mem[ALUoutput] <= B

(5)写回操作(Write back,WB)
a)寄存器-寄存器ALU指令

Reg[IR16...20]<=ALUoutput

b)寄存器-立即数周期

Reg[IR11...15]<=ALUoutput

c)取指令

Reg[IR11...15]<=LMD

操作:将结果写回寄存器堆中,结果可能来自存储器或者ALU

在这里插入图片描述
(四)流水线冒险
(1)结构冒险:由于资源冲突而使硬件无法支持所有的指令组合同时执行
(2)数据冒险:指令执行需要之前指令的计算结果,而这个结果在流水线还没有计算出来
(3)控制冒险:分支的流水线和其他指令改变程序计数器的值
(4)存储器的冒险
通用方法:停止流水线,并在流水线插入bubble。

发布了54 篇原创文章 · 获赞 4 · 访问量 1031

猜你喜欢

转载自blog.csdn.net/buzhiquxiang/article/details/103656177