4、Setup违例修复:插入Buffer/Inverter、调整Cell大小、逻辑重组、VT swap
Setup违例,说白了就是信号跑得太慢了。
时钟沿都到了,数据还没准备好。这在芯片设计里是个老生常谈的问题。我刚开始做STA那会儿,看到一堆红色的violation就头皮发麻。后来经验多了,发现其实就那几招——Buffer/Inverter插入、Cell大小调整、逻辑重组、VT swap。今天咱们把这四招掰开揉碎了讲。
4.1 插入Buffer/Inverter:最直接的加速手段
为什么插入Buffer能修Setup?
因为Buffer可以重新驱动信号。长线走下来,信号早就衰减得不成样子了。插个Buffer,相当于给信号打了一针强心剂。
核心原则:Buffer不是乱插的。插在路径的中间偏前位置,效果最好。
我个人习惯用CLKBUF系列。为什么?因为它的驱动能力线性度好,不容易产生毛刺。Inverter也有妙用——两个Inverter串在一起,其实就是一个Buffer,但有时候能省面积。
小技巧:如果路径上已经有Inverter了,试试把它换成Buffer。少一级反相,延迟能降不少。
我在项目中遇到过一条路径,setup slack是-120ps。插了两个Buffer后,变成了-30ps。虽然还没修干净,但至少看到了希望。
4.2 调整Cell大小:换大Cell,降延迟
Cell尺寸越大,驱动能力越强,延迟越小。这个道理大家都懂。
但有个坑——大Cell占面积,而且功耗高。你想想看,整个芯片都换成最大尺寸的Cell,那面积得翻倍。
| Cell类型 | 驱动强度 | 延迟(ns) | 面积(um²) |
|---|---|---|---|
| NAND2_X1 | 1x | 0.12 | 0.8 |
| NAND2_X2 | 2x | 0.09 | 1.2 |
| NAND2_X4 | 4x | 0.07 | 2.0 |
从表格能看出来,从X1换到X2,延迟降了25%,面积只涨了50%。但从X2换到X4,延迟只降了22%,面积却涨了67%。
注意:Cell尺寸不是越大越好。超过X4之后,边际效益递减得很厉害。我一般只换到X4,再大的就不划算了。
4.3 逻辑重组:改变结构,减少级数
有时候,路径延迟高不是因为Cell不够大,而是逻辑级数太多了。
举个例子:
// 原始逻辑:4级
assign C = A & B;
assign D = C | E;
assign F = D & G;
assign H = F ^ I;
// 重组后:2级
assign H = (A & B | E) & G ^ I;
你看,4级变成了2级。延迟至少砍掉一半。
逻辑重组的核心思路就一个——把串行的逻辑变成并行的。我曾经在一个项目中,把一条7级的路径重组成3级,setup slack从-200ps直接变成了+50ps。那感觉,爽。
经验之谈:逻辑重组是最省面积的修复手段。因为它不增加Cell,只是改变了连线方式。但前提是——你得懂RTL代码,能看懂综合后的网表。
4.4 VT swap:用低阈值Cell换速度
VT swap,就是换阈值电压。
低阈值(LVT)的Cell速度快,但漏电大。高阈值(HVT)的Cell漏电小,但速度慢。标准阈值(SVT)居中。
我一般这样用:
- 关键路径:全部换成LVT。速度第一,功耗第二。
- 非关键路径:用HVT。省电。
- 中间路径:用SVT。平衡一下。
避坑指南:我曾经在一个项目中,把整条路径都换成了LVT。结果setup是修好了,但hold又出了问题。因为LVT的Cell对工艺偏差更敏感,hold margin反而变小了。所以VT swap要谨慎,最好只换路径中间的几个Cell,不要全换。
4.5 四种方法的对比与选择
这四种方法,各有各的适用场景。我画了个图,方便你理解:
从图上能看出来,我的习惯是:
- 先看逻辑级数。级数多,优先逻辑重组。这是最省面积的。
- 再看驱动能力。Cell太小就换大Cell。不行就插Buffer。
- 最后才用VT swap。因为VT swap会影响功耗和hold margin。
总结一下:Setup修复没有银弹。四种方法要组合着用。我一般先试逻辑重组,再调Cell大小,最后才动VT。Buffer是万金油,但别用太多,否则面积会失控。
嗯,今天就聊到这儿。这些方法你多练几次,自然就熟练了。