3、时序库基础:Liberty (.lib) 文件结构,PVT条件,时序弧与延迟计算

好,咱们今天聊聊时序库。说白了,.lib 文件就是芯片的「体检报告」。它记录了每个标准单元在各种条件下的表现——延迟多少、功耗多少、输入电容多大。没有它,STA 就是空中楼阁。

我记得刚入行那会儿,拿到一个 .lib 文件,打开一看密密麻麻的数字,头都大了。后来慢慢摸清了门道,才发现这东西其实挺有规律的。今天我就把这点经验分享给你。

3.1 Liberty 文件结构

.lib 文件,全称 Liberty 格式。它用文本描述了一个工艺库的所有信息。你想想看,一个库可能有几百个单元,每个单元又有几十种输入组合,全写在一个文件里,结构必须清晰。

它的顶层结构大概是这样的:

library (my_library) {
  delay_model : "table_lookup";
  in_place_swap_mode : "match_footprint";
  ...
  cell (AND2X1) {
    ...
  }
  cell (OR2X1) {
    ...
  }
}

嗯,这里要注意几个关键点:

  • 库级别属性:比如 delay_model 定义了延迟计算方式。常见的有 table_lookup(查表法)和 polynomial(多项式法)。现在主流工艺基本都是查表法。
  • 操作条件:定义了 PVT 条件。后面会细说。
  • Cell 定义:每个标准单元都有自己的描述块。里面包含引脚、功能、时序弧、功耗等信息。

核心要点:.lib 文件本质是一个巨大的嵌套结构。最外层是库,里面是 cell,cell 里面是 pin,pin 里面是 timing arc。一层层剥开,就能找到你要的延迟数据。

3.2 PVT 条件:工艺、电压、温度

芯片不是活在真空里的。同样的一个门,在不同条件下,延迟能差好几倍。PVT 就是描述这些条件的三个维度。

参数 含义 典型范围 对延迟的影响
P (Process) 工艺角 TT, SS, FF, SF, FS SS 最慢,FF 最快
V (Voltage) 工作电压 0.9V ~ 1.2V 电压越低,延迟越大
T (Temperature) 结温 -40°C ~ 125°C 高温通常使延迟变大(但存在逆温效应)

为什么会这样?工艺角代表晶圆制造时的偏差。同一片晶圆上,不同位置的晶体管速度都不一样。SS 就是最慢的 corner,FF 是最快的。电压和温度的影响更直观——电压低了,驱动能力弱,延迟自然大。

我在项目中遇到过一个问题:芯片在低温下反而跑不快。后来查资料才知道,这叫「逆温效应」。在先进工艺下,低温时载流子迁移率虽然高,但阈值电压也高,综合下来延迟反而可能变大。嗯,这个坑我踩过。

避坑指南:不要只分析 SS 和 FF 两个 corner。我曾经只做了这两个,结果芯片在 SF corner 下时序违例了。建议至少覆盖 TT、SS、FF、SF、FS 五个 corner。

3.3 时序弧与延迟计算

时序弧,英文叫 timing arc。它描述的是从一个引脚到另一个引脚的延迟路径。比如一个与非门,从输入 A 到输出 Z 有一条弧,从输入 B 到输出 Z 也有一条弧。

每条时序弧都包含两部分信息:

  • Cell Rise / Cell Fall:输出从低到高、从高到低的延迟。
  • Transition Time:输出信号的上升/下降时间。

在 .lib 文件里,时序弧通常以二维查找表的形式存在。两个维度分别是:输入转换时间(input slew)和输出负载电容(output load)。

pin (Z) {
  timing () {
    related_pin : "A";
    timing_sense : "negative_unate";
    cell_rise (delay_template_7x7) {
      index_1 ("0.01, 0.05, 0.1, 0.2, 0.5, 1.0, 2.0");
      index_2 ("0.01, 0.05, 0.1, 0.2, 0.5, 1.0, 2.0");
      values ( \
        "0.012, 0.015, 0.020, 0.030, 0.050, 0.080, 0.120", \
        "0.015, 0.018, 0.023, 0.033, 0.053, 0.083, 0.123", \
        ...
      );
    }
  }
}

你看,index_1 是输入转换时间,index_2 是输出负载。查表时,PrimeTime 会根据实际的输入 slew 和输出 load,在表格里做二维插值,算出精确的延迟。

个人技巧:我习惯在分析前先看一眼 .lib 里的 index 范围。如果实际工作点落在表格边缘,说明库可能不够准,需要跟工艺厂确认。另外,注意 timing_sense 属性——它告诉你这个引脚是正沿触发还是负沿触发,对 setup/hold 分析很关键。

3.4 延迟计算的实际应用

说了这么多理论,咱们来点实际的。假设你有一个 AND2X1 单元,输入 A 的 slew 是 0.1ns,输出负载是 0.05pF。怎么查延迟?

  1. 找到 cell (AND2X1) 下的 pin (Z)timing 块。
  2. 找到 related_pin : "A" 的弧。
  3. cell_rise 表格,index_1 找 0.1,index_2 找 0.05。
  4. 如果表格里没有精确值,PrimeTime 会自动做线性插值。

举个例子,假设表格里 0.1ns 对应行,0.05pF 对应列,交叉点的值是 0.023ns。那这个单元的上升延迟就是 23ps。

嗯,这里要注意:延迟不是唯一的。同一个单元,不同输入引脚、不同输出边沿,延迟都不一样。所以 STA 工具会遍历所有可能的路径,找到最差的那条。

一句话总结:.lib 文件是 STA 的「字典」,PVT 条件是 STA 的「环境」,时序弧是 STA 的「路径」。三者缺一不可。

好了,这一章就到这里。下一章咱们聊聊如何用 PrimeTime 读取 .lib 文件,以及怎么设置 PVT 条件。到时候我会演示一些实际命令,保证你听完就能上手。