刚接触模拟IC设计时,很多人拿到一个新的工艺PDK,第一反应是直接打开 Virtuoso,新建一个 Library,拖一个 PMOS 进去,开始跑 DC 仿真。等仿真结果不对,再回头去查器件模型、查版图层次,才发现自己对 PDK 的理解只停留在“会调用器件”这一层。
真正的问题在于:会调用器件,不代表会识别器件。尤其是 Smic40nm 这类工艺节点,PDK 里一个 PMOS 不仅仅是一个 schematic 符号,它背后包含 CDF 参数、Pcell 版图、模型文件、物理验证规则和层次定义。如果不懂层次查看与结构分析,你很可能在电路设计阶段用了错误的宽长比,在版图阶段画错了器件方向,甚至在 LVS 阶段反复报错却找不到原因。
这篇文章以 Smic40nm PDK 中的 PMOS 器件为例,完整梳理一套“从 Library 到 Cellview、从 Schematic 到 Layout、从参数到层次”的识别方法。读完你会知道:PDK 器件到底由哪些部分组成、在 Virtuoso 里如何逐层展开查看、Pcell 打散后能看到什么、以及如何通过层次结构分析确认一个 PMOS 的真实实现。
1. 这篇文章真正要解决的问题
很多工程师使用 PDK 的方式是“黑盒式”的。Symbol 放在原理图上,L 和 W 填进去,仿真能跑通就完事。但遇到下面这些场景,黑盒式用法会立刻失效:
- 电路需要特殊尺寸的 PMOS,比如很大的 W,你直接填入 100u,但 PDK 中的 Pcell 是否支持?
- 版图阶段要对 PMOS 做 finger 拆分、dummy 添加,但你不清楚 Pcell 内部结构,只能手动画,结果 LVS 报错。
- 后仿提取寄生参数时,发现器件识别错误,根本原因是 PDK 层次和提取文件不匹配。
- 你需要把 Schematic 中的 PMOS 参数设置同步到 Symbol 上,却不知道参数在哪个层定义。
这背后是一个共性痛点:很多人没有建立“PDK 器件 = 符号 + 参数 + 版图 + 模型 + 规则”的完整映射关系。
这篇文章要解决的,正是这个映射问题。以 Smic40nm PDK 的 PMOS 为例,逐步拆解每个层次视图,讲清楚每个层次存储什么信息,以及在实际工程中怎么用。读完你能做到三件事:
- 快速定位 PDK 中某个器件的所有相关文件与视图;
- 通过 Virtuoso 的层次查看功能,分析 PMOS 的 Pcell 内部结构和参数定义;
- 在 Layout 中识别 PMOS 的有源区、栅、阱、金属层连线以及寄生结构,避免 LVS 和寄生提取阶段踩坑。
2. PDK 是什么,以及 Smic40nm PDK 的特殊性
2.1 PDK 的本质
PDK(Process Design Kit,工艺设计套件)是晶圆厂提供给设计者的“接口层”。它把工艺制造信息翻译成 EDA 工具能够识别的格式。一个完整 PDK 通常包含:
- 原理图符号库(Schematic Symbol)
- 参数化单元(Pcell)
- 工艺文件(tf、display 文件)
- 模型文件(Spectre、HSPICE、ELDO 格式)
- 物理验证规则(DRC、LVS、RC extraction)
- 回调函数(Callbacks)与 CDF 参数定义
可以这样理解:PDK 是工艺厂和设计者之间的“翻译器”。工艺厂知道每一层怎么制造,设计者只知道电路怎么画,PDK 把这两者的语言统一起来。
2.2 Smic40nm 节点关注点
Smic40nm 是 SMIC 的 40nm 逻辑工艺节点,在消费电子、物联网、射频前端等领域的流片量都很大。相比更小节点(如 28nm、16nm、7nm),40nm 的物理效应没那么极端,但仍然存在几个需要认真对待的问题:
- 栅氧厚度变薄,器件的开启电压和漏电需靠模型准确描述;
- 阱和阈值电压调节注入的层次规划复杂,版图阶段如果层次用错,LVS 会在杂质层次上反复报警;
- 金属层数多,PMOS 的源漏接入方式直接影响寄生电阻。
因此,在 40nm PDK 中,识别器件不能只看“这个符号是不是 PMOS”,还要关注它的阱类型、阈值类型、偏置条件以及匹配结构。
2.3 PMOS 和 NMOS 的核心区别
PMOS 和 NMOS 都是 MOS 晶体管,但导电机制、载流子类型、阱结构、模型参数完全不同。
| 对比维度 | NMOS | PMOS |
|---|---|---|
| 载流子类型 | 电子 | 空穴 |
| 导电沟道 | 在 P 型衬底上形成的 N 型沟道 | 在 N 阱中形成的 P 型沟道 |
| 阈值电压方向 | 正阈值,增强型 NMOS 的 Vth 为正值 | 负阈值,增强型 PMOS 的 Vth 为负值 |
| 导通条件 | Vgs 大于 Vth | Vgs 小于 Vth(绝对值超过阈值) |
| 阱类型 | P 阱或 P 衬底 | N 阱 |
| 寄生二极管 | 从衬底到源漏的 PN 结 | 从 N 阱到源漏的 PN 结,方向相反 |
在版图上看,PMOS 器件的外围通常会被一圈 N 阱包围,并且 N 阱的接触孔需要接到最高电位(通常是 VDD)。这也是我们在层次查看时判断一个器件是 PMOS 还是 NMOS 的重要依据。
3. 环境准备与前置条件
要完成后续操作,需要一套可用的模拟 IC 设计环境。
3.1 软件环境
- 主流 EDA 工具:Cadence Virtuoso IC6.1.8 或更新的版本,用于原理图、版图和 Pcell 查看;
- 仿真工具:Cadence Spectre 或 MMSIM,用于器件特性验证;
- 物理验证工具:Siemens Calibre,用于 DRC/LVS/PEX,部分项目也用 Assura 或 PVS;
- PDK 版本:Smic40nm PDK,版本以项目实际使用的为准。
这里不强调具体版本号,因为不同代工厂、不同 PDK 版本在安装路径、文件和配置方式上会有差异。本文的通用思路是:先确认 PDK 的安装目录结构和配置文件位置,再决定如何在 EDA 工具中加载。
3.2 关键配置文件
在 .cdsinit 或 .cdsenv 中,通常需要包含:
# 加载 PDK 初始化文件示例 setenv SMIC40_PDK_PATH /path/to/smic40_pdk load(strcat(SMIC40_PDK_PATH "/libInit.il"))具体路径以你本机的 PDK 安装位置为准。加载成功后,Virtuoso 的 Library Manager 中会出现 PDK 基础库,通常包含smic40l、smic40ll之类的工艺库,以及analogLib、basic等通用库。
3.3 打开 PDK 器件的视图
以 PMOS 为例,在 Virtuoso Library Manager 中,进入包含 PMOS 器件的库,选择某个名为pmos或pch的单元,右键可以看到以下视图:
schematic:晶体管的原理图符号与管脚定义;symbol:用于原理图调用的图形符号;layout:Pcell 对应的版图视图;spectre:如果 PDK 额外提供了子电路模型,可能也会有;extracted:从版图提取的视图,通常在后仿阶段出现。
右键打开这些视图,就开始了真正的层次查看。
4. 核心流程拆解:PMOS 层次查看五步法
4.1 第一步:看 Schematic,建立电气连接认知
打开 PMOS 的schematic视图,先不要急着看版图,而是观察管脚。一个标准 PMOS 至少有四个端口:
D(Drain)G(Gate)S(Source)B(Bulk)
在 Smic40nm PDK 中,PMOS 的 Bulk 通常连接到 N 阱。有些 PDK 还会提供五个端口的版本,即把源和衬底分别引出,方便做深 N 阱隔离。实际使用时,需要根据电路要求选择合适的器件类型。
4.2 第二步:打开 Symbol,理解 CDF 参数
Symbol 视图只是图形,关键信息在 CDF 参数里。双击原理图中的 PMOS 符号,或者打开 CDF 编辑器,可以看到以下核心参数:
| 参数名 | 含义 | 典型设置 |
|---|---|---|
| Model name | 模型名称 | pch_25udl20 或类似命名,表示低漏电器件 |
| W | 沟道宽度 | 根据电路实际设置 |
| L | 沟道长度 | 根据电路实际设置 |
| Fingers | 叉指数量 | 默认 1 |
| Multiplier | 器件倍增数 | 原理图级并联 |
| Dummy | 是否添加虚拟器件 | 影响匹配精度 |
这些参数不是随意填写的。Pcell 在实例化时,会根据 W、L、Fingers 自动生成对应的版图。如果看到某个参数是灰色的,说明它受 PDK 回调函数控制,你改不了,或者改了也不生效。
4.3 第三步:打开 Layout,识别版图层次
在 Virtuoso 中打开 PMOS 的layout视图。这是 Pcell 动态生成的结果,你看到的不是固定图形,而是由工艺层组成的实际物理结构。需要重点识别以下层次:
- 有源区层(Active / OD)
- 多晶硅层(Poly)
- N 阱层(NWELL)
- 注入层(NIMP/PIMP,决定 Vth 调节)
- 接触孔(Contact / CT)
- 金属层(M1、M2 等)
以 PMOS 为例,它的版图结构通常是:NWELL 覆盖整个器件区域,Poly 横跨有源区形成沟道,有源区在 Poly 两侧分别形成 Source 和 Drain,P+ 注入层覆盖源漏区域。查找 NWELL 层是确认 PMOS 的最快方法。
4.4 第四步:打散 Pcell,查看内部真实结构
很多工程师不敢打散 Pcell,担心打散后无法恢复。实际上,在 Virtuoso 中打散是安全的,只要不开保存并写回原库,就不会破坏 PDK 库文件。推荐的做法是:先在 PDK 库中选中 PMOS,点击Edit -> Hierarchy -> Flatten Pcell,只打散当前实例,并把打散后的结果存到自己的 work library 中。
打散后你会看到:
- Pcell 实际上是多层图形堆叠的集合;
- 每一层图形都有明确的 Layer Name 和 Layer Number;
- 孔、金属连线、器件边界都是由程序生成的;
- 一旦打散,这些图形就失去了参数联动能力,所以不要用打散后的 Pcell 做最终版图。
这一步的意义是让你看懂 Pcell 的生成逻辑,而不是让你替代 Pcell。
4.5 第五步:结合剖面图验证理解
PDK 通常附带 Process Cross-section 文档,展示器件的纵向剖面结构。把 Layout 顶视图和剖面图对照起来看,就能建立“哪一层出图形,对应制造中的哪一步”的认知。
举例来说,PMOS 栅氧下方是 NWELL,沟道区域有多晶硅栅,Poly 两侧的源漏区有高浓度 P 型注入。剖面图上这部分看得非常清楚。
5. 完整命令与代码示例
下面提供几个常用 Skill 脚本,可以在 Virtuoso CIW 中直接执行,提高层次查看效率。
5.1 批量打开 Pcell 并读取 CDF 参数
; 文件路径:CIW 或 Skill Load 后执行 ; 功能:遍历指定库中所有 pmos cell,打印 CDF 参数名称和值 libName = "smic40l" cellName = "pmos" libId = ddGetObj(libName) cellId = libId->cells foreach(cell cellId if(cell->name == cellName then cdfId = cdfGetBaseCell(cellId) foreach(param cdfId~>parameters printf("Parameter: %s Default: %s\n" param->name param~>defValue) ) ) )这段代码读取 Smic40nm PDK 中 PMOS 的 CDF 参数定义。修改libName和cellName后可以用于其他器件。
5.2 打开 Layout 并列出所有层次
; 文件路径:CIW ; 功能:打开当前设计中的 layout,列出所有图形对象对应的层 cvId = geGetEditCellView() if(cvId~>layout then foreach(shape cvId~>shapes printf("Shape type = %s, Layer = %s, Purpose = %s\n" shape~>objType shape~>layerName shape~>purpose) ) else printf("当前 cellview 不是 layout,请先打开发版图。\n") )这个脚本对于检查 Pcell 打散后的层次非常有效。运行后你会看到 Poly、Active、NWELL、IMP、CT、M1 等层名以及它们的 purpose(drawing、pin、label等)。
5.3 查看当前所用技术文件的层次列表
; 文件路径:CIW ; 功能:打印技术文件中所有 layer 名称与编号的对应关系 techId = techGetTechFile(geGetEditCellView()) layers = techGetLayerMap(techId) foreach(layer layers printf("LayerName: %s Number: %d\n" layer~>name layer~>layerNum) )这个命令特别适合排查“为什么我在 Layout 里看不到某层”的问题。如果技术文件里本来就有该层,但 Layer 窗口没显示,就是显示文件的问题,而不是数据缺失。
5.4 检查版图中 PMOS 的识别结果
在 LVS 前后,我们常常想确认被识别出的器件数量。用 Calibre 的 RVE 工具可以查看,也可以用 Skill 检查:
; 文件路径:CIW ; 功能:检查当前版图中被 LVS 识别的 p_mos 子电路数量(依赖 LVS 输出) ; 说明:以下函数仅为示意,实际需结合 calibre 的 execute 结果 ; 使用 calibre -rve 查看结果文件,或直接在 virtuoso 中加载 svdb 报告更可靠的方式是在calibre -lvs跑完后,打开.lvs.report文件,查看:
pmos 器件识别数量:xx nmos 器件识别数量:xx6. 运行结果与效果验证
6.1 CDF 检查结果
执行 5.1 的脚本后,CIW 窗口会输出大量参数名。正常情况下你应该能看到:
model:指向 PDK 提供的 Spectre 模型名;w和l:默认为工艺最小或一个保守值;finger和multiplier:默认 1;dummy:可能有none、sourceDrain等选项。
如果输出的参数列表很少,或根本没有 PMOS 相关参数,说明 PDK 加载有问题,应检查.cdsinit是否成功执行。
6.2 Layout 层次显示验证
执行 5.2 的脚本时,如果当前打开的是打散后的版图,输出中应包含多行 Layer 名称和 Purpose。例如:
Shape type = rect, Layer = NWELL, Purpose = drawing Shape type = rect, Layer = ACTIVE, Purpose = drawing Shape type = path, Layer = POLY1, Purpose = drawing Shape type = rect, Layer = PIMP, Purpose = drawing Shape type = rect, Layer = CONT, Purpose = drawing出现 NWELL 和 PIMP,基本可以确认这是 PMOS。如果只看到 ACTIVE 和 POLY 而没有注入层,说明 LVS 可能没有正确识别源漏区域。
6.3 判断是否成功的方法
- 如果已经加载 PDK 并成功打开 Pcell,说明环境配置正确;
- 如果打开 Layout 后能通过 Layer 窗口切换各层,并能看到清晰的器件图形,说明显示文件正常;
- 如果做一次 LVS 后 PMOS 和 NMOS 识别数量正确,说明模型、层次、规则文件三者匹配。
如果上述任何一步失败,优先检查 PDK 安装是否正确,而不是改设计。
7. 常见问题与排查思路
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| Library Manager 中看不到 PDK 库 | .cdsinit 未加载 libInit.il | 检查 CIW 启动日志 | 手动 load 对应 libInit.il |
| 打开 Layout 后只有框没有图形 | 显示文件(display.drf)未加载 | 输入dfSetDisplayDrf检查当前显示文件 | 正确加载 PDK 的 display.drf |
| Pcell 打散后无法恢复 | 在 PDK 原库中保存了打散结果 | 不要在原库保存;确认是否备份 | 从 PDK 重新调用或从备份恢复 |
| CDF 参数修改后版图不变 | 回调函数未触发 | 检查 CDF callback 是否有报错 | 重新打开 cellview 或执行回调刷新 |
| LVS 识别出的 PMOS 数量为 0 | 层次映射文件 layers.map 缺失 | 查看 LVS 报告中的 layer mapping 段 | 在 Calibre 规则中正确设置 layers.map |
| 器件方向或 Source/Drain 不一致 | 版图接线方式导致 PDK 源漏自动交换 | 检查 LVS 报告中的 connectivity | 手动指定 S/D 或调整 layout 接线 |
| 金属层太多,看不清 PMOS 本体 | 显示层开关未设置好 | 使用 Layer 窗口关闭高层金属 | 只显示 Active、Poly、NWELL、IMP 等层 |
| 打散后 LVS 通过,但参数提取异常 | Dummy 或 Base 层次缺失 | 在 LVS 结果中查看器件参数 | 避免直接用打散结果做最终提取 |
8. 最佳实践与工程建议
8.1 永远保留一份 Pcell 原样件
不要直接在 PDK 库中修改或打散 Pcell。建议把 PDK 库设为只读,所有实验在 Work Library 中进行。
8.2 建立器件参数记录表
使用脚本批量提取 PDK 参数,并人工核对几个关键参数(如 W、L、finger、dummy)后,记录到项目文档中。这样做有两个好处:
- 多人协作时避免参数被随意修改;
- 做仿真前能快速确认 PDK 版本和器件类型是否匹配。
可以用 Python 读取 PDK 参数记录表,做批量对比:
# 文件路径:check_pdk_params.py # 功能:读取导出的 PDK 参数表,输出关键参数摘要 import openpyxl wb = openpyxl.load_workbook("pdk_params.xlsx") ws = wb.active headers = [cell.value for cell in ws[1]] print("表头:", headers) for row in ws.iter_rows(min_row=2, values_only=True): print(row)这里的重点是工程可追溯性,参数表需要随 PDK 版本一起维护。
8.3 用 LVS 作为最终验证标准
层次查看只是手段,LVS 通过才是识别的最终验证。跑 LVS 时,关注器件数量、器件宽长比、连接关系三类结果。如果 LVS 报告中 PMOS 数量与原理图一致,且 W/L 比值符合预期,说明你对 PDK 层次的认知是正确的。
8.4 注意工艺文档中的保密要求
PDK 文件、工艺剖面图、层定义文档通常都有保密要求。分析结果分享给同事时,只保留必要信息,不要大范围扩散完整的 PDK 文件结构。
8.5 在 Schematic 与 Symbol 之间同步参数
有些项目需要把 Schematic 中的 PMOS 参数同步到 Symbol 上,方便原理图阅读。可以在 CDF 中查看参数是否绑定到 instance,如果没有,可以通过 callback 或 Skill 脚本同步,但不要手工改 Symbol 上的文本,否则一旦参数更新,文本不会自动更新。
9. 总结与后续学习方向
本文围绕 Smic40nm PDK 的 PMOS 器件,梳理了一套完整的层次查看与结构分析方法。核心是五步法:看 Schematic 建立连接认知、看 Symbol 理解 CDF 参数、打开发 Layout 识别工艺层、打散 Pcell 查看内部结构、结合剖面图对照验证。这个方法不局限于 Smic40nm,任何 PDK 都可以用同样思路拆解,只是层次名称和文件结构不同。
进一步深入学习,可以从几个方向展开:
- 研究 PDK 中提供的 Skill callback 代码,理解 W、L、Finger 参数如何自动驱动版图更新;
- 阅读 PDK 自带的 LVS rule deck,理解器件识别时用到了哪些层;
- 在 Calibre 中做一次完整的 PEX 提取,观察寄生参数如何随器件层次和走线变化;
- 尝试用 Skill 脚本批量检查整个 library 中的器件参数,建立项目级参数审计流程。
建议收藏这篇思路,等下次拿到新工艺 PDK,按照五步法走一遍,会比直接翻文档效率高很多。