大家好,我是数字小熊饼干,一个练习时长两年半的ic打工人。我在两年前通过自学跨行社招加入了IC行业。现在的话,我打算将这两年的工作经验和当初面试时最常问的一些问题进行总结,并通过汇总成文章的形式进行输出,相信无论你是在职的还是已经还准备入行,看过之后都会有有一些收获,如果看完后喜欢的话就请关注我吧~谢谢~
在上一篇文章中,我们提到了建立时间和保持时间的概念,在本篇文章中,我们将进一步进行建立时间和保持时间的裕量(slack)分析。
一、时钟的属性
在同步电路之中,存在着大量使用同一个时钟的寄存器,而时钟从时钟源到这些寄存器的时钟端时,也会存在不同的时间上的差异,我们通过以下属性进行描述:
1.1 时钟偏移:
时钟从时钟源到各个寄存器的时钟端会经历不同的网线,进而存在不同程度的延时,进而最终到达寄存器的时钟端时会存在相位差,我们把这种现象称为时钟偏移。
我们通常是对对从源端寄存器FF1到目标端寄存器FF2进行时序分析,因此有:
Tskew=clk2-clk1
当clk2比clk1晚来时,我们称为正时钟偏移,反之则为负时钟偏移。
1.2 时钟抖动:
相对理想时钟沿而言,实际时钟存在不随时间积累,时而超前、时而滞后的偏移,我们将这种现象称为时钟抖动。
也就是说当发生时钟抖动时,该时钟周期将会产生增加或缩小,所以我们一般将时钟抖动称为时钟不确定性(Uncertainty)。
1.3 时钟的转换时间
在实际的生活中,时钟电平的切换当然不会如理想模型一般在瞬间完成。我们使用将时钟在高/低电平之间的跳变时间称为时钟的转换时间。
1.4 时钟延时
时钟从时钟源到达寄存器时钟端口的延时,称为时钟延时。
二、时序路径
我们在进行时序路径分析时,通常会遇到以下4种路径(左侧为上游模块、中间为待分析模块、右边为下游模块):
1.从待分析模块的输入端口到第一级寄存器的数据端(D端)之间的路径
2.待分析模块内部寄存器之间的路径
3.待分析模块最后一级寄存器到输出端口之间的路径
4.待分析模块输入端口到输出端口之间的纯组合逻辑
从这4条路径来看,1-3都是寄存器的Q端到另外寄存器的D端之间的路径,因此,我们可以先将第二条路径作为典型进行分析,即下图:
在上图中,出现了Tco与Tcomb,其中,Tco指的就是在时钟有效沿出现到寄存器的Q端稳定输出之间的延迟,Tcomb为两级寄存器之间的组合逻辑延迟。
三、建立时间和保持时间的裕量计算
3.1 建立时间裕量计算
我们再将时钟偏移带入到路径之中,那么可以得到如下的时序:
当FF1在T0时刻采到了数据adata,那么FF2只要在T1时刻采到数据adata即可,所以FF2有一个周期Tclk的时间等待数据到达D端.
如果再考虑时钟偏移,如果是正偏移,那么等待时间自然会变长,是负偏移,等待时间就会变短。因此,这段等待时间就会是Tclk+Tskew。
在得到了总的等待时间后,还得减去以下:
-当时钟有效沿来临到FF1输出数据会花费Tco的时间;
-FF1与FF2之间的组合逻辑之间的延迟时间;
-以及需要满足的FF2的建立时间,因此我们最终得到了下面的式子:
Tsetupslack=Tclk+Tskew-Tco-Tcomb-Tsu>=0
上式中,Tsteupslack也就是建立时间裕量,在进行静态时序分析时,建立时间裕量需要大于等于0,否则则是建立时间违例setup violation。
如果建立时间违例,那么根据上面的式子,我们可以得到如下解决办法:
1.增加时钟周期Tclk,即降低时钟频率
2.降低Tco,即更换器件库,使用性能更好更快的寄存器
3.降低Tcomb,即减小组合逻辑延迟,包括将串行逻辑转并行;在组合逻辑之间插入寄存器,以使得各级寄存器之间的组合逻辑变少
4.增加Tskew,通过在时钟路径上插入buffer,增大正向时钟偏移
5.复制寄存器,有时一个寄存器驱动太多的下级寄存器,即高扇出(fan out),会导致时序变差,这时可以通过对扇出很大的信号产生逻辑进行多次复制,生成多路同频同相的信号去驱动下级逻辑电路,以优化时序。
3.2 保持时间裕量计算
接下来我们对保持时间进行分析,
我们首先回顾一下保持时间的概念:在时钟有效沿来临后,输入数据需要保持稳定的最小时间。那么在什么情况下,会导致时钟有效边沿来临时,输入数据不稳定呢?
没错,上述情况会发生在上一级寄存器FF1输出数据变化太快产生!也就是说,在FF2还未锁住adata之前,FF1已经采到并输出bdata,且数据bdata通过了他们之间的组合逻辑路径来到了FF2的D端,这种情况就会导致建立时间违例(Hold violation)。
也就是说,在讨论保持时间时,我们分析的FF1和FF2是处在同一个时钟沿下的,而非建立时间那样FF1比FF2提前一个周期。
因此,我们进行如下分析:
-
首先总的等待时间还是Tco+Tcomb。
-
其次,考虑时钟偏移,如果是正偏移,那么clk2将会比clk1延迟,因此,FF2将会比FF1更晚采到数据,进而占用更多的等待时间,反之如果是负偏移,则会产生更多的等待时间,所以有:
Tco+Tcomb-Tskew
-
最后,我们还需要满足FF2的等待时间,因此有:
Thold=Tco+Tcomb-Tskew-Thd>=0
Thold为保持时间裕量,在进行静态时序分析时,保持时间裕量需要大于等于0,否则则是保持时间违例hold violation
在得到了保持时间裕量的计算方法后,我们可根据上述方法得到保持时间违例的解决方法:
1.增加Tcomb,即通过插入buffer的方法增加数据的延时。
2.增加Tco,通过使用性能更差的寄存器。
一般来说,解决保持时间违例,要比解决建立时间违例更加简单,因为我们只需要在组合逻辑路径中插入buffer即可解决保持时间违例的问题。
最后,厚颜无耻的介绍一下我的微信公众号——熊熊的ic车间,如果大家觉得我的文章不错的话,烦请关注一下~ 谢谢~