for example, a path form regA to regB, if the clock arrived at regB later than at regA, thus the constraitn on the path form regA to regB would be a little loosen.
it may help us to meet timing.it names "useful skew".

Timng borrow is popular method of latch-based design.

一、useful skew

摘自http://www.elecfans.com/d/714093.html

今天要介绍的时序分析基本概念是skew,我们称为偏差。由于时钟到每个寄存器的路径延迟不一样,造成信号到达 clock pin 的时间也不一样,我们把时钟信号到达不同寄存器的时间偏差称为skew。一直以来,Skew都是衡量时钟树性能的重要参数,传统CTS的目的就是为了减小skew。

Skew的类型分为很多种,根据clock和data path的方向,skew可以分为positive skewnegative skew。如下图所示:

 

对于positive skew,clock和data path在相同方向上。反之对negative skew来说,clock和data path在相反方向上。那它们对我们的design有什么影响呢?我们来看一下setup和hold的计算公式:

我们可以得到以下结果,

对于positive skew来说,它可以减少T的时间,相当于提升芯片的performace。但是它的hold时间会变得更加难以满足

对于negative skew来说,它的hold时间更加容易满足,取而代之的是,它会降低芯片的性能。

还有另外一种skew的分类方法,是我们更为常见的,根据时钟域以及路径关系, skew 可以分为 global skew ,local skew ,interclock skew

Global skew 是指,同一时钟域,任意两个路径的最大 skew 。如下图所示,注意是任意两条路径,不管是不是timing path,都会算作gloabl skew计算的对象。CTS时,工具更关注的是global skew, 会尽可能地将global skew做小。

Local skew 是指,同一时钟域,任意两个有逻辑关联关系的路径最大 skew 。这边需要注明,必须是存在逻辑关系的path才会计算local skew,也就是说必须要是timing path。如下图所示,我们在分析timing的时候,更多地是关注local skew。

interClock skew 是指,不同时钟域之间路径的最大 skew,如下图所示:

另外还有一种比较特使的skew,就是现如今用得较多的useful skew,我们称为有用偏差。一般来说,skew会恶化timing结果,但如果合理使用,那skew也可以起到修复timing的作用,从而提高设计的频率。

如下图:时钟周期为 4ns ,各时钟路径延迟如下:可以看到有一条路径的 slack 为 -1ns ,说明这条路径违规。可以看到与这条路径相关的 skew 是 t3-t2= -1ns 。

下面我们利用 useful skew 向前面一个 slack 比较充裕的路径(slack=2ns)借用1ns的 时间 ,这样两条path都meet了时序要求。如下图:

这就是 useful skew 的作用,可以向前,或者向后借time来修正 violation。

 

二、timing borrow

摘自https://zhuanlan.zhihu.com/p/35563526

今天吾爱IC社区为各位分享数字IC后端设计实现中关于Timing borrowing的概念及其应用。

我们假定时钟周期为10ns,clock skew和library setup time,library hold time 均为0,图1中所示为一个简单的电路示意图。我们以F1到F2这条timing path为例,寄存器F1在T=0时刻获得数据,寄存器F2在一个时钟cycle后进行数据采集。如果前一级的数据在T>10ns时刻到达寄存器F2,则存在setup违例。

 

图1 简单电路图

 

现在我们将寄存器F2替换成锁存器L2(Latch),如图2所示。此时如果前一级F1的数据在T>10ns时刻到达寄存器F2,setup是否还存在setup violation?

 

图2 寄存器F2替换成Latch L2后的电路图

我们知道Latch和触发器最大不同的地方在于,触发器是边沿edge触发,而锁存器是电平触发(敏感)。对于高电平有效的Latch来说,在Opening edge和Closing edge之间都是透明的。数据在opening edge之前到达,setup slack大于0,数据在opening edge和closing edge之间到达,setup slack等于0。只有当数据在closing edge之后到达,才会有setup violation。

图3 Latch Timing Violation Window

 

假设F1的数据在T=12ns时刻到达L2,由于在t=10ns时刻前一级的数据还没有ready,Latch还采集不到数据。但是由于锁存器在10ns---15ns期间是透明,因此F1的数据可以晚到一些,此时需要借用下一个cycle 2ns的时间(其实就是LatB的output晚了2ns,到达RegC的input晚了2ns,相当于向RegC borrow 2ns setup margin)。具体可以画波形图,非常清晰,波形图必须会自己画哦。这个就是Timing borrowing的概念(也称为cycle stealing)。

 

显然,改进后电路的性能有一个较大的提升。

 

其实在数字IC设计中,我们常常见到的是下面这个电路,如图4所示。值得注意的是LatchB是低电平有效的。

图4 典型电路结构

 

对应的波形图如图5所示。从图中可以看出,当RegA的数据在T=10ns之前到达锁存器B,setup都是meet的(因为可以借用半个cycle的timing)。对于RegA到LatchB之间的Hold check如往常一样。

对于图4中的电路,如果我们假设RegA和RegC的驱动时钟是不一样的(Func模式下),即分别被两个不同的时钟驱动,这两个寄存器是不需要做balance的。那么在Test mode下,寄存器A和寄存器C之间可能存在比较大的hold violation(两个clock latency差异较大)。或者换用下列表达:

如下图所示,DOMAIN1和DOMAIN2分别为两个clock domain,在func mode下两个domain不存在相互交互的path。因此,在做时钟树综合(CTS)时,会各自独立长clock tree,即他们之间的clock latency可能存在较大的差异。在func模式下不会有任何问题。但是,在做DFT的时候,我们将DOMAIN1和DOMAIN2的寄存器串在一条链上了。在scan shift时是有问题的。他们之间是需要做hold check(比如DOMAIN2的clock latency比较长)。

 

为了解决这种hold violation,我们在RegA和RegC之间插了一个低电平有效的LatchB(通常我们所说的Lockup Latch)。在LatchB到RegC进行hold check时,RegC对应的capture edge直接提前了半个周期,从而大大改善了hold违例问题。看到这里,有的人可能会觉得那LatchB到RegC的setup是否更紧了?其实不用怕,为什么?(test mode下clock频率比较低)

 

图5 setup和hold check 波形图

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐