
简介围绕宏力半导体采用Cadence Virtuoso 6.1 PDK开发系统的行业案例整理成一份面向半导体设计与工艺工程师的专业技术资料。内容重点阐述PDK自动化系统PAS和PDK测试系统STEP的架构与作用PAS用于高效创建和验证PDKSTEP用于确保PDK的质量和可靠性。同时涉及图形技术编辑器、验证运行设置生成器、PCell生成器及DFII库生成器等关键组件说明如何通过统一文档维护PDK相关数据并生成设计规则、PCell与DFII库。文档结合宏力半导体0.18微米混合信号/RF PDK的实际开发与验证过程展示了PAS与STEP在提升设计师效率、降低风险、缩短上市时间方面的价值并总结了PDK在混合信号、模拟/数字电路及半导体工艺设计验证中的应用场景。此外还收录了中芯国际、华虹NEC等厂商的工艺进展信息可作为行业动态参考。资源为单个PDF文件大小262KB已有342人学习适合作为半导体后端设计与工艺开发领域的参考资料。1. 宏力半导体 PDK 落地 Virtuoso 6.1 的技术逻辑PDK 开发系统的价值不在那个安装包本身而在它把工艺参数、版图规则、仿真模型和设计约束封装成了 IC 设计流程里所有工具都能消费的统一语言。宏力半导体采用 Cadence Virtuoso 6.1 作这层承载原因无非三点模拟/混合信号设计团队最熟的是 Virtuoso 的 ADE 仿真框架和版图编辑器代工厂的工艺文件可以用 SKILL 动态生成几何图形而不用手画层次CDF 回调让前端、后端在不同阶段能共享同一套参数源。宏力这条线的 PDK 包展开后和业界其他厂的 PDK 没有本质差异读懂这套结构你也能在 Virtuoso 6.1IC 6.1.x平台里把任意一个 Foundry PDK 用顺。下文适合需要维护 PDK、被器件模型或版图层次问题卡住的模拟设计工程师、版图工程师和 CAD 工程师。2. 在 Virtuoso 6.1 中定位 PDK 的目录结构与组件角色2.1 PDK 包在 Virtuoso 视角里的四个可见部分PDK 落到 Linux 服务器后先不要急着进 Virtuoso 界面。拿到宏力这类 PDK 包常见做法是先解压看目录一个标准的 PDK 根目录下至少包含四类东西模型文件spectre/spice 格式的.scs、.lib、物理层次文件tf、layers、display.drf、PCell 库通常是一整个 skill 脚本集或加密的 .so.d 和验证规则文件DRD 的 connect rule、P2P 检查用的 rule deck。这四部分在 Virtuoso 里各自对应明确的消费方仿真器读模型文件版图编辑器读 techfile 和 display 资源PCell 在 virtuoso 调器件时被动态解释DRD 规则在版图布线时实时报错。所以排查 PDK 问题时要先在文件系统层面定位故障属于哪一类不要一进报错就认为 PDK 本身坏了。PDK_ROOT/opt/cadence/pdk/grace/rf_6p1 ls -R $PDK_ROOT | head -80 find $PDK_ROOT -name *.scs -o -name *.tf -o -name *.cxt | sort第一段命令用来快速浏览 PDK 解压后的树形结构第二段把最常见的仿真模型和工艺文件筛出来。晶圆厂在交付时通常会把 skill 脚本加密成 .cxt 或 .ile 文件普通工程师看不到 PCell 源码这是正常现象调试时应把注意力放在 CDF 参数和回调行为上。2.2 techfile 与 display.drf 的关系决定版图“看得见”版图里所有层次的物理样子由 techfile 定义画面上显示的颜色和填充图案由 display.drf 定义。两者不匹配的表现就是“层存在但画不出来”或者“画出来了看不清”。Virtuoso 6.1 的 technology database 以 tech.db 文件保存二进制形式库管理器在首次打开时会自动从 tf 文件编译生成这步出现警告通常不影响使用但如果 tech.db 和 tf 版本不一致会导致层次名错乱。常见做法是在启动 Virtuoso 前用 cdsinit 文件预加载 display.drf。宏力 PDK 交付包里一般附带一个 pdksetup.il 或类似脚本它会自动做三件事append display.drf、加载 skill 菜单、注册 PCell 库路径。手动做的话要确认 display.drf 被加载了两次重复加载会刷掉前一次的自定义层次显示有时候 pcell 电阻不显示阻值就是改完 display 后没重新加载引起的。2.3 PDK 组件与 Virtuoso 视图的映射关系表PDK 组件Virtuoso 6.1 中的载体常见故障表现Spice 模型spectre.scs / hspice.lib仿真报“器件未定义”工艺层次tech.db / techfile.tf版图层次缺目或画不出层显示资源display.drf层看得见但颜色异常PCell 几何skill 脚本动态生成器件调不出来或形状怪异CDF 参数cdf 数据库属性窗口缺参数、阻值或宽长比不显示DRD 规则devrules 文件布线时 DRC 不报错或误报遇到“virtuoso中电阻不显示阻值怎么办”时优先检查 CDF 是否注册到该 cellview其次检查 callback 是否报错中断。查阅参数属性要在 CIW 窗口用cdfDump辅助确认这个放在 3.3 展开。3. SKILL 与 CDF 回调PCell 参数化的实现与常见故障3.1 PCell 是“有参数的形状”不是固定图形Virtuoso 6.1 下 PCell 的运行机制是版图编辑器需要实例化器件时把 CDF 参数表传给 SKILL 回调函数由回调函数调用 rodCreateRect 之类的高层 API 重新生成几何。这个过程发生在保存和刷新时因此任何参数改动后都必须触发 callback 来同步更新版图。宏力 PDK 里的各类器件看起来“能直接拖出来用”本质都在执行同一套逻辑读 CDF、跑回调、画几何、标记 rod 层次结构。手动写 PCell 时应当只依赖rod*系列函数这类函数维护了 PCell 的层次结构后续用 dbOpenCellViewByType 打开的实例能保持可编辑性直接调用 dbCreateRect 画出来的图形无法作为参数化器件保存二者功能天差地别。/* 最小版图 PCell 入口使用 rod 绘图 */ procedure( pcxResPcell( pCellId ) let( ( lyr layerNum w l ) lyr rodGetLayer( pCellId metal1 ) ; 读取层次名 when( lyr layerNum lyr-layerNum w rodGetVar( pCellId w ) l rodGetVar( pCellId l ) rodCreateRect( ?name body ?layer list( layerNum drawing ) ?width w ?length l ?origin list( 0 0 ) ) rodCreateLabel( ?name label1 ?layer list( layerNum pin ) ?origin list( w/2 l/2 ) ?text rodGetVar( pCellId moduleName ) ?fontHeight w/2.0 ?orient R0 ) ) ) )代码的逻辑是从 PCell 环境里读取层次定义和用户参数再以 rod 接口绘制矩形和标签。这里要留意 rodGetVar 拿到的是 CDF 里当前参数值对宽长比有约束时应在 callback 里做舍入处理不要直接使用。否则用户输入非常规尺寸时PCell 会生成一个不满足设计规则的图形DRD 阶段再来处理成本更高。3.2 CDF 参数表与 callback 的关系CDF 里每个属性都有几个关键位value 存当前值callback 存参数变化后自动执行的函数名parseComponent 和 parse 用于解析复杂类型。宏力 PDK 的电阻器件典型做法是宽度、长度、串联根数三个参数控制几何当长度或宽度变化时调用回调重新计算标称阻值。常见做法是把线性电阻计算逻辑写入 callback 函数。这样用户在 ADEL 或版图属性框中改动参数后阻值会自动更新。回调函数通常会在 CIW 窗口打印错误信息如果“电阻不显示阻值”八成是回调抛错没被拦截。procedure( pcxResCdfCallback( cdfId ) let( ( w l rsh totalR ) w cdfGetFloat( cdfId w ) l cdfGetFloat( cdfId l ) rsh cdfGetFloat( cdfId rsh ) totalR rsh * l / w cdfSetFloat( cdfId r totalR ) ) )这里 cdfGetFloat 从 CDF 读浮点参数计算后写回参数 r。参数说明w 是电阻宽度l 是电阻长度rsh 是方块电阻totalR 是最终阻值。回调里最好包裹一层 when 避免除零当用户把 w 填 0 时直接返回。3.3 SKILL 调试三板斧PCell 类的故障普遍没法靠界面操作解决需要 CDF 和 SKILL 双通道排查。排查手段命令使用场景打印 CDF 全部参数cdfDump( cdfId )确认参数名和当前值手动触发 callbackcdfUpdateCDF()或直接调用回调函数参数对但图形不对时查看 rod 层次rodDump( cellId )确认几何是否被正确创建在 CIW 窗口打开对应 cellview 后执行上述命令比反复刷新界面快得多。宏力这类 PDK 还有一层加密PCell 内部报错可能不打印具体行号但 rodDump 能看出当前结构里有哪些图形能直接定位到“图形没生成”和“图形生成了但不在期望位置”两种状态。4. 在 ADEL 与 ADE XL 中设置工艺角并驱动仿真4.1 工艺角文件的结构与加载顺序PDK 中的模型文件通常按工艺角分区组织。一个典型的 scs 文件里以 section 为边界划分典型角、慢角和快角每个 section 内会包含器件模型参数及温度相关的缩放因子。simulator langspectre sectiontt include model_tt.scs endsection tt sectionss include model_ss.scs endsection ss sectionff include model_ff.scs endsection ff这里 section 名是任意的但三个 section 内的模型必须配套宏力 PDK 规定的互连寄生参数。工艺角设置核心是让仿真器和版图提取使用同一套角标。许多工程师在 ADEL 里只切换器件模型没同步改寄生提取的 RC 角实际跑出来的功耗和时序会高估或低估。4.2 ADEL 里设置工艺角的标准路径Virtuoso 6.1 的 ADEL 设置工艺角入口在 Simulation → Corners。具体操作路径在 ADEL 界面打开 Corners 表单。在 Model Libraries 里选中对应 scs 文件。在 Corners 列表里输入 tt、ss、ff 等角名。指定每个角对应的 section 名。在 Variables 页把温度变量和角名关联。macro 变量模型在 PDK 设置里建议用$corners命名仿真器会在运行时把角名替换成实际 section。这一步骤完成后ADE XL 或 Spectre 会自动遍历所有角。4.3 “器件未定义”与瞬态不收敛的排查仿真报“器件未定义”是 PDK 使用中频率最高的问题。原因通常是模型库没加载或加载顺序不对。Spectre 对后加载的库会覆盖先加载的同名器件定义如果一个电阻模型在基础库和射频库里各定义一次后加载者生效。排查这类问题要确认的检查顺序是getShellEnvVar检查环境变量是否指向正确 PDK 版本CIW 里用modelFiles查看当前仿真器吃进的模型路径用 grep 确认调用器件名在模型文件里是否存在grep -n rhr2 /opt/cadence/pdk/grace/rf_6p1/models/spectre/rf.scs | head -20这段命令把 rf.scs 里定义 rhr2 的行列出来用于确认模型库里确实有这个器件定义。注意宏力 PDK 的射频电阻器件名可能带精度后缀仿真时查不到器件名时先 grep 一遍再改原理图符号。瞬态不收敛的问题更复杂但多数和模型参数没有关系。常见原因是 CDF 参数里出现异常值或极大极小值导致模型计算出不可导的跨导值。调整策略是把仿真精度从 conservative 改成 moderate如果不收敛位置固定在同一时刻还得检查激励源是否有跳变沿。/* 从 ADEL 环境里读取当前模型路径辅助排查 */ let( ( session mList ) session hiGetCurrentSession() mList asiGetEnvOption( session modelFiles ) foreach( m mList printf( Model File: %s\n m ) ) )上述代码从 ADEL 会话里读出实际生效的模型文件列表有助于确认替换工艺角时是不是多加载了旧文件。4.4 ADE XL 中批量跑角的首日配置ADE XL 适合批量跑多工艺角和多 corner 的组合它的设置逻辑与 ADEL 不同先用 Tests 定义一个仿真再用 Corners 定义角组合最后在 Outputs 里勾选需要比对的结果。宏力 PDK 各角模型文件是独立文件常见做法是直接以文件为单位管理 corner而不是在同一个文件内切 section。ADE XL 设置项推荐值说明Model Libraries每个角一个 scs 文件避免 section 切换带来的解析开销Sweep 变量温度 工艺角组合数较多时用 Skip 控制输出格式psf 或 psfxl后续用 ocean 脚本读比较方便仿真实例数与 license 数匹配过多会导致排队反而变慢ADE XL 的批量结果可以用自带的 Result Analyzer 做 spec 检查不用额外脚本。宏力 PDK 里有一个专门针对 ADE XL 的配置文件导出的 csv 可以直接交到后端做时序分析。5. DRD 连接规则检查与 PCell 版图联动的验证5.1 DRD 为什么能防住“连错引脚”PDK 系统里容易被忽略的是 DRD 动态规则检查它在版图编辑时随鼠标移动实时检查连接关系。宏力 PDK 的 DRD 文件定义了不同层次间的连接属性比如金属1和金属2之间必须通过 via 连接poly 和 nplus 在特定区域才允许连接。Virtuoso 6.1 里 DRD 检查通过连接规则文件实现该文件可以在 LSWLayer Select Window里加载也可以在.cdsinit中用drcSetup指定。调试 DRD 报错的方法是打开 CIW 里的 Rules → DRD Options把报告级别从 summary 改成 verbose才能在版图里看到每条规则的具体断线位置。# 检查 PDK 中 DRD 规则文件是否存在 ls -la $PDK_ROOT/rule_decks/drd/ grep -n metal1.*metal2 $PDK_ROOT/rule_decks/drd/connect_rule | head第二行命令查看金属层之间的连接规则是否定义了 via 检查。实际生产中很多后端工程师发现 DRD 不报错结果发现是规则文件没加载而不是规则本身通过。5.2 在 Virtuoso 中用 SKILL 脚本跑批量检查对已完成的版图跑非实时 DRC 时用 SKILL 批量加载 DRD 规则是常见做法这样能把人工点击 LSW 菜单的动作固化成可复现的脚本procedure( pdkRunDrdCheck( cellviewId ) let( ( drdRules ) drdRules list( connect metal1 metal2 ) ; 规则组 drdSetRuleFile( cellviewId connect_rule ) drdSetEnabled( t ) /* 刷新当前 cellview 并激活 DRD */ dbSave( cellviewId ) drdCheck( cellviewId ) printf( DRD rule check done for %s\n cellviewId~name ) ) )参数说明connect_rule 是宏力 PDK 提供的连接规则文件名drdCheck 会返回违规数量。这个流程每次保存版图后跑一遍能及时暴露“忘记打 via 孔”这类问题。5.3 Power pin 与 global net 的边界条件Virtuoso 6.1 的版图编辑器里电源网络通常用 global net 连接而 DRD 检查对 global net 和非 global net 的处理方式不同。宏力 PDK 对电源地的连接规则一般要求电源环用 metal 高层互连且不能穿电阻器件的 body 层。实际项目中最容易踩的坑是在 CDF 里把 power pin 类型设置错误导致power属性丢失这在原理图输入时会触发“引脚类型是power报警告”的问题。排查方法是在 CDF 编辑器中检查 pin 的 direction 和 access 属性确认其 net 属性被标识为 global。5.4 用红外热图思维反向调试 DRD 误报DRD 误报比不报更消耗时间因为新手往往先改版图再怀疑规则。一个高效办法是临时把规则文件里某一条规则改成可忽略状态看版图是否还有其他错误。确认不是这条规则后再恢复原状。这种逐条排查的思路对应了 PDK 维护人员常说的“先把规则拆开”调试法。注意不要为了过检查而长期禁用 DRD 规则这会掩盖后续 DRC 阶段的大量返工成本。宏力 PDK 提供的原始 DRD 规则经过流片验证误报点多数是层次名称与设计端不一致修正方案是在安装 PDK 时用映射文件统一层名而不是改规则阈值。本文还有配套的精品资源点击获取