4. 器件模型与PDK基础:PDK概念、模型文件加载、Corner设置与环境变量

各位同学,咱们今天聊聊PDK。说实话,我刚入行那会儿,第一次拿到代工厂的PDK包,打开一看,好家伙,几百个文件,头都大了。后来摸爬滚打几年,才慢慢搞明白这东西到底该怎么用。

PDK,全称是Process Design Kit,工艺设计套件。说白了,它就是代工厂给你的一整套“积木”。你想想看,你要在某个工艺节点上设计电路,总得知道管子长什么样、电阻电容有多大、寄生参数怎么算吧?PDK就是干这个的。

4.1 PDK里到底有什么?

一个完整的PDK包,通常包含这几样东西:

  • 器件模型:MOS管、电阻、电容、电感、二极管等所有可用器件的SPICE模型
  • 工艺文件:版图设计规则、层次定义、显示文件等
  • 标准单元库:数字设计用的标准逻辑单元
  • Pcell:参数化单元,你调个W/L就能自动生成版图
  • 验证文件:DRC、LVS规则文件

嗯,这里要注意,不同代工厂的PDK结构差异很大。TSMC、SMIC、华虹各家都有自己的组织方式。我个人习惯是拿到PDK先看README文档,别急着上手。

4.2 模型文件:.lib 和 .scs

咱们做前仿真和后仿真,最核心的就是模型文件。Virtuoso里常见的模型文件格式有两种:

文件后缀 格式说明 典型用途
.lib Spectre标准模型库格式 前仿真、后仿真通用
.scs Spectre电路描述文件 包含子电路定义、模型参数
.mdl 模型文件(老格式) 兼容老版本PDK

我在项目中遇到过一件事:有个同事把.scs文件当.lib加载,结果仿真死活跑不通。其实这两个文件内容结构不一样,.lib是纯模型参数,.scs可以包含子电路和模型定义。加载的时候一定要看清楚。

4.3 模型文件怎么加载?

在Virtuoso ADE L/XL中加载模型文件,有几种方式:

  1. 图形界面加载:Setup -> Model Libraries,添加模型文件路径
  2. 命令行加载:在仿真网表中直接include模型文件
  3. 通过工艺文件自动加载:设置好工艺库,Virtuoso自动关联

我个人推荐第三种方式,省心。但如果你要手动加载,代码长这样:

// 在ADE的Model Libraries设置中
// Section: Model Library File
// 添加如下内容
// 注意路径要写绝对路径或者相对路径

// 典型加载方式
include "/home/pdk/tsmc28nm/models/spectre/t28_models.lib" section=tt

// 或者加载.scs文件
include "/home/pdk/tsmc28nm/models/spectre/t28_models.scs"
⚠️ 重要提醒:模型文件路径中不要有中文、空格、特殊符号。我曾经因为路径里有个空格,查了整整两天才找到问题。Virtuoso对路径很敏感,老老实实用英文路径。

4.4 Corner设置:tt, ff, ss

Corner,工艺角。说白了就是代工厂告诉你:我的工艺不是完美的,管子参数会有波动。你得保证你的电路在所有波动范围内都能工作。

常见的Corner有:

  • tt:Typical Typical,典型工艺角,管子速度中等
  • ff:Fast Fast,快工艺角,管子速度快、阈值电压低
  • ss:Slow Slow,慢工艺角,管子速度慢、阈值电压高
  • sf:Slow Fast,NMOS慢、PMOS快
  • fs:Fast Slow,NMOS快、PMOS慢

为什么会这样?因为晶圆制造过程中,掺杂浓度、氧化层厚度、温度等都会有微小变化。代工厂通过大量测试数据,统计出这些Corner参数。

在Virtuoso中设置Corner,通常是在模型加载时指定section:

// 在Model Libraries中设置不同的Corner
// 典型Corner设置示例

// tt corner
include "t28_models.lib" section=tt

// ff corner  
include "t28_models.lib" section=ff

// ss corner
include "t28_models.lib" section=ss

// 也可以同时加载多个Corner,在仿真时切换
// 我习惯的做法是创建一个corner变量
// 然后在模型路径中使用变量替换
💡 个人经验:我建议你至少跑tt、ff、ss三个Corner。如果时间允许,再加上sf和fs。有一次我做LDO设计,tt corner下表现完美,结果ff corner下相位裕度只剩30度,差点翻车。Corner仿真真的不能省。

4.5 环境变量设置

环境变量这东西,说白了就是告诉系统:我的PDK放在哪、用什么工艺、模型文件在哪。设置好了,一劳永逸。

常用的环境变量:

环境变量 作用 示例值
CDS_Netlisting_Mode 网表生成模式 Analog
MGC_WD PDK工作目录 /home/pdk/tsmc28nm
CDS_LOAD_ENV 加载环境变量文件 TRUE
SPECTRE_DEFAULTS Spectre默认选项 -E

在.cshrc或.bashrc中设置:

# 在.bashrc中添加
export CDS_Netlisting_Mode=Analog
export MGC_WD=/home/pdk/tsmc28nm
export CDS_LOAD_ENV=TRUE

# 或者使用.cdsinit文件
# 在Virtuoso启动时自动加载
setenv CDS_Netlisting_Mode Analog

🔑 关键点:环境变量设置好后,记得source一下或者重新打开终端。我见过太多人改了.bashrc不source,然后跑来问我为什么没生效。

4.6 避坑指南

最后,分享几个我踩过的坑:

  • 模型版本不匹配:PDK版本和Virtuoso版本要对应。我曾经用老PDK配新Virtuoso,仿真结果全是错的。
  • Corner命名差异:不同代工厂的Corner命名可能不同。有的叫tt/ff/ss,有的叫typical/fast/slow。一定要看文档。
  • 模型文件权限:确保你有读取权限。chmod 644是个好习惯。
  • 路径硬编码:不要在网表里写死绝对路径。用环境变量或者相对路径,方便移植。

嗯,PDK这块内容其实挺多的。今天咱们先把概念和基本操作理清楚。下一章我会讲怎么在Virtuoso里实际搭建仿真环境,到时候咱们再细聊。