3、时序库(liberty)入门:Liberty文件结构,PVT corner,NLDM与CCS模型
好,咱们今天聊聊时序库。说白了,Liberty文件就是标准单元库的「说明书」。你想想看,没有这本说明书,STA工具根本不知道每个门电路延迟多少、功耗多大。我刚开始接触STA时,觉得这玩意儿就是个文本文件,后来才发现——嗯,这里面的门道可不少。
3.1 Liberty文件长什么样?
Liberty文件,后缀通常是.lib。它本质上是个文本文件,但结构非常严谨。我习惯把它想象成一本「字典」——顶层是库信息,往下是每个单元的详细信息。
一个典型的Liberty文件结构是这样的:
library(tcbn28hpcplusbwp7t40ltt1p08v125c) {
delay_model : "table_lookup";
in_place_swap_mode : match_footprint;
...
cell(AND2X1) {
area : 0.000;
pin(A) {
direction : input;
capacitance : 0.001;
timing() {
related_pin : "Y";
timing_sense : positive_unate;
cell_rise(delay_template_7x7) {
index_1("0.01, 0.02, ...");
index_2("0.001, 0.002, ...");
values("0.05, 0.08, ...");
}
}
}
pin(Y) {
direction : output;
...
}
}
}
看到没?最外层是library(),里面定义了一大堆全局参数。然后每个cell()就是一个标准单元,比如AND2X1(两输入与门)。每个单元里又有pin(),定义输入输出引脚。每个引脚下面还有timing(),这才是STA真正关心的东西——延迟查找表。
核心要点:Liberty文件的核心就是「查找表」。工具根据输入转换时间(slew)和输出负载(load),查表得到延迟值。说白了,就是个二维插值。
3.2 PVT Corner——为什么要有这么多库?
你可能会问:为什么一个工艺节点要生成几十个Liberty文件?
原因很简单:芯片在不同条件下,性能天差地别。温度高了,管子变慢;电压低了,延迟变大。所以我们要把工艺(Process)、电压(Voltage)、温度(Temperature)组合起来,形成不同的「corner」。
我举个例子。我在一个28nm项目里,光时序库就用了12个。为什么?因为要覆盖所有极端情况。
| Corner名称 | 工艺 | 电压 | 温度 | 用途 |
|---|---|---|---|---|
| ss_0p72v_125c | Slow (SS) | 0.72V | 125°C | 最差情况(setup检查) |
| ff_0p88v_m40c | Fast (FF) | 0.88V | -40°C | 最好情况(hold检查) |
| tt_0p80v_25c | Typical (TT) | 0.80V | 25°C | 典型功耗分析 |
这里要注意:setup检查用最慢的corner,hold检查用最快的corner。为什么?setup怕信号来得太慢,hold怕信号来得太快。这个逻辑你想想看,是不是很自然?
我曾经踩过一个坑:有个项目只用了SS和FF两个corner,结果流片回来发现芯片在低温低压下hold违例。后来查原因,是漏掉了「低温低压」这个组合。所以我现在做项目,至少会覆盖4个corner:SS、FF、SF、FS。别嫌多,省这一步可能省几百万。
3.3 NLDM vs CCS——两种建模方式
好,接下来聊点技术干货。Liberty文件里描述延迟,主要有两种模型:NLDM和CCS。
NLDM(Non-Linear Delay Model)
NLDM是最经典的模型。它用二维查找表来描述延迟和输出转换时间。输入是输入转换时间和输出负载,输出是延迟值和输出slew。
说白了,NLDM假设:输出波形是线性的。它只关心波形的「斜率」,不关心波形的具体形状。
NLDM的优点是简单、计算快。但缺点也很明显——在先进工艺下(28nm以下),线性假设越来越不准。尤其是当负载很大时,输出波形根本不是直线。
// NLDM示例:cell_rise查找表
cell_rise(delay_template_7x7) {
index_1("0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1.0"); // 输入slew (ns)
index_2("0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1"); // 输出负载 (pF)
values("0.05, 0.08, 0.12, 0.18, 0.25, 0.40, 0.60", // 延迟值 (ns)
"0.06, 0.09, 0.13, ...",
...);
}
CCS(Composite Current Source)
CCS是Cadence推出的新一代模型。它不再用简单的线性斜率,而是用电流波形来描述输出行为。
你想想看,一个门电路的输出,其实就是一个电流源在给负载电容充放电。CCS模型直接给出了这个电流随时间变化的曲线。这样工具就能精确计算出输出波形的真实形状。
CCS模型包含两部分:
- CCS Timing:用于延迟计算,提供电流波形
- CCS Noise:用于噪声分析,提供输出阻抗信息
我的建议:如果你在做28nm以上的项目,NLDM完全够用。但到了16nm、7nm,一定要用CCS。我有个7nm的项目,刚开始用NLDM做STA,结果后仿对不上。换成CCS后,误差从15%降到了2%以内。差距就是这么明显。
3.4 如何选择Liberty文件?
实际项目中,你不可能把所有corner的库都加载进去。那样内存会爆掉。一般做法是:
- setup分析:只加载最慢的corner(通常是SS、低温、低压)
- hold分析:只加载最快的corner(通常是FF、高温、高压)
- 功耗分析:加载典型corner(TT)
- 跨corner分析:用OCV(On-Chip Variation)来考虑工艺波动
嗯,这里要注意:不同foundry给的库命名规则不一样。TSMC喜欢用ss_0p72v_125c这种格式,SMIC可能用slow_0.72V_125C。我建议你拿到库后,先写个脚本把所有corner列出来,确认每个文件对应什么条件。别等到跑STA时才发现加载错了库。
3.5 一个小技巧:查看Liberty文件
最后分享个实用技巧。有时候你需要快速查看某个单元的延迟信息,不用打开整个Liberty文件(那玩意儿动辄几百MB)。用grep就行:
# 查看AND2X1单元的延迟信息
grep -A 50 "cell(AND2X1)" tcbn28hpcplusbwp7t40ltt1p08v125c.lib
# 查看所有单元的area
grep "area :" tcbn28hpcplusbwp7t40ltt1p08v125c.lib | sort -u
我个人习惯是把所有corner的库文件放在一个目录下,然后用一个脚本统一管理。这样切换corner时,只需要改一个环境变量就行。
好了,关于Liberty文件的基础知识就聊到这儿。下一章我们会深入讲解如何用这些库文件做实际的STA分析。记住一句话:库文件是STA的基石,理解它,你才能用好它。
本章小结:
- Liberty文件是标准单元库的「说明书」,核心是查找表
- PVT corner覆盖工艺、电压、温度的组合,setup用最慢corner,hold用最快corner
- NLDM用线性斜率建模,简单但精度有限;CCS用电流波形建模,精度高但计算量大
- 实际项目中要合理选择corner,避免内存爆炸