第四节:输入文件详解 — .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 分成四个部分:

  1. 仿真器设置:选 Hspice 还是 Spectre,精度怎么设
  2. 输入波形定义:slew 的范围、步长
  3. 输出负载定义:cap 的范围、步长
  4. 测量条件:阈值点、测量窗口

看个实际例子:

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 算出来的理论值对比一下。如果差太多,赶紧查。别等到跑完几百个单元才发现问题,那真是欲哭无泪。

好了,关于这三个文件,今天就聊这么多。下一节我们会讲怎么搭建仿真环境,到时候我会带着大家一步步配起来。有什么问题,欢迎随时交流。