资讯动态

IC617下老PDK的CDB转OA迁移与验证

发布时间:2026/10/27 5:06:26 来源:尧图企业网站定制
简介面向使用 Cadence Virtuoso、需要把旧版 CDB 工艺库迁移到 IC617/OA 环境的模拟与版图工程师这是一份围绕 cdb2oa 数据转换的 PDF 实操资料。内容针对旧工艺库在 IC617 中打开时出现的“OA executable on CDB data”等兼容性问题梳理从 CDB 到 OpenAccess 的转换思路、库路径处理与转换后的校验方法适合已具备基础 Virtuoso 操作经验、正在进行 PDK 库升级或环境迁移的读者参考。压缩包共 1 个 PDF 文件约 697KB篇幅精简便于随查随用已有 1556 人学习下载。其价值在于帮助读者理解转换前后的库结构变化、转换完成后的检查要点以及常见告警的成因可作为工艺库迁移时的手边对照减少反复试错的时间。1. 老 PDK 搬进 IC617第一道坎就是把 CDB 转换为 OA把十几年前的 0.35μm 工艺库从 IC514 搬到 IC617virtuoso 一启动就甩出一行长长的警告ddUpdateLibList: It appears that you are trying to run an OA executable on CDB data. Library pdk035 contains prop.xx which is CDB data.很多人第一反应是按提示删掉prop.xx再试一次结果库直接从 Library Manager 里消失连报错都不给了。把 CDB 转换为 OA 不是可选项而是 IC617 读到这套工艺库的唯一前提IC617 的 Virtuoso 是纯 OA 可执行程序它不认识 CDB 库里的任何一类文件。转不干净的后果很具体——库能列出来但 cell 打不开symbol 是空白techfile 的层信息全丢后面连仿真网表都出不来。这篇记录写给两类人手上还压着 CDB 格式老 PDK、又必须在 IC617 上接着用的模拟设计者以及要维护这套老环境的部署人员。2. 版本与依赖核对IC617 只认 OACDB 一个字节也不读2.1 IC514 与 IC617 之间那道数据格式分水岭CDB 是 IC5141 那一代 Virtuoso 的默认库格式从 IC610、IC614 开始逐步切换到 OpenAccess到了 IC617图形界面和底层库操作全部走 OACDB 的读写能力已经彻底拿掉了。这就是为什么报错写的是「OA executable on CDB data」——不是说数据坏了而是根本对不上。判断一个库到底是 CDB 还是 OA最快的办法是看库目录里有什么标志文件。CDB 库目录下必定有prop.xx这是它的属性文件OA 库目录下没有这个文件取而代之的是lib.defs、每个 cell 下的data.dm这类 OA 结构。原文那句提示「If this is an OA library, this file needs to be removed」说的就是这件事prop.xx是 CDB 的身份证OA 可执行程序见到它就认定这是老库然后拒绝继续往下走。对比项CDB 库IC514 时代OA 库IC617 必需库标识文件库根目录有prop.xx无prop.xx有lib.defscell 目录结构私有格式子目录每个 cell 下是data.dm等 OA 文件工艺层信息techfile.cdstech.db可导出为techfile.tfCDF 参数存储存在 CDB 属性里存在 OA 的 CDF 数据里IC617 直接打开不能能这张表放在手边排查时先确认你面对的是哪一列比盲目试错快得多。行里经常见到的情况是PDK 主目录是 OA 的但里面某一个小子库漏转了还是老格式结果整个 Virtuoso 启动时被一行 Warning 拖住人却以为整库都坏了。2.2 转换前必须确认的四项环境动手之前先把环境对齐比转换做到一半再回头查省事得多。我一般按顺序查四样当前 shell 用的是哪一套 Virtuoso、cdb2oa到底在不在、OA 运行库版本、目标库的读写权限。# 1) 确认当前 shell 指向的是哪一套 Virtuoso 安装 echo $CDSHOME which virtuoso virtuoso -version 21 | head -n 3 # 2) 找 cdb2oa 转换器不同版本放在 tools/bin 或 tools/dfII/bin 下 which cdb2oa || find $CDSHOME/tools -maxdepth 3 -name cdb2oa* 2/dev/null # 3) 看一眼 OA 运行库版本IC617 自带的是 OA 22.x 系列 find $CDSHOME -maxdepth 4 -name liboa*.so* 2/dev/null | head # 4) 确认目标库目录可写转换要往里写新文件 ls -ld /home/user/pdk/pdk035 touch /home/user/pdk/pdk035/.writetest rm -f /home/user/pdk/pdk035/.writetest这几条命令各有用处。echo $CDSHOME和which virtuoso必须指向同一套安装目录行里最典型的“玄学”问题就是 PATH 里还挂着旧版本的 bin敲virtuoso起的是新界面实际加载的库路径却是旧的报错信息来回变人越查越糊涂。which cdb2oa找不到就直接用find在$CDSHOME/tools下捞这个转换器在部分版本里叫cdb2oa个别版本还会有带后缀的包装脚本找到确切路径之后后面写脚本才不会到处改。第三条查 OA 运行库是为了确认这套 IC617 安装本身是完整的如果连liboa都找不到说明安装包没铺全转换必然失败。最后一条测写权限看着简单但漏得最多——很多 PDK 是只读挂载或者由管理员统一分发普通用户根本写不进去转换工具转了几秒就静默退出日志里只有一行不痛不痒的提示。提示把which virtuoso和echo $CDSHOME的结果写进自己的环境记录里以后每次连服务器先比一眼比等到报错再回溯强。2.3 把目标库的 cds.lib 读明白转换工具是按cds.lib里登记的条目一个库一个库转的所以这份文件写错一行转换就少一个库而且不一定会报错。老 PDK 自带的cds.lib一般长这样# 老 PDK 根目录下的 cds.lib注意 DEFINE 第二个参数是库目录不是文件 DEFINE pdk035 /home/user/pdk/pdk035 DEFINE pdk035_3d3v_5v /home/user/pdk/pdk035_3d3v_5v # ASSIGN 是别名把后缀名指向主库转换时会跟着走 ASSIGN pdk035_3d3v_5v pdk035 # INCLUDE 会把另一个文件的定义也带进来转换器通常不会跟进去 INCLUDE /home/user/pdk/cds.lib.user三种语句的含义要分清DEFINE定义一个库名到库目录的映射是转换的主要依据ASSIGN给库加别名同一份数据用不同名字访问转换时一般会被识别成同一个库INCLUDE把别的文件内容并进来问题就出在这儿——不少版本的转换器只读当前cds.lib的顶层DEFINEINCLUDE进来的定义它不跟结果你以为登记了七八个库实际只转了两三个。稳妥做法是转换前把INCLUDE手动展开成显式的DEFINE行宁可文件长一点也别让转换器猜。还有一处细节DEFINE后面跟的第二个参数是库目录的路径不是cds.lib文件路径。图形界面里让你选的才是cds.lib命令行参数里给的也是cds.lib两者别混。行里有人把DEFINE pdk035 /home/user/pdk/pdk035/cds.lib这么写Virtuoso 启动时看起来正常一进转换工具就报找不到库查半天才发现多写了一级。3. 转换前的准备备份、目录、cds.lib 三件事3.1 先留后悔药整库冷拷贝加可读副本转换是不可逆操作工具会往库目录里写新文件、改旧文件中途失败留下的半成品库比原库更难救。所以第一步永远是备份没有例外。# 转换前先确认没有 Virtuoso 进程占着库有就先退干净 pgrep -u $USER virtuoso # 整个 PDK 打包留底文件名带上日期出问题能直接回到今天早上 cd /home/user/pdk tar -czf /home/user/pdk_backup_$(date %Y%m%d).tar.gz pdk035 pdk035_3d3v_5v # 再留一份解压状态的可读副本转换就在副本上做原始 PDK 不动 mkdir -p /home/user/oa_work cp -a /home/user/pdk/pdk035 /home/user/oa_work/pdk035_cdbtar -czf这步是后悔药一定不能省。cp -a里的-a表示归档模式保留权限、时间戳和符号链接这一点对 PDK 特别重要——工艺库里常有指向共享目录的软链接普通cp -r会把软链接展开成实体文件体积翻几倍不说还可能破坏原有的引用关系。转换放在副本上做原始 PDK 保持原样等转换验证通过了再决定要不要回填这个顺序别反过来。3.2 用 Library Path 另存一份专用 cds.lib下一步是给转换工具准备一份干净的库列表。原文的做法是打开virtuoso 进Edit → Library Path再File → Save As选 home 目录存下来。这一步的实际作用是把当前 Virtuoso 认识的库列表落盘成独立的cds.lib好处是转换时读的就是这份不会把别的项目库、临时库一起卷进来。操作顺序可以按这个走先cd /home/user/oa_work virtuoso 把 Virtuoso 起在专用工作目录下避免它自动读到 PDK 里那份带INCLUDE的老cds.lib进 CIW 后打开Edit → Library Path只看列表里你要转的那几个库无关的先在列表里删掉然后File → Save As文件名写cds.lib路径选/home/user/oa_work。存完立刻回头改这份文件把DEFINE的路径指向 3.1 里的副本目录而不是原始 PDK# /home/user/oa_work/cds.lib —— 转换专用只留要转的库路径指向副本 DEFINE pdk035 /home/user/oa_work/pdk035_cdb DEFINE pdk035_3d3v_5v /home/user/oa_work/pdk035_3d3v_5v_cdb这么做有两个好处一是转换产物和源库分居两个目录不会互相污染二是万一转换写坏了删掉副本重来一遍就行原始 PDK 一直干净。工作目录结构建议固定成下面这样后面写日志、回填都能对上号/home/user/oa_work/ ├── cds.lib # 转换专用库列表 ├── cdb2oa_pdk035.log # 转换日志 ├── pdk035_cdb/ # CDB 源库副本 └── pdk035/ # 转换产出的 OA 库3.3 目录、权限、库名三处容易漏的准备准备阶段剩下三件事看着琐碎但每一件都能让转换卡住。目录可写。转换工具会在cds.lib所在目录的同级或指定输出目录下新建 OA 库目录如果那个位置属于别的用户或者只读挂载工具会写到一半停下。用chmod -R uw /home/user/oa_work把自己的写权限补齐再用df -h /home/user/oa_work看一眼剩余空间——工艺库转出来的 OA 副本体积通常是原库的一到两倍空间不够会得到一个截断的库比直接报错更难发现。库名不冲突。转换产出默认沿用原库名如果 home 目录下已经有一个同名库工具要么跳过要么覆盖两种结果都不好。转换前用ls /home/user/oa_work看一眼确认目标位置是空的这是最省事的一步。进程要退干净。只要还有 Virtuoso 进程开着这个库转换工具就会遇到锁文件表现是转了一半停住日志里没有明显错误。pgrep -u $USER virtuoso查出来有残留进程先正常退出实在退不掉再清CDS.log和锁文件别直接kill -9一套打过去容易把库文件留在半写状态。4. 执行转换Conversion Toolbox 与 cdb2oa 命令行两套打法4.1 打开 CDB to OpenAccess Translator图形入口在 IC617 的 CIW 里Tools → Conversion Toolbox在弹出的对话框里选CDB to OpenAccess Translator然后在路径栏里填 3.2 准备好的那份cds.lib也就是/home/user/oa_work/cds.lib点 OK 之后工具开始逐库转换。原文的顺序就是这样难点不在点按钮而在点之前那份cds.lib是否只包含你要转的库。界面上还有几个选项值得留意输出目录如果留空产物会落在cds.lib同级的同名目录下库列表那一栏可以只勾一部分库先试转一个我一般先拿最小的那个库试水确认整套流程走得通再回头转主库。工艺库往往有几十上百个 cell全量转一次要等不短时间先小后大能省掉不少无谓等待。4.2 转换跑起来以后日志该逐行看什么转换过程中的进度会刷在工具窗口里同时写进日志文件。日志要当成黑匣子来读重点抓三类行# 正常转换的日志片段注意 successfully 不等于全对 Loading library pdk035 ... Converting techfile ... done Converting cell nmos3v ... WARNING: cell res_hr : property w has no OA equivalent, skipped Library pdk035 converted successfully.第一类是Loading library和末尾的converted successfully这两行确认库确实被完整读进去并且写了出去。第二类是夹在中间的WARNING上面这条的意思是某个 cell 上的一个属性在 OA 里没有对应表示被丢掉了——这类警告单个不致命但如果集中在 CDF 参数或者器件尺寸属性上转出来的库虽然能打开参数却对不上仿真时会得到莫名其妙的结果。第三类是ERROR和Cannot write这类硬错误出现就说明这次转换没走完别急着回填先解决再重转。日志里如果出现techfile conversion failed要格外警觉。工艺层信息没转过来的库打开版图是一片没有层名的图形DRC 规则文件也挂不上等于这个库白转。这种情况通常和源库的techfile.cds损坏或者工具版本不匹配有关重转一次还不行就得考虑单独把techfile.tf导出来手工挂。4.3 命令行 cdb2oa让转换可复现图形界面适合第一次摸索真要批量或者要留记录还是命令行踏实。转换器的路径在 2.2 里已经用which cdb2oa找出来了用法上先看帮助# 先把用法打出来不同版本的参数名有差异别照抄网上的写法 cdb2oa -help # 按库逐个转换日志单独落盘方便事后比对 cd /home/user/oa_work cdb2oa -cdslib ./cds.lib -lib pdk035 -log cdb2oa_pdk035.log cdb2oa -cdslib ./cds.lib -lib pdk035_3d3v_5v -log cdb2oa_pdk035_3d3v_5v.log参数逐个说-cdslib指定要读的库列表文件必须是你准备好的那份绝对路径和相对路径都行但一定要写对-lib指定这次只转哪一个库一次一个库的好处是出错时定位范围小日志也不会混成一锅-log把输出写到指定文件不带这个参数就只能在终端里翻屏转过几个库之后根本对不上哪段日志属于哪个库。注意网上流传的cdb2oa -i input.cdb -o output.oa这种写法和 Virtuoso 自带的这个转换器对不上号它既没有-i也没有-oCDB 库也不是单个.cdb文件。照抄这种命令只会得到一行 usage 提示先跑-help看清真实参数再动手。脚本化之后整批库的转换可以一条命令串起来转换前删掉旧产物、转换后自动检查日志里有没有ERROR这套流程跑顺了换一台机器重做环境也就几分钟的事。4.4 回填 PDK删旧库、放新库、重新打开转换成功后产物在/home/user/oa_work/pdk035下此时不要急着覆盖原始 PDK。原文的做法是把它复制回原来的 PDK 目录并把旧库先删掉再复制进去——顺序是对的但中间少了留底这一步我通常改成先改名再放新库# 确认转换产物结构正常能看见 cell 目录和 lib.defs ls -l /home/user/oa_work/pdk035 # 旧库改名留底不直接删出问题一分钟就能还原 mv /home/user/pdk/pdk035 /home/user/pdk/pdk035.cdb.bak # 新库整目录拷回去保留权限和时间戳 cp -a /home/user/oa_work/pdk035 /home/user/pdk/pdk035cp -a在这里同样是为了保留权限PDK 目录经常由管理员统一维护权限位被人改掉之后别的用户读不了报错信息还指向别处。拷回去之后cd进 PDK 目录virtuoso 重新打开这时候才是真正的验收时刻——第 6 章会讲具体查哪几项。如果暂时不想动原始 PDK也可以把转换产物放独立目录在项目自己的cds.lib里用DEFINE指过去等全套验证通过再考虑回填。这种做法在多人共用的环境里更稳别人不会被你的一次转换影响。5. 避坑与排查转换链路上五个真实翻车点5.1 转换阶段的三处翻车现象一转换工具列出来的库比cds.lib里登记的少。原因cds.lib里有INCLUDE语句被引进来的定义转换器不跟或者某条DEFINE的路径写错了、目录根本不存在工具读到这一行直接跳过也不大声报错。 解决把INCLUDE全部展开成显式DEFINE然后逐行ls确认每个路径真实存在再跑一次转换。养成转换前grep DEFINE cds.lib数一遍行数的习惯转完对着日志数一遍库的数量两边对不上先查这里。现象二转换跑到一半停住日志里没有明显错误行。原因目标目录没有写权限或者磁盘空间不够工具写不进新文件就卡在那儿另一种可能是还有 Virtuoso 进程开着源库锁没释放。 解决先df -h看空间再ls -ld看目录属主和权限最后pgrep -u $USER virtuoso确认没有残留进程。三样都排掉再重转别在卡住的状态下反复点 OK容易留下半成品库。现象三转换日志里一堆techfile conversion failed。原因源库的工艺文件本身有问题或者转换器和该版本的工艺文件格式不匹配。 解决单独把这个库拿出来重转一次还失败就跳过 techfile改用库自带的techfile.tf在 Virtuoso 里手工Tools → Technology File Manager → Attach挂上去。层信息能补总比整个库打不开强。5.2 打开阶段的两处翻车现象四库转完了重新打开 Virtuoso那条ddUpdateLibList的 Warning 一字不差还在。原因cds.lib里的DEFINE还指向老的 CDB 目录转出来的新库躺在别的地方没被引用或者 PDK 目录里prop.xx没清理干净OA 可执行程序仍然把它当 CDB 库。 解决先grep pdk035 cds.lib看实际指向确认指向的是新库目录再进 PDK 目录find . -name prop.xx把残留的全部清掉。清理前再确认一次备份是完整的。现象五库能打开cell 也能列出来但 schematic 打开是空的symbol 也没有 CDF 参数。原因转换时 CDF 数据没跟过来或者打开的根本是被改过名的旧库备份目录而不是新转的 OA 库。 解决先确认当前cds.lib指向的库目录里有lib.defs而不是prop.xx确认之后进 CIW 用Tools → CDF → Edit看这个库的 CDF 是否存在空的就说明转换阶段那条property has no OA equivalent的警告被忽略了。补救办法是拿原库的 CDF 导出文件重新导入或者对出问题的 cell 单独再转一次。6. 验证五步确认转换后的库在 IC617 里真的能跑转换完成不等于能用得按流程验一遍。我一般固定走五步顺序从“库级”到“cell 级”越往后越接近实际使用。第一步确认库格式。进 PDK 目录ls一眼看到lib.defs和各个 cell 目录没有prop.xx说明格式层面已经换成 OA 了。第二步确认库能列全。起virtuoso 打开Tools → Library Manager把cds.lib里登记的库逐个展开对比转换前grep DEFINE数出来的数量对不上就回第 5 章查INCLUDE那条。第三步确认工艺层信息在。随便打开一个库里的 layout看 Layer Selection Window 里有没有工艺层名而不是一堆layer_1、layer_2。层名不对说明 techfile 没转过来回到 5.1 第三条处理。第四步确认器件参数没丢。拖一个 nmos 出来按q看属性窗口里的宽长、模型名、CDF 参数是否齐全。这一步最容易暴露转换时被丢掉的那些属性。第五步跑一次网表。新建一个最小电路放一个器件接地Simulation → Netlist and Run只做 netlist看输出里器件模型名和节点是否正常。网表能出来基本就可以说这套库能在 IC617 上用了。验证项合格表现不合格时先查库格式有lib.defs无prop.xx是否回填到了正确的 PDK 目录库数量与cds.lib中DEFINE条数一致INCLUDE是否展开、路径是否存在层信息Layer 窗口有工艺层名techfile 是否转换成功器件参数q属性窗口参数齐全转换日志里的属性警告网表器件模型名、节点正常输出CDF 与模型库路径这套动作做完大概十几分钟但它能把“看起来转好了”和“真的能跑”区分开。从那以后我每次做 CDB 到 OA 的库迁移都强制走一遍这五步哪怕只是转一个小库也不跳步——跳过第三步那次我在版图里画了两小时才发现层全是错的返工比验证贵得多。希望帮到你。本文还有配套的精品资源点击获取

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

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

免费获取报价 →
↑