第三章:工艺库与标准单元——CMOS工艺基础、标准单元库、时序库、物理库

各位同学,欢迎来到第三章。这一章,我们要聊的是数字后端工程师吃饭的家伙——工艺库与标准单元。

说实话,我刚入行那会儿,觉得库文件就是个黑盒子。工具读进去,我跑流程,完事。直到有一次,一个时序违例查了我整整三天,最后发现是选错了驱动强度的单元。嗯,从那以后,我再也不敢小看这些库文件了。

3.1 CMOS工艺基础:芯片的“砖瓦”

先说说CMOS工艺。你想想看,我们后端设计最终要落到硅片上,而硅片上就是一堆NMOS和PMOS晶体管。CMOS,全称是互补金属氧化物半导体,说白了就是NMOS+PMOS配对使用。

为什么叫“互补”?因为NMOS导通时PMOS关断,PMOS导通时NMOS关断。这样静态时几乎没有电流流过,功耗极低。我当年面试时被问到“CMOS为什么功耗低”,答出这一点,面试官点了点头。

工艺节点,比如180nm、28nm、7nm,指的是晶体管栅极的最小长度。数字越小,晶体管越小,芯片能塞进去的功能越多。但代价是什么?漏电流变大,设计规则更复杂。我在28nm项目上吃过亏——同样的设计,从40nm迁移到28nm,功耗反而没降下来,就是因为漏电流没控好。

核心概念:CMOS工艺中,PMOS和NMOS成对出现,构成反相器、与非门等基本逻辑单元。这些基本单元,就是标准单元的“细胞”。

3.2 标准单元库:你的乐高积木盒

标准单元库,你可以把它想象成一盒乐高积木。里面有反相器、与非门、或非门、触发器、锁存器……每个积木都有固定的高度(行高),宽度则根据驱动能力不同而变化。

库文件通常包含三大类:

  • 时序库(Liberty格式,.lib):描述每个单元的时序信息,比如延迟、转换时间、建立保持时间。
  • 物理库(LEF格式,.lef):描述每个单元的物理尺寸、引脚位置、布线阻挡层。
  • 工艺文件(.tf/.tech):描述金属层、通孔、设计规则等工艺参数。

我个人习惯,拿到一个新工艺库,第一件事就是打开.lib文件,看看里面有哪些驱动强度的单元。比如一个两输入与非门,可能有NAND2_X1、NAND2_X2、NAND2_X4……X后面的数字越大,驱动能力越强,面积也越大。

小技巧:布局布线时,不要一上来就用大驱动单元。先用中等驱动(X2或X4)跑一遍,看时序瓶颈在哪里,再针对性替换。我曾经见过新手直接全用X8,结果面积爆炸,绕线都绕不通。

3.3 时序库:NLDM与CCS

时序库,说白了就是告诉工具:这个单元输入变化时,输出要多久才能响应。

目前主流有两种模型:

模型 全称 特点 适用场景
NLDM Non-Linear Delay Model 基于查找表,简单快速 老工艺(180nm以下)
CCS Composite Current Source 基于电流源模型,精度高 先进工艺(28nm及以下)

NLDM是怎么工作的?它把延迟建模成输入转换时间(slew)和输出负载电容(load)的二维查找表。比如:

cell (NAND2_X1) {
  pin (Y) {
    timing () {
      related_pin : "A";
      timing_type : "combinational";
      cell_rise (delay_template_7x7) {
        index_1 ("0.01, 0.1, 0.5, 1.0, 2.0, 5.0, 10.0"); // 输入slew
        index_2 ("0.01, 0.1, 0.5, 1.0, 2.0, 5.0, 10.0"); // 输出负载
        values ( \
          "0.05, 0.12, 0.30, 0.55, 1.10, 2.80, 5.60", \
          "0.08, 0.15, 0.33, 0.58, 1.13, 2.83, 5.63", \
          ...
        );
      }
    }
  }
}

你看,工具根据输入slew和输出load,查表插值得到延迟。CCS则更复杂,它用电流源模型模拟晶体管的实际充放电行为。我在7nm项目上对比过,CCS算出来的时序和实际硅片测量结果误差在2%以内,而NLDM可能差到5%-8%。

注意:如果你用的是先进工艺,千万别偷懒用NLDM。我曾经在一个5nm项目上,有人为了省仿真时间用了NLDM库,结果后仿时序全红,重跑了一周才搞定。CCS虽然慢一点,但值得。

3.4 物理库:LEF文件详解

物理库,LEF格式,描述的是单元的“长相”。

一个典型的LEF单元定义长这样:

MACRO NAND2_X1
  CLASS CORE ;
  ORIGIN 0 0 ;
  FOREIGN NAND2_X1 0 0 ;
  SIZE 0.56 BY 5.04 ;
  SYMMETRY X Y R90 ;
  SITE core ;
  PIN A
    DIRECTION INPUT ;
    USE SIGNAL ;
    PORT
      LAYER M1 ;
        RECT 0.14 2.52 0.28 3.08 ;
    END
  END A
  PIN Y
    DIRECTION OUTPUT ;
    USE SIGNAL ;
    PORT
      LAYER M1 ;
        RECT 0.28 2.52 0.42 3.08 ;
    END
  END Y
  OBS
    LAYER M1 ;
      RECT 0.00 0.00 0.56 5.04 ;
  END
END NAND2_X1

这里要注意几个关键点:

  • SIZE:单元尺寸,宽度×高度。所有标准单元高度相同(行高),宽度不同。
  • PIN:引脚位置,工具根据这个来连线。
  • OBS:阻挡层,告诉工具这块区域不能走线。

我记得有一次,一个实习生把LEF里的OBS层搞错了,导致工具在单元内部走线,DRC报了几千个错误。排查了半天,才发现是OBS定义漏了一层金属。

避坑指南:拿到新库后,建议用工具(比如Innovus或ICC2)的check_library命令跑一遍。我曾经因为LEF里一个pin的坐标写错了,导致CTS时时钟树绕了远路,时序直接崩了。检查库文件,花10分钟,省10小时。

3.5 库文件的选择与验证

实际项目中,你可能会面对多个库文件:

  • 典型工艺角(TT):用于常规分析
  • 最差工艺角(SS):用于setup检查
  • 最好工艺角(FF):用于hold检查

我个人习惯,在项目初期先用TT库跑一版,看看大概的时序和面积。等floorplan稳定了,再切到SS和FF做signoff。不要一上来就全工艺角跑,那会慢得让你怀疑人生。

另外,库文件版本一定要对齐。我见过有人用了.lib是v2020的,但.lef是v2018的,结果工具报了一堆不匹配的warning。虽然能跑,但结果不可信。

总结一下:工艺库和标准单元是后端设计的基石。CMOS工艺决定了你能用什么晶体管,标准单元库提供了逻辑功能,时序库告诉工具延迟多少,物理库告诉工具单元长什么样。四者缺一不可。

下一章,我们会聊到布局规划(Floorplanning),到时候我会讲讲怎么把这几百个标准单元摆到芯片上。嗯,那又是另一门学问了。


公众号:蓝海资料掘金营,微信deep3321