十九种fix setup violation的方法
Setup violation的本质是一个时钟周期内上一级寄存器锁存的数据无法正确的传输到下一级寄存器并被正确地锁存,也就是数据跑的太慢了。
这会减少cell delay;cell级数减少了,这种减小也不是单纯地几何倍数的减小,减小的程度应该是小于“remove buffer的数量 ✖ 原来的cell delay“;因为net wire变长之后,电流从net一端传播到net另一端电流衰减更加严重,对器件的充电速度变慢。
但是会增加net delay,net wire总长度变大,RC参数变大,RC曲线更加绵长。
我们知道buffer的结构基本上等价于两个inverter,使用一对inverter替换buffer可以较少path上总的delay。
跟只用一个buffer相比,一对反相器会两倍的减少transition time,所以这会减少RC delay。而一个buffer的cell delay约等于一对inverter的cell delay,但是net delay减小了,所以总的delay减小了。
方法三:swap VT
就是换cell的VT,就是把HVT换成SVT/RVT或者LVT。
相同情况下low VT的cell的栅极阈值电压更低,所以对于该cell本身其slew更小;相同情况下low VT的cell的栅极导通电流更大,所以其对于后续的net wire的充电速度更快。
所以low VT的cell相当于从cell delay和net delay两种角度去减小了总的delay。
不过,Low VT的cell静态电流更大,静态功耗也更大。
一般来说大驱动的cell具有更高的speed,但是可能某些cell类型,更大的cell可能速度更慢。
不过,这样也会使得power更高,area更大。
方法五:insert buffer
插buffer会减小transition time,这会减小net delay。如果总的net delay的减小大于cell delay的增加;那么总的delay就会减小。
不过,这也会导致power和area增加。
这跟insert buffer类似,不过区别在于场景的不同。
Long net wire会导致大的RC delay,如果insert repeater可以将net wire切分成多段可以减少总的net delay;因为总的net delay的减少大于cell delay的增加,所以这是一种有效的方法。
本质也是减少net delay。
方法八:调整clock skew
就是通过skew调整向后一级借setup余量。
方法九:给critial path用NDR走线
类似于CTS绕线原理,就是减少net wire的RC和cross-talk。
手动换高层走线或者手动把net wire捋直。
修crosstalk除了加shielding和NDR rule以外,还有一种方法是:违例点周围的各种走线remove掉或者拉的远一点。
如果实在修不下去,该降就降吧。
实在不行,也可以选用一些speed更快的库,或者自己定做一些库。
也分全局换库和局部换库,全局就是整个design都换,局部就是让critical path用一些特殊的库。
通过调整pg plan,释放一部分高层绕线资源,也可利于修setup。
通过调整floorplan使得具有交互的module的位置更合理。
因为MBFF cell内部的公共走线和公共的晶体管更多,所以其本身的load更大,那么transition time就更大,delay就更大;所以可以通过拆分MBFF cell来修setup violation。
方法十七:打拍
打拍就是在reg2reg path中间再加一个reg,一个周期搞不定的事情,分成两个周期来做。
方法十九:改RTL
如果RTL综合出来本身的timing path逻辑级数太长或者组合逻辑太多,可以考虑改RTL。
二种fix hold violation的方法
可以使用buffer、inverter piars、delay cell来修hold violation。
由于hold violation path的start point和end point可能对应着别的setup violation path(或者setup slack比较紧张),所以add delay时需要格外小心。
另外,一般不要再两条timing path的commen path add delay。
方法二十一:size-down cell
尽可能去size end-point附近的cell,这样对别的path影响较小。
另外修crosstalk和手动走线也可修hold。
欢迎各位读者留言补充其他fix timing的方法。