4、PVT组合与STA分析:最差情况(Worst Case)与最好情况(Best Case)的PVT组合选择
好,咱们接着聊。前面几章我们把PVT的每个维度都拆开讲了一遍,这一章要干点实际的事——怎么把这些PVT条件组合起来,用到静态时序分析里。
说白了,你不可能在芯片工作时同时经历所有最差条件。但STA分析时,我们得挑出那些真正能压垮时序的PVT组合。我刚开始做STA那会儿,就犯过一个低级错误:把所有最差条件堆在一起跑,结果setup violation一大堆,修了三个月。后来才发现,有些组合根本不会同时出现。
4.1 为什么需要PVT组合?
芯片在实际工作中,电压、温度、工艺偏差是同时存在的。你不能只看单独一个参数。举个例子:
- 低温+高电压:晶体管开关速度快,cell delay小。这对setup有利,但对hold不利。
- 高温+低电压:晶体管开关速度慢,cell delay大。这对setup不利,但对hold有利。
你看,同一个PVT条件,对setup和hold的影响是相反的。所以STA分析时,必须针对不同的时序检查,选择不同的PVT组合。
核心原则:
- Setup检查:选最慢的PVT组合(Worst Case)
- Hold检查:选最快的PVT组合(Best Case)
嗯,这里要注意:我说的「最慢」和「最快」,不是简单地把所有极端值拼在一起。得看实际物理约束。
4.2 最差情况(Worst Case)组合怎么选?
Setup分析要的是「数据路径尽量慢,时钟路径尽量快」。这样数据到达时间晚,时钟采样时间早,最容易出现setup violation。
我个人习惯这样选:
| 参数 | Setup Worst Case | 原因 |
|---|---|---|
| 工艺(Process) | Slow(慢工艺角) | 晶体管驱动能力弱,cell delay大 |
| 电压(Voltage) | Low(低电压,如0.9V) | 电压低,电流小,充放电慢 |
| 温度(Temperature) | High(高温,如125°C) | 高温下载流子迁移率下降,电阻增大 |
我在项目中遇到过一种情况:某颗芯片在低温下反而更慢。这是因为某些工艺节点下,低温会导致阈值电压升高,反而拖慢了速度。所以,不要死记硬背,一定要看foundry提供的PVT模型。
避坑指南:我曾经在一个28nm项目中,默认用了「低温+低电压」做setup分析,结果signoff时发现漏掉了真正的worst case。后来查文档才知道,那个工艺的slow corner是「高温+低电压」。白白浪费了两周迭代时间。
4.3 最好情况(Best Case)组合怎么选?
Hold分析正好反过来:要的是「数据路径尽量快,时钟路径尽量慢」。这样数据到达时间早,时钟采样时间晚,最容易出现hold violation。
| 参数 | Hold Best Case | 原因 |
|---|---|---|
| 工艺(Process) | Fast(快工艺角) | 晶体管驱动能力强,cell delay小 |
| 电压(Voltage) | High(高电压,如1.1V) | 电压高,电流大,充放电快 |
| 温度(Temperature) | Low(低温,如-40°C) | 低温下载流子迁移率上升,电阻减小 |
你想想看,如果hold分析用了slow corner,那数据路径本来就慢,hold violation根本测不出来。等芯片流片回来,遇到fast corner的芯片,hold就崩了。
4.4 实际STA中的PVT组合策略
现在的EDA工具(比如Synopsys PrimeTime、Cadence Tempus)都支持多角分析。你不需要手动组合每个PVT条件,但你要知道工具在干什么。
常见的做法是:
- WC(Worst Case):用于setup分析。通常是SS(Slow-Slow)工艺角 + 低电压 + 高温。
- BC(Best Case):用于hold分析。通常是FF(Fast-Fast)工艺角 + 高电压 + 低温。
- WCL(Worst Case Low):有些工具会单独处理低温下的setup,因为某些工艺低温反而慢。
- ML(Max Leakage):用于功耗分析,通常是FF工艺角 + 高电压 + 高温。
小技巧:我建议你在项目初期就列一个PVT组合表,跟foundry确认清楚。别等到signoff前才发现corner选错了。另外,记得检查温度反转效应(Temperature Inversion)——有些工艺在低温下delay反而更大,这时候setup的worst case就要用低温而不是高温。
4.5 一个简单的STA脚本示例
下面是一个PrimeTime脚本片段,展示了如何指定PVT组合做setup和hold分析:
# 设置工艺库
set link_library {* ss_0p9v_125c.db ff_1p1v_m40c.db}
# 读入网表和约束
read_verilog top.v
read_sdc top.sdc
# Setup分析:使用SS corner
current_design top
set_operating_conditions -library ss_0p9v_125c -analysis_type on_chip_variation
report_timing -delay_type max -nworst 10 > setup.rpt
# Hold分析:使用FF corner
set_operating_conditions -library ff_1p1v_m40c -analysis_type on_chip_variation
report_timing -delay_type min -nworst 10 > hold.rpt
你看,代码很简单。但背后的逻辑是:setup用慢库,hold用快库。工具会自动根据你指定的operating conditions,去计算对应的cell delay和net delay。
4.6 多角分析(Multi-Corner)的注意事项
现在的芯片规模越来越大,PVT组合也越来越多。我记得有个项目用了12个corner做signoff,跑一次STA要两天。后来我们优化了一下,只保留真正有意义的组合:
- 不要盲目增加corner:每个corner都意味着仿真时间和存储开销。挑出最关键的3-5个就够了。
- 注意OCV(片上偏差):即使在同一颗芯片上,不同区域的PVT条件也可能不同。STA工具会通过derating factor来模拟这种偏差。
- 检查跨corner的一致性:同一个路径,在SS corner下setup slack是正的,在FF corner下hold slack也应该是正的。如果出现矛盾,说明约束或库有问题。
再次提醒:我曾经在一个项目中,setup和hold分别用了不同的corner,但忘了检查跨corner的一致性。结果有一条路径在SS下setup刚好满足,在FF下hold却差了0.2ns。最后发现是时钟树综合时,工具在FF corner下插了过多的buffer,导致时钟偏斜变大。这种问题,只有跨corner分析才能发现。
4.7 小结
这一章的核心就一句话:setup用最慢的PVT组合,hold用最快的PVT组合。但具体哪个组合是「最慢」、哪个是「最快」,得看工艺文档,不能想当然。
下一章我们会聊到PVT对时钟树的影响,以及如何通过时钟树综合来平衡不同corner下的时序。到时候我会分享一个我踩过的坑——关于时钟门控的PVT分析,挺有意思的。
好,今天就到这儿。有问题欢迎留言讨论。