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中加载模型文件,有几种方式:
- 图形界面加载:Setup -> Model Libraries,添加模型文件路径
- 命令行加载:在仿真网表中直接include模型文件
- 通过工艺文件自动加载:设置好工艺库,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"
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变量
// 然后在模型路径中使用变量替换
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里实际搭建仿真环境,到时候咱们再细聊。