之前讲到了亚稳态问题和成因,此处讲如何解决同步电路中亚稳态问题的解决方法。
从STA公式 ( a ) (a) (a)和 ( b ) (b) (b)就可以看出端倪了,重写如下
T s e t u p U F F 1 < T c l k + T c l k 2 U F F 1 − ( T c l k 2 U F F 0 + T C K 2 Q U F F 0 + T U F F 02 U F F 1 ) (a) T^{UFF1}_{setup}<T_{clk}+T_{clk2UFF1}-(T_{clk2UFF0}+T^{UFF0}_{CK2Q}+T_{UFF02UFF1}) \tag{a} TsetupUFF1<Tclk+Tclk2UFF1−(Tclk2UFF0+TCK2QUFF0+TUFF02UFF1)(a)
T h o l d U F F 1 < T c l k 2 U F F 0 + T C K 2 Q U F F 0 + T U F F 02 U F F 1 − T c l k 2 U F F 1 (b) T^{UFF1}_{hold}<T_{clk2UFF0}+T^{UFF0}_{CK2Q}+T_{UFF02UFF1}-T_{clk2UFF1} \tag{b} TholdUFF1<Tclk2UFF0+TCK2QUFF0+TUFF02UFF1−Tclk2UFF1(b)
两个式子中
T s e t u p U F F 1 T^{UFF1}_{setup} TsetupUFF1、 T h o l d U F F 1 T^{UFF1}_{hold} TholdUFF1和 T C K 2 Q U F F 0 T^{UFF0}_{CK2Q} TCK2QUFF0是触发器自身特性无法改变
T c l k T_{clk} Tclk是同步时钟,与电路无关
剩余的量就是引起同步电路亚稳态的原因了
1. 组合逻辑 T U F F 02 U F F 1 T_{UFF02UFF1} TUFF02UFF1
从上述公式可以看出,组合逻辑会影响建立时间和保持时间的满足。
不仅如此,在满足建立时间和保持时间的前提下,组合逻辑与时钟频率 T c l k T_{clk} Tclk有关联。
还记得下面这个式子嘛
T c l k > max ( i , j ) 存 在 时 序 路 径 ( T s e t u p U F F j + T C K 2 Q U F F i + T U F F i 2 U F F j + T c l k 2 U F F i − T c l k 2 U F F j ) (c) T_{clk}>\max_{(i,j)存在时序路径}(T^{UFFj}_{setup} +T^{UFFi}_{CK2Q}+T_{UFFi2UFFj}+T_{clk2UFFi}-T_{clk2UFFj} ) \tag{c} Tclk>(i,j)存在时序路径max(TsetupUFFj+TCK2QUFFi+TUFFi2UFFj+Tclk2UFFi−Tclk2UFFj)(c)
真正对右式起关键作用之一的就是组合逻辑 T U F F i 2 U F F j T_{UFFi2UFFj} TUFFi2UFFj
1.1. 流水线设计
也是pipeline,意思非常简单,就是在冗长的组合逻辑中加入多级触发器,这样每个 T c l k T_{clk} Tclk两个触发器之间走过的组合逻辑路径就会减少,就可以减小 T c l k T_{clk} Tclk提高系统工作频率。
例如有一家咖啡吧有客人ABCDE依次排队买套餐。
一般为客人供给食物的策略是:员工甲放个盘子,员工乙装上薯条,员工丙放上豌豆,老板最后配上 一杯饮料,完成对客人A的服务,然后再服务下一位客人B服务,顺序依次。
但是这样的策略有个问题:员工甲给了客人盘子之后,就一直闲着直到该客人套餐购买完全结束,才 为下一个客人服务。其他员工同样存在相同的问题
而pipeline的策略是:在甲为客人A放完盘子之后,为客人B放盘子,再为客人C放盘子,直到客人E。其他员工也是这样的策略。
举加法器的例子,我们分别代入 ( c ) (c) (c)式计算
不使用流水时:
T c l k 1 > T s e t u p F F + T C K 2 Q F F + 3 ⋅ T a d d e r + max ( T c l k 1 s k e w ) T_{clk1}>T^{FF}_{setup} +T^{FF}_{CK2Q}+3·T_{adder}+\max(T_{clk1skew}) Tclk1>TsetupFF+TCK2QFF+3⋅Tadder+max(Tclk1skew)
使用流水时:
T c l k 2 > T s e t u p F F + T C K 2 Q F F + T a d d e r + max ( T c l k 2 s k e w ) T_{clk2}>T^{FF}_{setup} +T^{FF}_{CK2Q}+T_{adder}+\max(T_{clk2skew}) Tclk2>TsetupFF+TCK2QFF+Tadder+max(Tclk2skew)
分析一下流水设计带来的变化
● 时钟频率 增加
从公式中可以看出,是用流水后加法器减少了。因为各触发器离得更近了,时钟偏斜也有所减缓,因此系统工作频率可提高。
● 吞吐率 增加
流水线引入后也是每个时钟周期输出一个结果,但是由于时钟频率的增加,使得吞吐率也增加
● 延迟 增加
此处的延迟是指一个数据从输入到输出的总时间
引入流水之前,延迟为 T c l k 1 + T C K 2 Q F F T_{clk1}+T^{FF}_{CK2Q} Tclk1+TCK2QFF,引入流水之后变成 3 T c l k 2 + T C K 2 Q F F 3T_{clk2}+T^{FF}_{CK2Q} 3Tclk2+TCK2QFF
后者更大
● 功耗和面积 增加
毕竟触发器多了嘛,功耗、布局布线都会增加压力
相关概念
介绍流水线的相关概念
以CPU取指令3ns、分析4ns、执行1ns为例
● 流水线周期: 执行最长操作所花费的时间,也是流水过程中每输出1个结果花费的时间,即4ns
● 操作时间: 只执行1次全部操作花费的时间,即3+4+1=8ns
● n个数据流水线时间: 执行1次流水共执行n次操作花费的时间,公式 操作时间 + (n-1)×流水线周期
● 吞吐率: 输出结果数量 / 流水线时间。n个数据流水线吞吐率为 n / [操作时间 + (n-1)×流水线周期]
● 最大吞吐率: 流水过程中,单位时间内输出的结果数量,为1 / 流水线周期
2. 时钟偏斜(Clock Skew)
看公式就知道时钟偏斜是啥意思了,就是时钟信号到达不同触发器的时间不同
这个东西在同步电路中必然存在
● 如果CLKM到达UFF0先于UFF1,即 T c l k 2 U F F 0 − T c l k 2 U F F 1 < 0 T_{clk2UFF0}-T_{clk2UFF1} <0 Tclk2UFF0−Tclk2UFF1<0,保持时间不满足,其实就是UFF1/D的变化提前了
● 如果CLKM到达UFF0晚于UFF1,即 T c l k 2 U F F 0 − T c l k 2 U F F 1 > 0 T_{clk2UFF0}-T_{clk2UFF1}>0 Tclk2UFF0−Tclk2UFF1>0,建立时间不满足,其实就是UFF1/CK采样提前了
还有个时钟抖动(Clock Jitter)的概念,是指不同时期时钟周期长短不一