简介:文档介绍了宏力半导体采用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 2>&1 | 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 库里找一个最简单的器件,比如一个电阻 Pcell,place 到自己的库里,然后跑一次 DRC 和 LVS。
# 通过 virtuoso 命令行启动,并带日志 virtuoso -log /tmp/hlmc_test.log -cdslib /path/to/your/cds.lib &启动后看日志里有没有 skill 报错。没有报错后,在 CIW(Command 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 还是 Assura,rule deck 路径都要检查,很多环境默认指到别家工艺的规则上,跑出来的结果完全没有参考价值。
3.4 第四步:用 layout XL 验证参数化单元是否被调起来
Virtuoso 6.1 里,很多工程师只用 schematic 和 layout,忽略了 XL 工具链。其实 PDK 是否调通,layout XL 是最直观的验证入口:它能从 schematic 反标到 layout,自动调出对应的 Pcell,并带出 CDF 参数。
操作路径是:打开 schematic,Launch,Layout 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 坏了,其实是仿真环境配置问题。
解决:打开 Simulation,Options,确认 model library 指向 models/spectre/xxx.scs,并且在 ADE L 的 model setup 里勾选对应 corner。也可以直接在 netlist 里看有没有 section=tt 这样的语句。没有的话,就是 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 的 skill,PDK 的 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 时,少一点玄学式排查,多一点确定性的下一步。
本文还有配套的精品资源,点击获取