上一期介绍了setup violation的修复,这次我们来讲讲hold violation。 相比setup来说,hold的修复要简单得多。同样地,我们先来回顾下hold time的定义。
hold time(保持时间)检查的是数据不能传输太快,太快会影响前一次数据的锁存。如下图所示:
用公式简单表示为
Tlaunch为launch clock path delay
Tcapture为capture clock path delay
Tdp为data path delay
详细公式可以查看下列文章
【时序分析基本概念介绍】
同样的,我们从公式中可以知道,修复hold主要也有三种方法:
1)增加data path上的delay
这是最常用的修复hold violation的方法。增加path delay要比减小delay方便得多,因此hold violation非常好修。一般情况下,我们只需要在data path上垫buffer或者delay cell就行。buffer cell能增加的delay较小,delay cell会比较大,我们可以根据timing report中每条path的slack情况可以选择垫buffer或者delay cell。
还有个需要注意的事项是,buffer或者delay cell插入的位置。通常情况下,cell的位置都插在path的endpoint附近,因为这样对其他path setup影响的结果最小,也能更好地避免drv的violation。
2)增加launch clock path delay
和修setup violation一样,我们也可以通过垫launch clock path delay来实现修复hold violation的情况。但实际情况下,我们很少使用该手段,因为动到clock,就会出现很多不可控的状况。除非是从同一个register出去有很多hold violation的情况,在设计density很高的情况下可以尝试使用。需要注意检查前一级path的hold margin。
3)减少capture clock path delay
这种方法也需要动到clock,而且减小clock path delay的情况很难实现,因此一般这种方法不可取。
Hold violation很大程度上依赖于clock path的质量,如果clock tree做得很平,那hold violation就会少很多。实际在最后ECO阶段修hold的过程中,我们可以更多地通过脚本来实现。抓取violation path的endpoint点。如果是SI pin,一般可以直接加buffer,或者delay cell。非SI pin的话,记得检查一下对应的setup的margin。
网友评论