简介:中芯国际55nm CMOS工艺PDK设计套件,面向基于Cadence平台的模拟、射频与混合信号IC设计工程师与研究人员。包内含器件模型、DRC/LVS规则文件、RC提取配置、StarRC相关工具及RF专用模型等,能够支撑从原理图仿真到版图验证的完整设计流程。压缩包共2000个文件,主要类型包括tag、oa、png、dm、dat等,其中oa为Cadence数据库文件,png为版图截图便于查看,dat为规则或模型数据,整体约810MB。内容预览中可见SMIC_CalDRC与LVS规则、mosfets.Cat模型、release_note等关键文件,目录模块划分清晰(如XRC_ORI、models、emxkit、DRC_ORI、LVS_ORI等),便于设计者按需取用。已有5284人学习下载,适合需要快速搭建55nm RF PDK设计环境、进行工艺验证与仿真的进阶用户。 上周帮团队在Cadence Virtuoso里折腾一个PDK挂载问题,他们手里就握着这样一串文件名:smic55ll_ulp_rf_09121825_oa_cds_v1.16_0.zip。说实话,这名字第一眼看过去像随机字符串,但干这行久了,扫一眼基本就能判断出这是SMIC 55纳米低漏电超低功耗射频工艺的PDK,基于OA(OpenAccess)数据库格式,专门给Cadence工具链用的。很多刚入门的模拟射频工程师,拿到这种zip包后第一反应是直接解压然后往cds.lib里加路径,结果一堆Pcell错误、图层丢失、模型找不到,最后只能找前辈或代工厂FAE救火。这篇文章就从文件名拆解开始,把这类工艺PDK的安装、目录结构、RF器件使用和新版本兼容问题一次讲透,适合正在做射频前端、低功耗模拟链路,以及被Virtuoso库里各种诡异报错折腾到头秃的版图工程师们参考。
1. 文件名里藏着的工艺平台信息:smic55ll_ulp_rf 逐段拆解
代工厂的PDK通常不叫“55nm_pdk_v1.zip”这种通俗名字,而是用一串由工艺节点、器件选项、数据库格式、工具平台、版本号拼接成的代号。看懂这串代号,相当于在安装之前就知道了这个包里是什么类型的东西,以及该往哪个工具链上挂。
1.1 55LL与ULP:不只是“低功耗”三个字
55ll指SMIC 55纳米工艺里的LL(Low Leakage)变体,主要优化目标是降低静态功耗和漏电流,适合IoT、可穿戴设备里那些对电池续航极其敏感的芯片。ulp一般对应Ultra Low Power,和LL可能同时存在,也可能指额外的超低功耗器件选项。不管具体定义如何,核心就是:这包不是普通数字逻辑工艺PDK,而是面向低功耗模拟/射频混合信号设计的版本,里面会带低阈值、高阈值、耗尽型等不同Vt类型的晶体管参数,还会配套相应的spectre/hspice模型文件。
我在实际项目里看到过不少人忽略ll和ulp的区别,随手拿一个普通逻辑PDK的techfile直接attach到新库上,结果版图图层映射完全错乱,DRC/LVS跑出来的错误根本无法解释。原因很简单,不同工艺变体在well注入、氧化层厚度、器件几何约束上都会有差异,PDK里的图层定义、design rule deck、模型corner都不通用。
1.2 RF、09121825、oa_cds和版本号的真实含义
rf可能是整个文件名里最能区分定位的字段。它不是指“射频封装”或“射频板级”,而是指代工厂在PDK里专门加入了RF器件模型和物理验证deck,比如RF LDMOS(虽然55nm不一定有)、MIM电容、电感、片上传输线、变容器、射频MOS管的大信号模型等。如果你的项目只是做低频模拟,这个字段用处不大;但如果你在画射频开关、LNA、PA或VCO,没有RF模型库,仿真结果基本是空中楼阁。
09121825这串数字常见格式是日期戳,比如2018年9月12日或2018年9月25日,也可能是产品批次/代码。它告诉我们这个包是什么时候从代工厂发布的,对追溯已知问题很有用。曾经有个团队拿着一个老版本PDK,连spectre模型都出现了器件参数缺失,最后查出来是日期戳对应的早期版本发布记录里明确写了一个已知bug,升级到后续版本就解决了。
oa_cds指的是OpenAccess数据库加Cadence Design System环境。简单理解,OA是Cadence工具链使用的标准数据库格式,cds则代表面向Cadence Virtuoso系列平台,而不是Synopsys的Pcell或Mentor的某套环境。v1.16_0是PDK版本号,每次代工厂发布新版本都会改这里,使用前最好去官网或FAE渠道确认一下release note。
2. 解压之后别急着用:PDK目录结构与安装前的关键认知
很多工程师拿到zip包以后习惯性双击解压,看到一堆文件夹就开始迷茫。其实PDK目录结构是高度规律化的,花五分钟扫一眼,就能判断这个包全不全、该不该继续装下去。
2.1 PDK目录里的常见面孔:techfile、pcell、skill、lib.defs
一个合格的代工厂PDK,解压后至少能看到以下几类内容:
| 类型 | 典型文件/目录 | 作用 |
|---|---|---|
| 工艺文件 | techfile.tf、display.drf、layer.map | 定义图层、颜色、层次映射 |
| 参数化单元 | pcells/、pcellPcell/ | Pcell源码和编译后的单元,用于生成可变尺寸的MOS、电阻、电容 |
| Skill脚本 | skill/、pcellSetup.il、libInit.il | 在Cadence里加载PDK环境、初始化Pcell |
| 模型文件 | models/、spectre/、hspice/ | 各corner下的器件模型,供仿真器调用 |
| 物理验证 | calibre/、assura/、qrc/ | DRC/LVS rule deck和寄生参数提取文件 |
| 库定义 | cds.lib、lib.defs | 告诉工具哪些库存在以及库路径 |
拿到包之后先看techfile.tf和pcellSetup.il是否存在,这两个文件是Virtuoso识别工艺和生成Pcell的关键。如果缺了,后期大概率会出现PDK库能打开但器件全部“无法创建”的情况。
2.2 OA与CDS版本:为什么这个包要叫oa_cds
老工程师应该记得,早期的SMIC PDK还会提供oa_cds和oa_synopsys等不同版本,甚至同一个工艺会出现CDS和SNPS两个安装包。选择依据很简单:你的主流程是Cadence Virtuoso还是Synopsys Custom Compiler。oa_cds意味着它是按Cadence的OA数据库规范打包的,Pcell用Cadence的Skill/CDF框架实现,工具链解析时会直接识别。
这里特别提醒:不要以为有了oa_cds就万事大吉。OA本身也有版本差异——IC615、IC6.1.8、IC23.1(Virtuoso Studio)对OA的API兼容性不完全相同。有的老PDK里包含的Pcell是用老版本Skill写的,在新版Virtuoso Studio里直接load会报nil或函数未定义。遇到这种情况,先检查PDK官方文档里写的支持版本,再检查工具链版本,不要改PDK脚本硬刚,不然改到最后都不知道是模型错了还是脚本错了。
3. Virtuoso里挂载这个PDK的完整流程与实测记录
知道结构以后,真正开始操作。这里记录一套从解压到跑通Pcell的完整流程,以及我在多个版本Virtuoso里实测踩过的问题。
3.1 环境变量与cds.lib:挂库之前的准备工作
先找个安静、没有特殊字符的绝对路径解压,比如/home/work/tech/smic55ll_ulp_rf_v1160。我见过有人把PDK直接放在桌面带空格和中文的目录里,结果Cadence启动时路径解析直接崩掉,这种低级错误排查起来非常费时间。
解压命令比较简单:
mkdir -p /home/work/tech cd /home/work/tech unzip smic55ll_ulp_rf_09121825_oa_cds_v1.16_0.zip然后检查解压出来的目录权限。PDK里的Skill脚本和Pcell文件如果没有读权限,Virtuoso加载时会静默失败,最典型的症状是pcellSetup.il执行完但没有产生任何菜单。建议统一给目录加上可读和可执行权限:
chmod -R a+rX /home/work/tech/smic55ll_ulp_rf_09121825_oa_cds_v1.16_0接下来是环境变量。不同的PDK对环境变量的要求不一样,最通用的是设置PDK根路径:
export SMIC_PDK_DIR=/home/work/tech/smic55ll_ulp_rf_09121825_oa_cds_v1.16_0如果PDK自带的skill脚本里写死了这个变量名,不设的话加载后会找不到techfile.tf。项目启动Virtuoso时,还要在项目的cds.lib里引用PDK库。简单做法:
INCLUDE /home/work/tech/smic55ll_ulp_rf_09121825_oa_cds_v1.16_0/cds.lib3.2 从解压到跑通Pcell:逐步操作记录
启动Virtuoso后,基本流程是这样的:
- 在CIW窗口的File菜单里找到
Load,执行PDK自带的初始化脚本。命名通常是pcellSetup.il、init.il或libInit.il。执行命令等价于CIW输入:load "/home/work/tech/.../pcellSetup.il"。 - 检查Library Manager里是否出现了PDK库,比如
S55LLULP_RF或S55LLULP_Base。如果没出现,多半是cds.lib里的路径没写对。 - 新建一个自己的Library,并attach到PDK工艺库上。操作路径是
Library Manager → Edit → Library Properties → Attach,选择PDK库作为参考工艺库。 - 在
Create Instance里输入器件名,比如nch、pch、rnpos、电容等,看看能否自动弹出CDF参数表单。
我是建议先建一个Testbench库,只放一个最小的nch器件,然后立刻跑一次spectre仿真,确认model library找到了、DC工作点正常。这一步后面所有复杂电路的基础,基础通了,后面LNA、VCO的仿真才有意义。
3.3 那些年我们都踩过的权限和路径坑
PDK这类东西最大的特点是:目录路径、权限、环境变量组合不对,报错不会马上出现,而是等你画完版图或者跑仿真时才猛然冒出来。
最常见的坑是csh和bash环境变量不兼容。老一代PDK的安装脚本很多是csh写法,如果你在bash里执行source,会出现一堆无法识别命令。我自己的习惯是看文件头,如果里面写的是#! /bin/csh,就老老实实用csh执行,或者在bash里先切换到csh再source。
路径坑也值得说。有人喜欢把PDK目录软链到/home/designer/pdk这种短路径下,理论上不影响,但有的PDK脚本会调用getcwd或系统库解析真实路径,软链会导致找不到相对路径下的模型文件。所以我在团队里统一规定,PDK解压路径必须使用真实物理路径,不搞软链。
还有一个常见问题是Permission denied,但你不是root,也没法直接改PDK目录所有权限。这时请检查目录及其上层目录是否有x权限,有时是父目录没有执行权限,导致工具无法进入次级目录。
4. 射频PDK不只是多几个器件:真正要留意的RF特性与仿真链路
如果只是要做个低功耗运放,普通模拟PDK就够了。但这个包的名字里带了rf,说明它要服务的是射频链路设计。这部分内容不是简单多几个电感符号,而是整套仿真和验证方法的差异。
4.1 RF器件与电感模型:这个PDK区别于普通数字PDK的地方
RF PDK里最有特色的通常是这几类内容:
- RF MOSFET,除了常规的宽长比、指条数参数外,还会提供栅电阻、寄生电容、版图相关性的优化选项,方便搭建片上LNA、混频器输入级。
- 片上电感,通常有八边形、方形、对称差分式等几种结构,PDK会给出电感值、Q值、自谐振频率的仿真模型,甚至支持调用EM仿真工具提取电磁特性。
- MIM电容和变容器,在射频匹配网络里用得很多,PDK对这些器件的寄生和温度系数会有更详细的模型定义。
用这些器件的时候,要注意Pcell里生成的instance默认带一些寄生态,比如电感的底层metal pattern和中间抽头。这些在低频仿真里可能看不出来,但在谐波平衡或S参数仿真里影响很大。
我看过有人直接在Virtuoso里调用一个电感symbol,然后一股脑把其他模型全设成理想,结果仿真出来LNA增益和实际芯片差了快5dB。后来发现是PDK的电感模型需要关联一个专门的model library,而项目的spectre.ini里根本没include进去。所以射频仿真前,请重点确认PDK release note里提到的三个东西:corner模型文件、电感EM模型文件、QRC寄生提取文件。
4.2 与Cadence Virtuoso Studio等新环境的兼容问题
近年Cadence已经用Virtuoso Studio作为新版本的统称,很多老工程师发现自己手里的旧PDK包在新版本里装不上了。这不是PDK坏了,而是Skill API版本和OA版本有代差。
比如在Virtuoso Studio(基于IC23.1)上加载老版本PDK的pcellSetup.il,可能报unbound variable或function undefined。遇到这种情况,第一选择是去代工厂官网找对应新版本PDK;如果没有新版本,再考虑用兼容模式启动工具,比如指定老版本的skill编译器。千万不要自己去改PDK源码,PDK里的Pcell脚本上千行,改一个函数名可能引起连锁报错。
我之前在用某个老版本SMIC 55RF PDK时,就是因为它只支持到IC6.1.8,团队最后直接在服务器上多部署了一套IC6.1.8,专门用来做老库维护。虽然工具版本低一点,但至少不会被Pcell问题卡住。
顺带提一句,有些同事会把rfsoc47dr rf convert这类数据转换任务和模拟PDK一起混着做。如果工作流里既有射频采样SoC的数字/射频数据转换,又需要搭模拟前端,建议在项目初始化时就把PDK版本和数据转换流程隔离开,避免两套工具链的环境变量互相污染。
5. 误操作恢复与日常维护:主目录rm -rf之后的补救思路
在Linux下搞设计,rm -rf大概是最刺激的命令之一。网上也经常有人问“主目录rm rf了怎么办”。这种事我在实验室里见了好几次,包括有人手滑在$HOME目录下敲了带递归的删除命令,结果整个PDK环境和项目文件一起消失了。
5.1 当你在主目录手滑执行了rm -rf
先说最坏情况下的应急思路。如果你刚刚删除了文件,且还有进程占用该文件,比如Virtuoso还开着,那么文件其实还没完全从磁盘上释放。在Linux下,可以通过/proc/<PID>/fd路径找回已被打开但被删除的文件。
步骤大概是:
# 找到占用PDK文件的进程PID lsof +L1 | grep smic55ll_ulp_rf # 查看该进程打开的文件描述符对应的删除文件 ls -l /proc/<PID>/fd # 将对应的fd复制回来 cp /proc/<PID>/fd/17 /home/work/tech/recover_file.tf这个方法只能找回那些正被进程占用的文件,如果文件已经彻底关闭并且没有备份,恢复难度极大。所以相比恢复,我更建议从源头预防:
# 给rm设置交互或保险别名 alias rm='rm -i' alias rmrf='rm -rfI'5.2 防止PDK重装的快捷备份手法
PDK本身是可以通过zip重新下载的,真正麻烦的是你在PDK上做的自定义pcell参数、display资源修改、以及自己写的工艺attach记录。所以日常维护时别去动PDK原始目录里的东西,把自己修改过的配置单独放一目录。
最简单的备份是打包PDK目录,但PDK体积动辄几个GB,天天打包不现实。我会在项目里维护一个pdk_custom/目录,存放:
- 自己修改过的
display.drf - 自定义的
cds.lib片段 - 常用的 model library include 配置
- 每次PDK升级前导出的Pcell清单
这样即使PDK目录被误删,重新解压官方zip后,把自定义内容放回去就能快速恢复工作环境,不用靠记忆去重做每一步配置。
6. 版本升级与多项目环境的避坑清单
PDK版本升级是个系统工程,不能只在旧项目里解压新包后直接换库。v1.16_0这个版本号听起来只是小版本变化,但放到一个新项目里,你可能要重新接受整套rule deck和模型corner。
6.1 v1.16相比旧版本的变化点
代工厂一般会随PDK发布一个release_note,里面写了相比前一版本的变更。这些变更可能包括:
- 更新了某些RF器件的寄生模型参数,也许会让仿真结果更好看,也可能让原设计裕量不足。
- 修复了之前Pcell在特定工艺角下的CDF参数错误。
- 更新了calibre rule deck,导致原有版图在某些图层上多出新的DRC违例。
所以升级版本后,我建议不要直接在老项目里刷新PDK。正确做法是在新目录下解压新包,挂载到测试库,跑一遍最小设计规则验证、一次DC仿真、一次Pcell实例生成,确认没问题后再把工作环境切过去。
6.2 一个项目的标准PDK检查清单
每次替新项目初始化PDK环境时,我都会按这个清单走:
techfile.tf能否被Virtuoso正常加载,图层显示是否和PDK文档一致。- 新建library并attach后,能否从PDK库里调用至少3种器件:普通逻辑管、射频管、电感。
- 对普通管做DC仿真,确认model library包含且模型名能正确解析。
- 对电感受一个SP仿真,确认输出S参数不是零或断点。
- 跑一次DRC,确认rule deck路径没有报错。
- 跑一次LVS,确认版图和原理图能正常对应。
- 备份一份
cds.lib和display.drf到项目目录,避免下次启动时找不着。
这套清单看着无聊,但能救命。我见过一个项目跑了一个月,最后发现模型corner一直用的旧作废文件,整个仿真的功耗和增益曲线都偏乐观,问题就出在安装PDK时没有做第3步检查。
最后分享一个我自己的小习惯:每次解压完PDK,先不急着重装系统,用find . -name "*.il"把PDK目录下所有Skill脚本列出来,快速扫一遍。很多时候,Pcell无法创建、菜单不出现的根因,其实藏在某个脚本的加载路径里。提前知道这些东西,能省掉后面大量的试错时间。
本文还有配套的精品资源,点击获取