第四节:输入文件详解 — .plib、.ctrl、.tch 三剑客
好,咱们今天聊聊特征化最核心的三个输入文件。说实话,我刚入行那会儿,看到这三个文件头都大了。.plib、.ctrl、.tch,每个都几百行,稍不留神就报错。但后来我发现,搞懂了它们,特征化就成功了一半。
一、.plib 库文件结构 — 标准单元的“身份证”
.plib 文件,全称是 Process Library,但它其实更像一个模板。它告诉工具:你要特征化的单元长什么样,有哪些引脚,有哪些时序弧。
我习惯把 .plib 分成三大块来看:
- 全局定义:库名、工作条件、电压温度
- 引脚定义:每个 pin 的方向、电容、转换时间
- 时序弧定义:从输入到输出的延迟、约束条件
给你看个典型的片段:
library (my_library) {
delay_model : "table_lookup";
in_place_swap_mode : "match_footprint";
default_cell_leakage_power : 0;
default_fanout_load : 1.0;
default_input_pin_cap : 0.01;
default_output_pin_cap : 0.0;
default_inout_pin_cap : 0.01;
cell (AND2X1) {
area : 10;
cell_footprint : "and2";
pin (A) {
direction : input;
capacitance : 0.005;
rise_capacitance : 0.005;
fall_capacitance : 0.005;
}
pin (Y) {
direction : output;
capacitance : 0.0;
function : "A & B";
timing () {
related_pin : "A";
timing_sense : positive_unate;
cell_rise (scalar) {
values ( "0.05" );
}
cell_fall (scalar) {
values ( "0.04" );
}
}
}
}
}
关键点:.plib 里的 timing_sense 千万别写错。positive_unate 表示同相,negative_unate 表示反相。我见过有人把与非门写成 positive,结果时序全反了,流片回来才发现… 嗯,那滋味不好受。
二、.ctrl 控制文件配置 — 特征化的“遥控器”
.ctrl 文件,说白了就是告诉工具怎么跑。你想想看,同样的单元,不同的工艺角、不同的输入斜率、不同的负载,跑出来的结果天差地别。.ctrl 就是用来控制这些变量的。
我个人习惯把 .ctrl 分成四个部分:
- 仿真器设置:选 Hspice 还是 Spectre,精度怎么设
- 输入波形定义:slew 的范围、步长
- 输出负载定义:cap 的范围、步长
- 测量条件:阈值点、测量窗口
看个实际例子:
set_control {
simulator : hspice;
simulator_path : "/tools/synopsys/hspice/bin/hspice";
temp : 25;
voltage : 1.8;
slew_derate_from_input_waveform : 0.5;
input_threshold_pct_fall : 50;
input_threshold_pct_rise : 50;
output_threshold_pct_fall : 50;
output_threshold_pct_rise : 50;
slew_lower_threshold_pct_fall : 10;
slew_lower_threshold_pct_rise : 10;
slew_upper_threshold_pct_fall : 90;
slew_upper_threshold_pct_rise : 90;
input_net_slew : 0.01, 0.02, 0.05, 0.1, 0.2, 0.5;
output_net_load : 0.01, 0.02, 0.05, 0.1, 0.2, 0.5;
}
我的经验:slew 和 load 的范围别设太宽。我曾经为了省事,把 slew 从 0.001 设到 10,结果跑了一周没跑完。后来学乖了,根据实际工艺库的典型值来设,一般 5-7 个点就够了。
三、.tch 技术文件参数解析 — 工艺的“说明书”
.tch 文件,技术文件,它描述的是工艺本身的特性。比如晶体管的模型参数、互连线的寄生参数、温度电压的依赖关系。
这里我重点说几个容易踩坑的参数:
| 参数名 | 含义 | 常见坑 |
|---|---|---|
| Vth | 阈值电压 | 不同 corner 下 Vth 变化很大,要确认模型是否匹配 |
| Rsh | 方块电阻 | 金属层不同,Rsh 差好几倍,别用错层 |
| Cox | 栅氧化层电容 | 这个值直接影响输入电容,错了时序全偏 |
| K1, K2 | 体效应系数 | 老工艺忽略还行,先进工艺必须考虑 |
一个典型的 .tch 片段:
technology (my_tech) {
temp_range : -40, 125;
voltage_range : 1.62, 1.98;
transistor_model : "bsim4";
transistor_level : 49;
interconnect_metal (M1) {
resistance_per_unit : 0.08;
capacitance_per_unit : 0.15e-15;
thickness : 0.5e-6;
}
interconnect_metal (M2) {
resistance_per_unit : 0.06;
capacitance_per_unit : 0.12e-15;
thickness : 0.6e-6;
}
}
注意:.tch 里的温度范围一定要和 .ctrl 里的一致。我曾经遇到过 .tch 设了 -40~125,但 .ctrl 只跑了 25 度,结果工具报了个警告我没注意,最后生成的库在高温下时序差了 30%。从那以后,我每次跑之前都会 double-check 这两个文件的温度设置。
四、三个文件的协作关系
这三个文件不是孤立的。它们的关系,我打个比方:
- .plib 是“剧本”,告诉工具要演什么戏
- .ctrl 是“导演”,告诉演员怎么演
- .tch 是“舞台”,告诉演员在什么环境下演
缺一个,戏就演不下去。参数不一致,戏就演歪了。
举个例子,.plib 里定义了一个反相器的输入电容是 0.005pF,但 .tch 里晶体管的 Cox 算出来输入电容应该是 0.008pF。这时候工具会怎么处理?它会以 .plib 为准。但问题是,.plib 里的值是你自己填的,如果填错了,后面生成的库就全错了。
避坑指南:我建议每次新建一个工艺库时,先跑一个最简单的单元(比如反相器),然后用 .plib 里的电容值和 .tch 算出来的理论值对比一下。如果差太多,赶紧查。别等到跑完几百个单元才发现问题,那真是欲哭无泪。
好了,关于这三个文件,今天就聊这么多。下一节我们会讲怎么搭建仿真环境,到时候我会带着大家一步步配起来。有什么问题,欢迎随时交流。