
搞模拟IC设计的人电脑里十有八九装过Cadence家的工具而Virtuoso IC617这版基本算是国内高校和中小型设计公司里最常见的版本了。它稳定、资料多、PDK支持广虽然界面没那么新潮但干起活来是真顺手。今天这篇东西不扯安装教程也不复读官方文档就把我这几年在IC617上用到的、踩过的、调通的技巧一次性做个梳理全当是给这个经典版本建一个技巧收集区内容偏实操新老手都能从里面捞点对自己有用的东西。先交代一下背景我用IC617基本是在模拟/混合信号前端设计这条线上原理图设计、ADEL和ADE L仿真、波形检查、版图XL调用、DRC/LVS、PEX后仿全流程都跑过。文章里提到的很多方法其他版本如IC618也通用但凡是IC617独有的操作我会特意标出来。1. 环境配置与PDK安装的那些坑1.1 环境变量配置的正确姿势很多人在IC617上栽的第一个跟头不是画版图而是软件起不来或者工艺库加载不全。其实这里面九成是环境变量没配好。IC617用的是$CDS_ROOT、$CDS_INST_DIR这类老牌变量然后通过.cdsinit和.cdsenv来初始化环境。我习惯的配置思路是这样的先建一个专门的Cadence工作目录比如~/cadence所有虚拟机和PDK的安装都放在这个目录下然后在~/.cshrc或~/.bashrc里配置好下面几个核心变量setenv CDS_ROOT /opt/cadence/IC617 setenv CDS_INST_DIR /opt/cadence/IC617 setenv PATH $CDS_ROOT/tools/bin:$CDS_ROOT/tools/dfII/bin:$PATH setenv CDS_LIC_FILE 5280license-serverIC617默认是用csh/tcsh的但在bash环境下也照样能跑关键是把CDS_ROOT指对。装完之后启动virtuoso一般用virtuoso 命令如果有多个版本共存最好用绝对路径调用避免工具串版本。这一步出错的话后面画原理图时报的一堆Unable to open file根本查不出原因所以环境变量一定要先验证好。另外很多人忽略的一点是.cdsinit文件。这个文件控制启动时加载哪些skill脚本、加载哪个display资源文件display.drf、默认的bindkey设置等。我每次新建一个工艺项目都会把.cdsinit里的ddGetObj对应库配置好这样打开virtuoso后原理图和版图的显示效果就是按工艺厂给定的Display资源渲染的不会出现连线颜色全是默认绿、层次看不清的情况。1.2 PDK工艺库的加载逻辑与常见报错PDK加载这件事说难不难但细节不少。IC617下的PDK通常是.tar或.zip包装载方式基本分三种一是工艺厂直接给的安装脚本比如installer或setup.sh二是通过Library Manager手工添加库路径三是用cpp菜单里的PDK auto-build功能。最常见的问题是装完PDK后打开原理图发现器件类型全是空的或者报库中没有定义该cell。这种情况多半是cds.lib文件没写对。cds.lib是Cadence的库路径映射文件PDK的.cds.lib里应该包含了类似下面这样的语句INCLUDE $PDK_DIR/cadence/cds.lib DEFINE analogLib $CDS_INST_DIR/tools/dfII/etc/cdslib/artist/analogLib我之前帮同事排查过一个问题启动virtuoso后analogLib里能看到电阻电容和MOS管但工艺库里的管子调不出来。最后查出来是PDK目录下存在两个cds.lib一个指向本地路径一个指向软链接路径软件加载时加载到了软链接那一版而实际PDK文件根本没安装在那个路径下。这个事情说明一个道理PDK安装后第一件事不是画图而是先核实cds.lib里的路径物理存在并且确认权限能读。还有个高频坑PMOS和NMOS器件的CDF参数没有自动带上PDK的模型名结果仿真的时候报模型未定义。这类问题通常在PDK库的.cdf或.cdf回调里写好了但如果你手工Copy过一个器件放到自己的库里CDF参数回调就会丢失仿真时自然不给过。所以我自己写脚本或复制器件时都会检查CDF里model name和simInfo是否完整不完整就直接从PDK库里重新调取原始symbol。2. 原理图设计从快捷键到自建器件2.1 出版社级别的快捷键配置IC617的默认快捷键说实话只算够用离顺手还有距离。我一般会在.cdsinit或单独的.bindkey文件里自定义一组高频操作。这里分享我实际在用的几组操作内容默认快捷键我的自定义保存并继续编辑F2F2未改放大/缩小Ctrl滚轮Shift滚轮选中同一网络ShiftFF6复制器件cc未改旋转器件rr未改快速打线ww未改属性编辑qq未改全选引脚CtrlACtrlA选中同一个网络这个功能特别实用在检查连线、批量改金属宽度时能省一大把时间。默认快捷键是ShiftF我改成F6是因为画版图时经常要交替使用XL的ShiftF做display options容易起冲突。你要是用Layout XL比较多建议把选中同一网络单独绑一个键别跟display options抢。另外IC617里有一个容易被忽略但非常好用的快捷键按E打开Edit Search可以按名字模糊搜索器件或网络。在用Top-down方式搭大规模原理图时这招比在原理图区里一层层翻要快得多。画顶层模块时我几乎全程靠E来跳转查找。2.2 自己画Symbol和CDF参数的要点调库里的标准symbol虽然够用但在做定制化设计时自己画symbol是家常便饭尤其是给一个子模块建symbol或者为了仿真加一个带外部寄生参数的器件模型。画symbol时要注意几个关键点引脚方向要与实际电气属性一致input/output/inputOutput别乱标否则LVS或仿真连接关系会错。引脚名称最好和网表里的节点名保持一致这样导出CDL网表后工具能直接识别。画完几何图形后一定要给symbol加CDF parameters否则放到原理图里没有参数可填仿真时SPICE网表根本生成不出来。CDF参数的本质是告诉Cadence怎么把你的符号翻译成SPICE网表语句。举个例子一个理想电阻在analogLib里的CDF会写成simInfo( ?instName R0 ?componentName resistor ?simulator spectre ?spicePrefer symbol ... )自己画symbol时打开Tools - CDF - Edit在Simulator里选spectre然后添加model name、value这些参数并指定它们在网表里对应的关键字比如r1 (net1 net2) rmod r1k。很多新手在这里迷路就是因为只画了形状、没给CDF翻译规则导致仿真器根本不认这个器件。如果你打算自己做参数化器件比如可变电容那就得写skill回调了比如让CDF parameter的capacitance值在改宽度时自动计算。这个有点进阶但学一次后效率提升非常大。我自己写过一个可变电感的Pcell靠这套回调在原理图里直接填尺寸就能生成对应感值不用每次都查公式。2.3 PWL波形文件怎么导入做电源完整性或信号完整性仿真时经常需要给激励源加一个非理想波形比如Buck电路的开关节点电压或者ESD脉冲。IC617里导入PWL文件的方式很直接但错误率也挺高——很多人改了半天还是提示文件格式不对。在analogLib的vsource器件属性里选择Source Type为PWL然后在File栏填绝对路径。注意IC617的PWL文件格式要求时间单位、电压单位写在第二行具体格式是这样的PWL 0.0 0.0 1n 3.3 2n 0.0 3n 3.3重点来了单位符号必须放在数值后n代表纳秒V可以省略但时间单位那一栏不能漏否则软件会默认成秒而你以为是纳秒仿真结果直接就错了。另外PWL文件的行结尾最好统一用Unix换行符LFWindows下编辑过的CRLF有时候会让解析器卡死。这个坑我在自己项目里碰到过换成LF后一切正常。3. ADEL与ADE L仿真工艺角、收敛和模型问题3.1 ADEL里的工艺角怎么设置很多教程喜欢直接讲ADE L的Model Libraries里加TT/SS/FF的模型文件这事儿本身没错但IC617里更标准的做法是用corners功能。在ADE L窗口的Setup - Model Libraries里你能看到PDK提供的所有模型库文件通常包括xx_tt、xx_ss、xx_ff这几个版本。直接手动切换也能仿真但每次改工艺角都要重新Load模型库效率很低而且容易漏改某个corner。我推荐的做法是在ADE L菜单中选择Variables - Corner如果PDK支持的话这里会出现一个可选的下拉框里面已经定义好了TT/SS/FF/FS/SF各角。只要选好角点Run仿真器会自动加载对应的模型库。如果这个下拉框是空的说明PDK没有自动生成corner定义这时就需要去Model Libraries里手动加载但你可以配合Ocean脚本批量跑多个角。打个比方Corner方式就像是给仿真器装了自动切换档位的变速箱你只要挂D挡走就行而手动改库文件的方式则像每次起步都要手动调离合能跑但费劲。3.2 仿真报器件未定义怎么排查这个报错几乎每个用Cadence做仿真的人都遇到过英文提示一般是ERROR (SFE-23): The instance xxx is not defined或ERROR (SPECTRE):model not defined。它背后的原因就三类原理图里放的器件没有对应的仿真模型。模型库没加载或者模型库路径不对。CDF参数里的模型名与模型库里的模型名不一致。排查时我先看报错信息里的实例名定位是哪个器件。然后打开Setup - Model Libraries确认模型库文件已加载并且Section那一栏填的是tt还是ss之类。再检查该器件的CDF参数尤其是Model name看它是否和模型库里的.model卡片名称一致。有一个非常容易忽略的点当你用的器件不是PDK自带器件而是自己做的理想模型时需要在CDF里指定spiceNetlistFormat为spectre并且模型文件以.scs格式导入。有很多人把模型文件做成.lib在Model Libraries里加载后总是报找不到模型因为.lib是HSPICE的格式在spectre下一般要转换成.scs才能认。我自己遇到过最离奇的一次是模型名明明在库里存在但仿真就是报未定义。后来发现是模型库文件的编码问题——PDK从Windows拷贝到Linux时文件被带上了\r\n行尾spectre解析时把\r当成了模型名的一部分。用dos2unix处理一遍后瞬间恢复正常。这个经验真的值得所有Linux环境下做仿真的人知道。3.3 瞬态仿真不收敛的处理思路ERROR (SPECTRE): The simulation timed out.或Newton iterations failed这类不收敛问题是模拟仿真的噩梦尤其是在带反馈环路和开关器件的电路里。我的处理顺序是这样的第一步先查时间步长。spectre默认的自适应步长有时在强非线性区比如LDO启动、振荡器起振会卡住。可以在ADE L的Simulation - Options - Analog里限制maxstep为信号周期的1/100到1/50比如一个10MHz信号maxstep设0.5n或1n往往能改善。第二步检查初始条件。很多瞬态不收敛是因为初始工作点根本不在收敛域。这个很抽象我用电饭煲来类比你直接把冷水和米倒进锅立刻按煮饭它也能煮但如果水温太高蒸汽瞬间冒出来锅盖可能打不开。仿真也是这样如果直接从零状态开始跑一个本来需要建立偏置的电路前几个纳秒很容易飞掉。解决方法是在关键节点上设ic比如运放输出、反馈电容两端或者给电源加一个缓启动斜坡让电路逐步进入稳态。第三步换积分方法。spectre默认是gear2在强非线性电路里可以试试trap。注意trap在高Q谐振电路里会引入数值纹波所以要根据电路类型选。我自己在做D类音频功放的环路仿真时gear2完全不收敛换成trap后跑了半小时就出结果了从此我对这个选项特别敏感。3.4 如何快速测量电路的增益和相位裕度做运放设计时几乎每个仿真都要看开环增益和相位裕度但直接在时域看波形不够直观效率也低。IC617里的ADE L有一个专门的stb分析可以仿真闭环电路的环路增益和相位裕度这在电源和基准源设计里非常常用。使用stb分析前要在环路中插入一个iprobe或stb Probe器件比如在analogLib - iprobe里找到它。把这个探针串在反馈环路上然后在ADE L中新建stb分析设置扫描频段跑完后用Calculator里的phaseMargin函数直接读相位裕度。这里有个关键细节iprobe器件在原理图里必须串联在信号通路中不能并联而且它本身不能引入直流通路否则会改变工作点。另一个容易被忽视的问题是如果你环路里有多条反馈路径stb探针的位置会影响测量结果的正确性一般应该放在主反馈路径上并且把其他反馈路径的环路增益算进去这个需要一点经验。频率响应和稳定性分析是模拟设计的核心内容我个人的体会是不要只依赖单一仿真方法。stb给出的环路增益是一个平均意义上的结果对于强非线性或大信号电路最好再用tran观察一下实际阶跃响应是否有振荡两者结合才能确认稳定性。4. 版图设计与物理验证从XL到PEX4.1 用Layout XL自动调平和连线IC617自带的Layout XL功能在画模拟版图时能显著减少手工劳动。它的核心在于和原理图的联动你选了某个器件或某个网络XL会自动高亮对应的版图器件和几何图形。我用XL的关键技巧是先用XL的Auto Pick功能把同类型器件一次性调平。所谓Auto Pick就是把原理图中所有相同参数、相同类型的器件自动放到版图里并按预设的行列排列。这个功能在处理大量匹配管比如电流镜阵列时特别好用省去了一个个手动摆放的工序。摆放完之后用Connectivity - Auto Wire按网络连接情况自动布线。模拟版图对走线宽度、屏蔽、对称性要求很高自动布线只是初始连线实际还要手工调整。但至少它可以把90%的通路连起来剩下的重点修一下关键信号线就行。这个过程中我最常犯的错误是忘掉给敏感信号线加shielding。比如带隙基准里的VREF线如果旁边走了数字开关信号耦合噪声能直接毁掉精度。每次画完自动布线后我都会手动检查一遍这些关键网络确保它们和噪声源之间有足够的间距或地线屏蔽。4.2 DRC和LVS检查的经验DRC和LVS这两步是流片前必须过的关卡。IC617集成的是Assura和PVS物理验证系统不同PDK可能默认的验证引擎不同但一般都会带Calibre的接口。我自己在实际项目中用得最多的是Calibre它在精度和灵活性上更胜一筹。跑DRC时最常遇到的就是间距违例和金属密度不够。间距违例之类的问题打开DRC Results窗口工具会高亮出位置直接根据报告改版图就行。金属密度不够则比较烦需要手动补一块虚置金属或者用工具自动fill。这里有个审计要点补fill之前一定要先确认fill cell的类型和间距规则有些fill block会引入寄生耦合在高频电路里反而制造新问题。LVS检查的本质是把版图的连接关系提取成网表再和原理图网表比对。LVS报错通常分三类器件不匹配、节点不匹配、属性不匹配。我最常踩的坑是电源和地的名字不一致。原理图里叫VDD版图里叫VCCLVS就会认为两个节点不同整个网表对不上。解决方法是在LVS设置里把电源地网络的别名统一或者干脆在原理图和版图里都用同一个名字。还有一类LVS问题很隐蔽同名不同层。比如你在版图里用M1画了一条VREF但又用M2走了一段VREF两者之间用via连接这没问题。但如果两个VIA没有对齐或中间隔了其他层提取出来的网表可能把VREF断成两个独立节点LVS直接报open。这时我会用Calibre RVE的短接查找功能逐段排查是哪段连接断了。4.3 PEX后仿与寄生参数的影响PEX后仿是验证版图性能的最后一道关卡。IC617里做PEX一般用Calibre xRC或Assura RC流程大概是先做LVS成功然后提取R/C/CC生成带寄生参数的网表再回到原理图或直接跑后仿。做PEX时有个重要选择RCCC还是只提取C或者RC。这取决于电路工作频率和对精度的要求。低频设计可能只需要C射频和高速数字电路必须带上R和CC。我的经验是至少提取RCCC否则后仿和实际硅片的差距会让你怀疑人生。提到高频热词里的emx就派上用场了。EMX是一款电磁仿真工具可以嵌入Virtuoso使用。它主要用于射频无源器件电感、变压器、传输线的建模。IC617支持通过PDK菜单或Launch - EMX的方式来调用。用EMX的好处是它能从版图直接提取出S参数替代传统等效电路模型精度高很多。用EMX时要注意仿真频率设置必须覆盖设计频段并且要合理设置port位置否则结果会带明显误差。后仿之前我还会习惯性地把寄生参数网表在ADE L里重新跑一遍静态工作点对比前仿和后仿的工作点偏差。如果偏差过大先不要急着看AC或TRAN因为可能是PEX提取的寄生电阻把某个偏置支路的工作点拉偏了这会直接影响增益和带宽找到位置再决定改版图还是改原理图。5. 常见报错与问题速查整理了一张我在IC617使用过程中最常遇到的问题和对应的排查思路放到这里方便随手翻阅。问题现象可能原因排查与解决思路原理图符号是空的cds.lib路径错误或PDK未完整安装检查cds.lib引用的路径是否存在逐个路径确认仿真实例未定义CDF参数模型名错误/模型库未加载打开Model Libraries确认加载路径比对CDF中模型名和.scs文件中.model名瞬态仿真不收敛初始条件缺失/步长过大设置关键节点ic限制maxstep尝试trap积分方法版图DRC报错但看不到高亮Results窗口选错验证类型确认在Calibre RVE或PVS Results窗口打开的是DRC结果而不是LVS或ERCLVS报电源地不匹配电源地网络命名不一致在LVS设置中设置全局网络别名或修改原理图/版图统一名称PEX提取的网表无法仿真网表格式不匹配/模型缺失确认PEX输出格式选择spectre并把模型库一并加载到ADE L中This application has quit unexpectedlyLicense服务掉线或文件权限异常检查license server状态用lmstat查看并对工作目录执行chmod修复权限无法保存原理图/库被锁定库目录权限或cds.lib被占用检查库目录写权限并确认没有多个virtuoso进程同时操作同一库ODBC数据源相关报错常用在Allegro/PCB流程与IC617关系不大如果你在IC617碰到多半是误装了Allegro的组件可忽略或卸载我还想专门提一下“This application has quit unexpectedly”这个问题在我身边出现过好几次。多数时候不是软件本身坏了而是license过期或license服务没启动。用命令行检查lmstat -a可以快速定位。有一次我排查了很久发现是机器的hostname变了导致license失效改回来就恢复正常。另外工作目录的磁盘写满也会导致virtuoso异常退出这个也值得一看。6. 版本选择与项目协同的实用建议6.1 IC617和其他版本如何共存很多人会遇到这种情况毕业设计用的IC617到公司发现装的是IC618。其实这两个版本可以共存配置的关键还是$CDS_ROOT环境变量和启动脚本。我建议为每个版本单独写一个启动脚本比如alias v617setenv CDS_ROOT /opt/cadence/IC617; setenv CDS_LIC_FILE 5280license-server; virtuoso alias v618setenv CDS_ROOT /opt/cadence/IC618; setenv CDS_LIC_FILE 5281license-server; virtuoso这样两个版本都能用互不干扰。唯一要注意的是PDK的兼容性有些老PDK只支持IC617新版PDK可能只支持IC618或IC23.1。不同PDK版本对应的OA版本也不同如果PDK要求的是oa22而你的IC618用的是oa23可能加载不了。所以版本共存时最好把PDK按版本分开安装不要混合使用。我在本地一般会保留一个IC617和一个IC618双环境IC617用来跑老项目IC618用来做新工艺。前一阵子为了对比一个老工艺下的ESD防护方案就同时打开了两个版本。一句话总结就是版本不是越新越好而是够用、稳定、PDK支持好。6.2 多人项目的文件组织与备份IC617的项目文件结构相当敏感library目录里包含了cds.lib、.cds.隐藏文件以及各个cell的.oa文件。多人协作时最怕两个人同时写同一个库OA数据库的并发控制做得一般搞不好直接损坏。我在团队协作时定的规则很简单每个设计人员有自己的私有库公共库比如PDK只读。原理图和版图文件都用Git管理但要注意OA文件是二进制格式Git diff基本没用只能当作备份工具。每天结束前用tar打包整个library目录加上日期后缀存到共享盘。这里有一个关键点不要直接对.oa文件做版本管理因为OA文件在同一时间可能被多个进程打开Git或SVN的原子性保护不住它。最稳的方式是定期快照整个库出问题能立刻恢复到上一个可用版本。我吃过一次亏当时做一个快充控制芯片某天下午大家同时改同一个顶层cell结果晚上一编译整个库报“database corrupt”抢救了一整晚才把大部分cell找回来。从那以后我养成一个习惯大改之前先tar -czf backup.tgz library这招帮我避过好几次风险强烈建议所有用IC617的人养成这个习惯。6.3 从IC617迁移到新版本时的注意点如果你打算从IC617迁移到IC618甚至更高版本最需要注意的是PDK版本和库格式的兼容性。IC617默认的OA版本是oa22IC618开始是oa23。如果你的老PDK用的是oa22格式直接搬到IC618上可能打不开。Cadence官方提供了oaUpdate工具可以把老OA库升级到新版本。实际操作时先复制一份库目录然后在IC618环境下执行oaUpdate -lib library_path这个命令会把OA库的格式更新到当前工具链支持的版本。但要注意两点一是升级后老版本工具可能就打开不了这个库了所以一定要在副本上操作二是有些PDK的pcell回调代码是老skill写的在新版本下可能有兼容性问题如果出现pcell打不开的情况多半是这类问题。另外IC618界面上很多菜单名称和快捷键都跟IC617不一样了比如ADE L改成了ADE ExplorerExport - CDL的位置也有变化。从IC617迁移过来的老手第一周大概率会有一种“找不到北”的感觉但只要基础操作逻辑没变熟悉几天就能恢复效率。7. 我的几个压箱底小技巧最后分享几个特别实用但一般文档里不会专门写的小操作都是我在实际项目里摸索出来的。第一个是快速定位原理图和版图的对应关系。在Layout XL里你选中版图中的一个器件然后按ShiftL工具会自动在原理图窗口里高亮对应的器件和网络。反过来在原理图里选中某个模块按ShiftX可以下钻到子模块。这两个快捷键的组合使用能让你在检查大模块时节省大量时间。第二个是批量修改器件参数。如果原理图里有几十个电阻需要统一改宽度不需要一个个双击改。选住它们然后按q打开批量属性编辑窗口一次就能改完。这个功能不只对器件有效对连线名称、引脚名称也一样。我在做版图前检查总是一口气选中所有需要调整尺寸的MOS管一次性把fingers和multiplier改到位。第三个是自定义skill脚本做自动化。IC617最强的地方之一是它的skill脚本能力。比如给所有连线添加label、批量改金属层次、快速生成特定结构的Pcell全都能用skill跑。我写过一个小脚本作用是在原理图里把散落的相同模块按坐标对齐省了半小时的手工拖拽。如果你有类似的重复劳动停下手头的活花点时间学个skill脚本收益是长期的。第四个是善用Calculator的怪招。在ADE L里跑完仿真后不需要反复重新仿真就能用Calculator对波形做很多处理。比如你想看两个节点的电压差直接在Calculator里用V(net1)-V(net2)就能算出来连仿真都不用重跑。还包括对波形做FFT、测量上升沿、计算RMS值都是实时操作。IC617这代工具说老练也不为过稳定性比后来的新版强很多配合自家PDK基本能让人专注在设计本身而非折腾软件。希望这篇汇总对你有点用也欢迎同行们在下面继续补充你们自己攒下来的技巧这个收集区本来就该大家一起来填。