资讯动态

宏力半导体PDK在Virtuoso 6.1中的加载、验证与排错实践

发布时间:2026/10/14 13:22:29 来源:尧图企业网站定制
简介文档介绍了宏力半导体采用Cadence Virtuoso 6.1 PDK开发系统的实践面向半导体设计、工艺及验证相关工程师与研究人员系统阐述PDK自动化系统PAS与PDK测试系统STEP的构建方法。其中详细描述了PAS如何通过图形技术编辑器、验证运行设置生成器、PCell生成器和DFII库生成器高效创建和验证PDK以及STEP如何保障PDK的质量与可靠性并涵盖混合信号、模拟、数字及工艺设计验证等典型应用场景。读者可从中了解如何在同一文档中获取和维护PDK相关数据、从单一来源生成设计规则与库文件进而提升设计效率、降低风险、缩短上市时间。资源共1个PDF文件大小262KB内容精炼已有342人学习适合作为半导体PDK开发与流程优化的参考资料。1. 宏力半导体这份 PDF 在讲什么PDK 开发系统的落地价值看到「宏力半导体采用Cadence Virtuoso 6.1 PDK开发系统.pdf」这个标题先别急着把它当一份介绍材料归档。真正需要这份文档的人通常是模拟 IC 设计工程师、版图工程师和公司里的 CAD 支持大家的诉求高度一致宏力这颗 PDK 在 Virtuoso 6.1 里到底怎么加载、怎么验证、出问题往哪查。反直觉的是多数 PDK 使用翻车根因不在 PDK 本身而在加载顺序和启动脚本。这篇笔记就按这个顺序把 PDK 组成、安装、验证和排错讲清楚保证照着做能复现。2. 先把 PDK 拆开Virtuoso 6.1 下 PDK 的组成与选型理由2.1 PDK 里到底装了什么东西从工艺文件到 skill 回调PDK 不是一个文件是一整套跟工艺绑定的 EDA 支持包。在 Virtuoso 6.1 环境下一颗完整的模拟/混合信号 PDK 至少包含工艺映射文件layermap、器件参数化单元Pcell、CDF 参数、callback 回调函数、模型文件、DRC/LVS 规则文件以及一堆 skill 脚本。宏力这类 foundry 提供的 PDK 通常按工艺节点分目录解压后常见结构类似hlmc_pdk/ cds.lib .cdsinit libs/ hlmc_xxx_base/ cell1/ layout/ schematic/ symbol/ hlmc_xxx_res_* hlmc_xxx_mos_* models/ spectre/ xxx.scs xxx_corners.scs rules/ drc/ xxx.drc lvs/ xxx.lvs skill/ hlmcSetup.il layers/ layer.map这段伪结构不要直接照搬重点是确认你手里的包是不是「库 模型 规则 脚本」四件套。如果缺 skill 目录或 callback 文件后面 Pcell 参数必然调不动。组件职责要分清楚。layermap 负责把版图编辑器里的层次名映射到 GDSII 层号DRC/LVS 能不能认出你画的是 metal1 还是 metal2全靠它。Pcell 是一段程序画版图时根据你填的 W/L 动态生成几何图形不是提前画好的静态 cell。CDF 参数是器件的属性表比如 MOS 管的 W、L、fingers、multiplier。callback 是参数联动函数改 fingers 时它自动重算总宽度。模型文件是 spectre 或者 hspice 能读的器件模型corner 信息也藏在里面。skill 脚本负责把菜单、快捷键、回调函数挂到 Virtuoso 环境里。为什么不直接装一个 PDK因为 Virtuoso 6.1 的加载机制是「启动时读 cds.lib 和 .cdsinit运行时调 skill 和 CDF」。PDK 里的每个 Pcell 其实是一段 skill 程序它在布局时按你填的参数动态生成版图。如果 skill 回调没加载器件画出来就是空的或错的。理解这条链路后面所有排错都有方向。2.2 为什么是 Virtuoso 6.1版本、兼容性与产线对应关系宏力半导体是模拟/混合信号 foundry用户环境里大量跑的是 Cadence Virtuoso 6.1.x。选 6.1 而不是更新的版本主要原因是历史兼容。很多老工艺 PDK 的 skill 代码是在 6.1 上验证过的换大版本后 Pcell 重建、CDF 回调的接口有变化容易出兼容问题。另一个原因是 EDA 版本与操作系统绑定6.1 常见的配套环境是 RHEL 5/6和产线模板一致。如果你是自行下载宏力 PDK 装到公司服务器优先用 PDF 标题里点明的 Virtuoso 6.1 配套版本。如果你被 IT 强制升了大版本需要找 foundry 要对应版本 PDK而不是自己改 skill 去适配。改回调脚本是能跑但每次 DRC/LVS 报错都会让你怀疑是不是改坏了。还要注意 32 位/64 位库的问题。Virtuoso 6.1 早期版本有 32 位和 64 位两套可执行文件PDK 里的 skill 代码一般与位数无关但模型文件、编译好的 .so 库是分位数的。加载时报 cannot load library多半是位数不匹配。这个坑后面第 4 章会专门展开。2.3 PDK 加载的三条路径cds.lib、.cdsinit 与 CDF 回调在 Virtuoso 6.1 里PDK 加载不是「安装一下」就完事而是通过三条路径共同生效。第一条路径是 cds.lib它告诉 Virtuoso 有哪些库可用、库文件在哪。你可以在启动目录放一个 cds.lib也可以放到 $HOME还可以用环境变量 CDS_LIB_FILE 指定。宏力 PDK 解压后通常会带一个现成的 cds.lib 片段你要做的是把里面的库路径追加到自己工作目录的 cds.lib。第二条路径是 .cdsinit。它是 Virtuoso 启动时自动执行的 skill 脚本PDK 的菜单、回调函数、快捷键都在这里挂载。常见做法是在 .cdsinit 末尾加一句 load 宏力提供的 skill 文件。第三条路径是 CDF 回调。器件库里的每个 Pcell 都带 CDF 参数参数之间的联动逻辑写在 callback 里。CDF 数据可以存在库里、也可以存在 PDK 的 skill 脚本里启动时写入。注意 CDF 回调必须等库被 cds.lib 挂上之后才能注册所以加载顺序不能乱。下面是一个最小可用的启动目录示例# 工作目录 cds.lib INCLUDE $HLMC_PDK_HOME/cds.lib DEFINE my_lib ./my_lib# 工作目录 .cdsinit ; 加载宏力 PDK 专用 skill load(strcat(getShellEnvVar(HLMC_PDK_HOME) /skill/hlmcSetup.il)) ; 加载后重绘菜单 hiRegMenu(hlmcMenu)说明INCLUDE 是把 foundry 的 cds.lib 内容合并进来DEFINE 是定义自己的设计库。.cdsinit 里必须先设置 HLMC_PDK_HOME 环境变量否则 strcat 拼出来的路径是空的load 会静默失败。很多工程师在这里翻车Virtuoso 正常起来但器件库没挂全菜单也没出现。参数说明getShellEnvVar 是 Cadence skill 里读环境变量的函数如果你用的是旧版本可能要用 getenv。差别在于 getShellEnvVar 更贴近 shell 环境getenv 读的是 Cadence 进程自己的环境。两者混用容易在远程终端里拿到空值。另外cds.lib 里如果写了相对路径Virtuoso 会相对于当前启动目录解析换一个目录启动就全断所以建议一律写绝对路径。3. 把宏力 PDK 跑进 Virtuoso从解压到建库的完整流程3.1 第一步整理 PDK 压缩包与目录规范拿到宏力 PDK 压缩包后先别急着重命名或改权限。常见做法是在服务器上建一个只读的 PDK 根目录例如 /eda/hlmc/pdk/xxx所有设计人员通过环境变量引用它。这样做的好处是PDK 升级时只换这个目录不用逐个改用户的启动文件。目录规范围绕「一份 PDK多套设计」组织。根目录下放 cds.lib 模板和 .cdsinit 模板libs 目录放只读 PDK 库models/rules 目录放仿真模型和验证规则skill 目录放回调脚本。注意权限设计宏力 PDK 里的 skill 文件需要在 Virtuoso 启动时被 load如果你的主目录是 noexec 挂载load 可能不报错但函数不可用。建议 PDK 根目录对设计组只读对 CAD 管理员可写。注意多个项目共用同一份 PDK 时不要在设计库里直接改 PDK 库的内容。正确做法是通过 cds.lib 引用只读库自己的改动都放在 DEFINE 出来的私有库里。3.2 第二步写好 cds.lib把 PDK 库挂进你的工作库这一步是所有步骤里最机械也最容易被忽略的。拿宏力提供的 cds.lib 模板把里面的相对路径改成你本机的绝对路径然后 INCLUDE 到自己工作目录的 cds.lib 里。# 工作目录 cds.lib 示例 INCLUDE /eda/hlmc/pdk/xxx/cds.lib DEFINE work ./work DEFINE my_analog ./my_analog这里有一个很多人不理解的细节INCLUDE 进的文件里如果也有 DEFINE 语句当前文件里的 DEFINE 优先级更高。所以如果你的工作目录恰好有一个叫 base 的库它会覆盖 PDK 里的 base 库定义导致你打开的是空库。排查办法是打开 Library Manager 看库路径如果指向了你的工作目录而不是 /eda/hlmc就是这个原因。验证 cds.lib 是否生效可以在终端里用 Cadence 命令行工具扫描cds_list_libs 21 | grep hlmc能列出 hlmc 开头的库名说明路径和权限没问题。如果报错先看是不是目录权限、或者是 cds.lib 里用了不存在的相对路径。这个命令不启动完整 Virtuoso 界面调试时比反复开 GUI 快得多。3.3 第三步用 Library Manager 建一个工艺相关库并做 DRC/LVS 试跑PDK 挂上后需要在 Library Manager 里新建一个自己的设计库并在库属性里把工艺库引用到宏力 PDK 上。Virtuoso 6.1 的 Library Manager 里选中新库右键 Properties在 Technology Library 一栏填 PDK 的 base 库名。这一步决定了你画版图时 Layer 颜色、层次名、以及 DRC/LVS 能不能识别层次。建好库后建议立刻做一个最小验证在 base 库里找一个最简单的器件比如一个电阻 Pcellplace 到自己的库里然后跑一次 DRC 和 LVS。# 通过 virtuoso 命令行启动并带日志 virtuoso -log /tmp/hlmc_test.log -cdslib /path/to/your/cds.lib 启动后看日志里有没有 skill 报错。没有报错后在 CIWCommand Interpreter Window里执行dbOpenCellViewType my_analog t_res layout r这行 skill 的意思是打开 my_analog 库里 t_res 单元的 layout view如果 PDK 加载正常会直接弹出带 Pcell 的版图窗口。如果弹出来是空的或者报缺少 master说明 cds.lib 里 base 库没挂全或者 Pcell 回调没注册。参数说明dbOpenCellViewType 最后的 r 表示 read-only。调试阶段建议用 r避免误改库内容。如果是做验证用 w 会创建新的 view可能把 Pcell 拉平这不是你想要的。DRC 试跑时确认规则文件指向宏力 rules 目录下的文件。不管用 Calibre 还是 Assurarule deck 路径都要检查很多环境默认指到别家工艺的规则上跑出来的结果完全没有参考价值。3.4 第四步用 layout XL 验证参数化单元是否被调起来Virtuoso 6.1 里很多工程师只用 schematic 和 layout忽略了 XL 工具链。其实 PDK 是否调通layout XL 是最直观的验证入口它能从 schematic 反标到 layout自动调出对应的 Pcell并带出 CDF 参数。操作路径是打开 schematicLaunchLayout XL。XL 启动时会自动做 binding把 schematic 里的器件映射到 layout 里的 Pcell。如果 PDK 回调正常XL 会列出所有 source/drain 连接关系如果回调没起来XL 会报 Cannot find cellview 或 Illegal parameter。这个验证的价值在于它同时覆盖了 cds.lib库可见、CDF参数可读、callback参数联动和 skill 菜单XL 工具本身可用。一轮跑通PDK 的主体功能基本可信。XL 跑通之后建议随手把生成的 binding 信息存下来后面画版图时能省掉大量手动对齐的功夫。4. 模拟 IC 设计里最常见的 PDK 排查现场现象、原因与处置4.1 器件 W/L 改了没反应CDF 参数没写进库现象在 schematic 里双击电阻或者 MOS 管把 W 从 2u 改成 4u点 Apply 后版图里器件宽度没变化或者仿真网表里还是 2u。原因这是 PDK 排错里最典型的一种。CDF 参数没写进库多半是启动 .cdsinit 里只 load 了菜单脚本没 load Pcell 回调脚本或者是库是从旧版本直接 copy 过来CDF 数据没跟着迁移。解决先在 CIW 里手动 load 宏力 PDK 的回调脚本确认改动后参数能生效。然后检查 cds.lib 的顺序确保 PDK base 库排在自己的设计库前面。最后用 Library Manager 打开器件属性看 CDF 里有没有 Callback 字段没有就说明 CDF 注册失败。检查顺序很重要先验证脚本能跑再查库最后才查参数。4.2 仿真结果全是默认值model section 没选对现象用 spectre 跑仿真corner 设置成 tt、ss、ff但结果三条曲线完全重合等于默认参数。原因宏力 PDK 的模型文件通常按 section 组织tt/ss/ff 是不同 section。如果 spectre 的 model file 路径没写对或者 analysis 里没有把 section 引进去仿真器会直接读默认 section。很多新手在这里以为 PDK 坏了其实是仿真环境配置问题。解决打开 SimulationOptions确认 model library 指向 models/spectre/xxx.scs并且在 ADE L 的 model setup 里勾选对应 corner。也可以直接在 netlist 里看有没有 sectiontt 这样的语句。没有的话就是 netlist 里没带 section。这个排查方法对任何 foundry 的 PDK 都适用不限于宏力。4.3 DRC 报一堆金属密度错layermap 映射错了现象DRC 跑完报错集中在 metal density、minimum area、dummy 缺失但同一块版图换到别的 PDK 就没事。原因layout 里的金属层次映射到 foundry DRC 规则时层号对不上。Virtuoso 6.1 里版图层次由 technology file 定义DRC 规则文件由 foundry 提供中间靠 layermap 转换。如果你的技术库是从别的工艺模板改的m1 的层次号很可能不一致。解决检查 PDK 提供的 layer.map确认 mapping 里 metal1 对应的层号再用 Calibre 或 Assura 的 GUI 加载规则文件跑一次看 RVE 里报错的坐标是不是真的在金属图形上。如果坐标正确问题不在 map而在 DRC 规则 deck 的密度参数。注意density 报错在流片签核时是必须清的不能因为觉得是误报就永久过滤。4.4 菜单和快捷键消失.cdsinit 里的 load 顺序错现象Virtuoso 启动正常能画版图但宏力 PDK 的菜单没有出现在菜单栏快捷键也失效。原因.cdsinit 里先 load 了菜单定义后 load PDK 的 skillPDK 的 hiRegMenu 把菜单注册在一个还没初始化的框架上Cadence 静默丢弃了。另一个可能.cdsinit 里用了 load 相对路径而 Virtuoso 启动时的工作目录不是 .cdsinit 所在目录。解决把 PDK 的 skill load 放在 .cdsinit 最后并且用绝对路径加上存在性判断if( isFile(/eda/hlmc/pdk/xxx/skill/hlmcSetup.il) load(/eda/hlmc/pdk/xxx/skill/hlmcSetup.il) printf(PDK loaded OK\n) )注意 isFile 是 skill 里的文件判断函数文件不存在时会走 else 分支直接打印提示避免启动脚本死在这一行。这段脚本看起来简单但能挡住一大半「菜单时有时无」的投诉。4.5 64 位系统下 Pcell 变白框.so 库位数不匹配现象新买的服务器是 64 位系统装了 Virtuoso 6.1 64 位版本加载宏力 PDK 后所有 Pcell 都显示成白框但 DRC 能跑。原因Pcell 的 layout 生成依赖 skill 回调回调里的某些函数是编译好的 .so 动态库。如果 .so 是 32 位编译的64 位 Virtuoso 加载时会报 undefined symbol随后回退到最简单的白框显示。解决这种问题自己没有后悔药可吃只能找宏力或代理要 64 位版本的 PDK 对应包。临时方案是把 32 位 Virtuoso 单独装一个目录用 32 位版跑老 PDK但这样和团队环境不一致不推荐。验证方法是在 CIW 里看 load 那个 .so 文件有没有报错报错信息里会直接写明 undefined symbol 还是 cannot open shared object file这两者的处置方向完全不同。5. 验证 PDK 是否可用的三个自检方法从器件到仿真一竿子插到底5.1 用 calculator 跑一遍 corner 仿真确认 model 和 section 生效PDK 装完别急着画图先用最小电路验证仿真链路。搭一个简单的电阻分压器或者二极管接法 MOS用 spectre 跑 DC 扫描然后切 corner 重跑。如果三条曲线有差异证明 model 和 section 正常如果完全重合回到 4.2 查 section。; 在 ADE L 的 calculator 里读出指定节点电压 V( net1 ?result dc )这段 skill 是 calculator 的读取语法用来在结果浏览器里取直流工作点。它本身和 PDK 没直接关系但能帮你快速判断仿真结果是不是真的在变。建议把测试电路做成一个单独的 cell每次换 PDK 环境都跑一遍省得每次重新搭。5.2 把 Pcell 逐个拆开看 CDF 参数和 callback自检 PDK 的第二个动作是打开 base 库里每个器件检查 CDF 参数是否完整、callback 是否注册。以 MOS 管为例常见参数有 W、L、fingers、multiplier、dummy 等。其中 W/L 是几何尺寸fingers 影响版图折叠multiplier 影响并联个数。回调函数的作用是当你改 fingers 时自动重算总宽度并同步到 CDF 的 total width 字段。如果你改 fingers 后 total width 不变说明 callback 没挂上。此刻打开 CIW 的 skill log搜索 callback 关键词能找到具体是哪个函数报错。宏力 PDK 的 callback 命名一般和器件名强相关看到hlmc_mos_callback被反复调用但没有报错说明参数联动逻辑正常。这一步排查价值很高能提前发现一批只在特定参数组合下才触发的回调 bug。5.3 跑一轮 DRC/LVS 全流程重点看 rule deck 路径和密度规则自检的第三件事是全流程验证。建一个最小 inverter跑 DRC再跑 LVS。重点不是看有没有错而是看 rule deck 路径是否真的指向 PDK 的 rules 目录以及密度规则有没有被加载。很多 PDK 的 DRC deck 里默认开启 density 检查而版图没画 dummy导致一堆 density 报错。如果你确认不需要 density 检查可以在 DRC 规则文件的 filter 里临时关掉但注意这只能用于功能验证流片前必须恢复。宏力这类 foundry 的 DRC 规则里density 是 signoff 项不能长期关闭。LVS 验证时要注意 source 和 layout 的层次映射特别是 resistor 的层次不同工艺的电阻层次差别很大容易在 LVS 阶段报 unrecognized layer。5.4 检查 skill log 与 warning回调没执行完的典型证据Virtuoso 6.1 的 CIW 窗口会保留本次会话的 skill 日志和 warning。PDK 加载正常时CIW 里通常只有少量 benign warning如果看到*Error* load: file not found、*Warning* redefining function就要逐条看。redefining function 这个 warning 值得单独说。它一般不代表故障因为多个 skill 脚本可能会重复定义同一个辅助函数。但如果 redefining 的是 Pcell callback 核心函数且后面的代码依赖新定义执行顺序就会出问题。判断标准是如果画 Pcell 时行为异常优先查这个 warning 的时间点看看是不是在 PDK 自己的脚本里互相覆盖了。6. 把宏力 Virtuoso 6.1 这套环境用顺版本管理与最小验证6.1 用 EDA 环境变量做多版本 PDK 切换实际项目里很少只有一个工艺版本。宏力 PDK 会随着模型更新、DRC 规则修订不断出新版而你手头可能有几个 tapeout 项目分别锁定了不同版本。常见做法是把 PDK 根目录按版本命名例如 /eda/hlmc/pdk/v1.2 和 /eda/hlmc/pdk/v1.3然后用环境变量 HLMC_PDK_HOME 指向当前项目要用的版本。每个项目启动脚本里固定这个变量避免今天用 v1.2 明天用 v1.3 混着跑。6.2 把 PDK 加载过程固化成团队启动脚本我一般会把 PDK 加载固化成一个 team 级启动脚本所有设计师共用。脚本做三件事设置 HLMC_PDK_HOME检查 cds.lib 和 .cdsinit 是否存在调用 virtuoso 启动。这样能避免新人上来自己写配置把 cds.lib 写错。脚本里加一行 echo 打印当前 PDK 版本这个习惯帮我们抓过好几次环境串版本的问题。6.3 留一个最小验证用例每次换环境先跑它最后说一个我自己的习惯在每个项目库里放一个最小验证 cell里面就一个电阻和一个 MOS 管包含 schematic、layout、以及一个已经配好的 corner 仿真。每次换了新机器、新 PDK 版本先打开这个 cell 跑一遍Pcell 能画、仿真能出 corner 差异、DRC 能跑完整流程再开始正式设计。这个用例十分钟就能跑完但它把第 4 章里的大部分坑都覆盖了。希望这个检查顺序能帮到你至少能让你在深夜面对白框 Pcell 时少一点玄学式排查多一点确定性的下一步。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑