(以下内容仅仅为了方便记忆)
Setup time: Tsu 建立时间
时钟沿到来之前数据稳定不变的时间
Hold time: Th 保持时间
时钟沿到来之后数据稳定不变的时间
时间偏移Clock Skew: Tskew=Tc2-Tc1
一般来说data arrive time>data require time(上面一段时间长,下面一段时间短)
Tsu<Tc2-(Tc1+Tck+Tcmb)+T (下一段路-上一段路+时钟周期)(小-大+T)
=Tskew-Tck-Tcmb+T(这个式子可以更清楚的知道违例了该怎么修)
*这里为什么要加一个时钟周期T呢?因为setup 是前一级寄存器发出的数据,过一个周期,后一级寄存器才去采样。
Th<(Tc1+Tck+Tcmb)-Tc2 (上一段路-下一段路)(大-小)
=Tck+Tcmb-Tskew(这个式子可以更清楚的知道违例了该怎么修)
建立时间裕量Setup Slack=算出来的实际的Tsu-规定的Tsu
保持时间裕量Hold Slack=算出来的实际的Th-规定的Th
*setup violation修复方法包括
(发生了setup violation说明Tsu太大了,就要把Tsu不等式右边也加大,来迎合更大的Tsu,使得不等式成立):
① 增大时钟周期T,也就是降频
② 减小Tcmb,优化组合逻辑延时,具体包括:
a. 增加一个中间触发器来切割Timing Path,分割组合逻辑延时(流水线结构)
b. 对于有较大负载的节点可以考虑插buffer、逻辑复制的方法来优化扇出,减少关键路径上的负载(插Buffer,逻辑复制)
c. 小Cell换成大Cell,更换更大驱动的Cell,增强驱动能力
d. 更换SVT/LVT的Cell
③ 减小Tskew:采用positive skew(Tskew >0),但是要注意可能引入的hold问题,以及前后级的margin问题
④ 减小Tck:更换更快的时序逻辑单元,如HVT->LVT
*hold violation修复方法包括:
(发生了hold violation说明Th太大了,就要把Th不等式右边也加大,来迎合更大的Th,使得不等式成立)
① 增大Tcmb:增加组合路径延时,通过插buffer、插delay cell、更换驱动、更换阈值的方法(组合逻辑深度的增加会增加芯片的面积、布线资源、功耗,可能产生在慢速工艺库条件下建立时间违例)
② 减小Tskew,甚至采用negative skew,但需做好时钟树的balance。
③ 插入低电平有效的锁存器(Lock-up Latch):高电平期间,锁存器输出保持不变,相当于人为将数据推迟了半个时钟周期,以保证满足hold时间要求。