ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Virtuoso碰壁笔记:EMX集成、工艺角设置、版图绘制与PWL导入排查

Virtuoso碰壁笔记:EMX集成、工艺角设置、版图绘制与PWL导入排查 Virtuoso碰壁笔记自用模拟IC设计这行真不是光靠手册就能活下去的。我用Cadence Virtuoso这几年几乎每天都在跟各种报错、各种弹窗、各种“明明照着文档来但就是不对”的诡异现象打交道。尤其是从原理图设计、EMX电磁仿真、ADEL工艺角设置再到版图绘制和后仿真一环扣一环任何一个环节的“隐性设置”没弄对后面就是连环翻车。这篇笔记其实是我自己用来记录的碰壁合集想到哪写到哪后来发现很多经验周围同事也有同样的困扰就整理出来分享。如果你也在用Virtuoso尤其是做射频或模拟前端、离不开电感变压器建模、经常被工艺角和PWL激励折腾的这篇笔记大概率能帮你少走几天的弯路。先把话放前面我的使用环境是Virtuoso IC6.1.8配合MMSIM15.1工艺库是某家成熟节点的RF PDK。不同的版本和PDK在菜单名称、选项路径上会有差异但底层逻辑基本一致遇到“找不到选项”的情况先检查自己是不是被PDK版本限制了。1. 碰壁的来源和笔记范围为什么是EMX、ADEL、版图和PWL这四个重灾区先交代一下背景方便你对号入座。我主要负责射频前端里的无源器件建模和匹配网络设计电感、变压器这种东西寄生效应严重工艺厂PDK自带的模型往往不够用尤其是到了毫米波频段必须靠电磁仿真工具提参。这时候EMX就成了绕不开的环节。而EMX跟Virtuoso的集成远没有官方宣传的那么“一键完成”版本匹配、显示设置、回调机制每一个点都能把人卡住大半天。ADEL则是每天都要用的仿真环境。用户普遍反映的一个困惑是“我在ADE L里选了工艺角为什么跑出来的结果跟Typical一模一样”老实说这个问题我遇到过不止一次而且每次原因都不太一样。有时候是没选对corner变量有时候是工艺文件里的section名填错了有时候压根是仿真器没刷新模型库各种阴差阳错。版图部分就不用多说了任何做过版图的人都知道Virtuoso的版图编辑器功能太强强到很多功能藏得太深没人告诉你的话你可能一直用着最原始的操作方式在画。比如绑定(bind)关系检查、层次化显示、LSW层的显示权重这些东西每个都有坑。PWL波形文件导入看起来是个小功能但实际用起来也是问题百出格式不对、单位不识别、时间点不单调、文件名里有中文导致报错各种基础但致命的问题。别小看这个功能在做电源完整性仿真、数字干扰注入仿真的时候PWL激励是最常用的信号源不会用它几乎没法做混合信号协同仿真。2. 把EMX嵌入Virtuoso不是装个插件那么简单2.1 先搞清楚EMX到底在流程里扮演什么角色EMX是Integrand Software出品的电磁仿真工具专门做电感、变压器、传输线这类无源器件的建模。它的核心价值在于当你有一个版图布局后可以直接跑电磁场求解得到准确的S参数或等效电路模型然后把模型带回Virtuoso做电路仿真。相比在ADS里单独建模再导S参数文件EMX嵌入Virtuoso的工作流优势很明显版图和电磁模型在同一个环境里闭环改动版图后可以直接重新仿真不需要来回倒腾文件。但“嵌入”这个动作本身才是碰壁的开始。EMX不是简单安装一下就在Virtuoso菜单里出现的。它需要和Virtuoso共享同一个CADENCE_ROOT环境需要通过.cdsinit或者.cdsenv文件加载EMX的skill脚本还需要在Library Manager里看到EMX的专用视图。任何一步没配置好结果就是菜单里找不到EMX入口或者能启动EMX但无法读取当前版图。2.2 嵌入EMX时最容易翻车的三个环节第一环境变量的继承问题。EMX运行需要自己的license环境变量通常是EMX_LICENSE_FILE或LM_LICENSE_FILE而Virtuoso启动时如果是在一个新的shell里可能拿不到你在.bashrc里设的环境变量。我遇到过一次很隐蔽的情况直接在Virtuoso的CIW窗口里输入emx命令能执行但图形界面菜单里点了没反应最后发现是EMX的GUI进程起来后找不到license而license server的名字在Virtuoso所在shell里被覆盖了。解决方法是把EMX相关环境变量写进.cdsinit里用system()或getShellEnvVar去确保子进程继承。第二skill加载顺序。EMX的skill脚本必须在layout编辑器初始化之后加载否则工具栏按钮出来了但回调函数没注册点击后CIW窗口直接报“ErrorhiRegTimer: undefined function”。这个错误我之前查了很久最后发现是.cdsinit里加载skill的语句放在了layout窗口初始化代码之前。调整顺序后一切正常。第三视图类型冲突。EMX会在你的cellview下创建一个叫做emx的视图这个视图本质上是存储电磁仿真结果的地方。如果你的设计库里已经有同名的视图或者你在保存仿真结果时把cellview放在了一个只读的工艺库目录下EMX就会报“Unable to save EMX view”。所以最好把需要做EMX仿真的电感、变压器单独放在一个可写的设计库里不要在PDK的原始库里直接操作。2.3 EMX仿真过程中的常见报错排查我在EMX里跑得最多的是电感和差分变压器的提参。报错比较多的几个场景我整理成一个表格方便自查报错现象根本原因处理办法“Error: output port not found”版图里的引脚(pin)名称与EMX配置的port名称不一致在版图里重新定义pin使其与EMX的port定义严格对应“Layer not recognized”工艺文件里没有定义EMX要用的金属层和过孔层在EMX的techfile映射里手动补充金属层厚度、电导率参数“Simulation aborted (license)”license文件没有包含EMX feature检查license server确认EMX的feature名已添加“Result view is empty”电磁仿真完成了但结果没有回写到Virtuoso的emx视图检查EMX的保存路径是否是当前设计库路径含空格也会失败2.4 关于EMX结果回调的一个关键操作很多人在EMX仿真完成后习惯直接看S参数曲线但回到Virtuoso电路仿真时还是用的PDK自带的电感模型等于EMX白跑了。正确的做法是在EMX仿真结束后回到Virtuoso的schematic里调出一个专门用来调用EMX模型的symbol通常是emx_ind或类似名字在属性里填上要引用的电磁视图名这样才能把电磁仿真结果真正带入电路仿真。这里有个小技巧如果你有多个电感建议给每个电感起一个可读性高的cell名比如L_balun_2p4G而不是默认的ind_1、ind_2。因为在EMX的结果视图里你只能看到cell名可读性差的话很容易搞混哪个结果对应哪个器件。3. ADEL仿真里的工艺角设置改了corner却没生效的若干真相3.1 工艺角的基本逻辑一个容易被忽略的“变量传递”链条模拟电路设计里工艺角通常指的是SS、TT、FF、SF、FS这五个MOS工艺角以及电阻、电容的边界角。在Virtuoso的ADEL环境里工艺角不是直接“选中”的而是通过模型库的section切换来实现的。换句话说ADEL里的“corner”只是一个变量真正的参数变化发生在模型文件加载阶段。所谓“在ADEL中设置工艺角”的常规操作是在ADE L窗口的Setup-Model Libraries里面为每个模型库指定对应的Section。比如你的PDK可能有这样的文件analoglib基础元件库不需要sectionrf_pdk射频模型库有tt/ss/ff等section你需要在model library setup窗口的“Section”栏里输入对应字符串通常是tt、ss、ff等。但这里有个常见误解很多人以为在ADE L的Variables窗口里定义一个名为corner的变量然后填上ss就能实现工艺角切换。实际上除非PDK专门做了corner变量到section的映射否则这个变量根本不会被模型加载器识别。多数PDK的做法是直接读取Model Library Setup里的Section字段而不是读你在Variables里定义的东西。3.2 我的ADEL标准配置流程我给自己的项目总结了一套标准配置流程照着做基本不会再出现“改角无效”的问题在ADE L窗口选择Setup-Model Libraries先点“Browse”把工艺库的模型文件加进来。找到该模型文件对应的Section栏手动输入要仿真的工艺角名称比如ss、tt、ff。确认当前Testbench的原理图里所有PDK器件都使用了该模型库的symbol而不是用了analogLib里的理想器件。跑一遍DC工作点仿真验证MOS管的Vth、Id是否和预期一致。比如在SS角下NMOS的Vth会偏高Id会偏低如果数值没变化说明corner没生效回去查第2步。把工艺角作为设计变量单独提出不要和电路参数混在同一个变量里。这里特别提醒一句很多PDK的模型库里Section名称是区分大小写的而且可能带了前缀或后缀比如“ss_typical”、“tt_3v3”之类的一定要打开模型文件看一眼里面的section名。你要是自己猜一个填进去仿真器不会报错但会静默地使用默认section导致结果看起来“改了但没完全改”。3.3 温度、电源电压与corner的排列组合问题工艺角只是PVTProcess, Voltage, Temperature里的一个维度。很多人设置完工艺角之后忘了检查温度和电压的设定导致仿出来的结果不具备参考价值。ADEL里有几个和PVT直接相关的设置项温度在ADE L的Simulation-Options-Analog里设置默认可能是27℃。实际项目里经常需要跑-40℃、85℃、125℃。电源电压通常通过定义全局变量vdd来实现。在原理图里电源符号的直流值处填vdd然后ADEL Variables里给vdd赋值。这样在跑corner时可以同步扫描电压。我常用的做法是写一个简单的ocean脚本把PVT组合全部跑一遍ss_125℃_vdd_min、tt_27℃_vdd_typ、ff_-40℃_vdd_max这样三个组合基本覆盖了Design Rule的PVT要求。纯靠手动在ADE L窗口里改来改去容易漏跑组合而且不好追溯。3.4 corner扫描结果的可视化对比在ADE L里做corner对比我一般不用自带的“corner”按钮有些版本里没有而是改用“Design Variables”中的扫描功能。具体来说是把工艺角对应的section名定义成变量corner然后设置扫描值(tt ss ff)跑完后在Direct Plot里用“Corners”模式输出曲线就能看到不同工艺角下的曲线对比。但这个方法的前提是PDK必须支持通过变量映射section。如果你的PDK不支持那就老老实实用Model Library Setup里的Section切换每跑一个corner自己手动改一次Section然后用ADE L的“Plot State”保存每个corner的波形最后叠加打印。方法笨一点但绝对可靠。4. 版图绘制过程中那些“藏得很深”的设置与高频碰壁点4.1 新建库和Cell时的坑不要随便用“老模板”很多版图问题的根源在新建库和新建cell的时候就埋下了。Virtuoso里新建库菜单是File-New-Library这里必须选择“Attach to an existing technology file”然后选对PDK的techfile。如果选了“Dont attach”库就变成了一个无工艺库的纯图形库后面画任何层都会提示“No layer available”或者“Layer does not exist in techfile”。新建cellview时也是重灾区。在Library Manager里新建cellview时很多人直接选了默认的schematic然后费了半天劲画完原理图才发现自己要的是版图视图。正确做法是在新建cellview对话框里把“View Name”手动改成layout或者在下拉列表里选择layout工具才会打开版图编辑器。如果想要同时新建schematic和layout就分别建两次。说实话这个操作真不难但我见过不下五个同事在这里卡住过。4.2 从原理图到版图bind关系和XL流程版图设计里最核心的工作流之一就是原理图驱动的版图绘制Layout XL也叫custom layout。使用XL模式需要确保你打开版图时是通过“Launch-Layout XL”按钮启动的而且版图的top cell和原理图的top cell必须同名否则工具无法建立bind关系。bind关系一旦断裂你在XL模式下做的所有关联操作比如器件自动排列、连线提示都会失效但Virtuoso往往不会主动告诉你表面上看起来一切都正常直到你跑LVS时发现版图里多了一个器件或者少了一根线才意识到bind早就出问题了。判断bind是否正常有个很直观的方式在版图编辑器里按“ShiftF”或者选择“Verify-Markers”打开标记显示如果原理图和版图有对应关系XL模式下框选一个器件时原理图里对应的器件会被高亮。如果没有高亮说明bind断了最典型的修复方法是重新打开版图并用“Design-Open”选择正确的top cell或者重新生成一个XL版图。4.3 显示层次与LSW画图慢的根源往往在这里画版图卡顿、看不清层次、误画到别的层这些问题大概率出在LSWlayer selection window的显示设置和层次显示上。LSW里每个层次都有一个“display weight”权重越高图层显示越清晰。如果某些层次的权重设置太低画出来的图形会淡得几乎看不见你会以为自己画空了其实层是对的只是显示问题。还有层次化显示的问题。在复杂版图里如果要看底层模块的细节需要设置“Navigate Hierarchy”为“Edit in Depth”或“Display in Depth”。如果不调整这个选项你只能看到顶层cell的边界框看不到内部结构也就没法检查版图内部的走线和过孔。很多人抱怨版图编辑器“看不到东西”多半就是显示层次没有设对。4.4 DRC和LVS跑不过的常见共性原因LVS跑不过的报错里大致可以分成三类器件不匹配、节点短路/断路、参数不一致。其中器件不匹配通常是因为XL的bind断了或者版图里器件的层次写错了。节点短路和断路往往是走线重叠、过孔位置不当造成的这类问题靠肉眼很难查建议直接用Virtuoso的“Highlight”功能把LVS报错的网络高亮出来看。参数不一致最常见的是电阻的宽度、长度或指数量设置不一致跑LVS前先在版图里用“Property”查看每个器件的参数再和原理图对比。另一个高频坑是顶层PIN没有加label。软件跑LVS时靠label识别输入输出端口。如果你的版图端口只有metal图形没有文字labelLVS会把这些端口当成浮空节点直接报错。加label的正确姿势是在版图里选中端口金属按“L”键输入端口名确保“Pin”选项被勾选。这一步看起来基础但真能坑掉一大半新手。5. 导入PWL波形文件一整套从文件格式到仿真验证的完整流程5.1 为什么要用PWL文件作为激励在混合信号仿真或者复杂接口仿真里经常需要给电路施加一个非理想的实际波形比如电源上电时序、片外噪声注入、数字接口的毛刺信号。这些波形用传统的脉冲源或者正弦源很难描述这时候PWL分段线性波形文件就是最直接的解决方案。Virtuoso的模拟库里有vpwl、ipwl这类源可以直接从文本文件读取时间-电压/电流对。5.2 准备PWL文件的格式要求这是最容易踩坑的地方。Virtuoso的PWL文件要求很简单也很苛刻; 注释行以分号开头 ; 文件里的每个数据点格式时间 数值 0.0 0.0 1n 1.8 2n 1.8 5n 0.0 10n 0.0看起来很简单但有几个细节必须注意。第一时间单位默认是秒你写1n表示1纳秒如果写成1ns软件会报“Number expected”。第二时间点必须严格递增不能出现0、2、2、3这种重复时间点否则会被判定为非法。第三文件里不能有中文路径也不能有中文注释否则PWL文件解析器可能会报编码错误。第四文件末尾要留一个空行有些版本会忽略最后一行数据导致波形尾部被截断这个我在自己项目中实测遇到过加上空行就好。5.3 在Virtuoso中导入PWL文件的完整操作我这个流程在IC6.1.8上验证过多次在schematic编辑器里从analogLib调出一个vpwl电压源放到原理图中。双击vpwl符号打开属性编辑框。找到“PWL FILE”或者“File”一栏点击右侧的浏览按钮通常是个“...”选择你的PWL文本文件。确认时间单位设置。vpwl的“Time Scale”属性如果设为1表示按秒解析如果设为1e-9表示按纳秒解析。我喜欢直接写成1e-9这样文件里就可以写1 2 3这样的整数纳秒值。设置“Value Scale”为1如果数值单位是毫伏/毫安需要调整到1e-3。保存并运行瞬态仿真。仿真跑完后在波形窗口里查看该节点的电压波形如果和预期的PWL波形一致说明导入成功。这里还要强调一下vpwl的属性里有一个叫做“File”的字段和一个叫做“PWL”的字段前者是文件路径后者是一段内联字符串。有些版本会把“PWL”里预先填入一点内容如果你在“File”里也选了文件PWL字符串会优先于文件内容导致你看到的波形还是原来那段内联数据。所以记得把“PWL”字段清空只保留文件路径。5.4 波形不对时的排查方向拿到PWL之后波形不对不要急着怀疑软件坏了先按顺序排查打开文本编辑器确认文件内容是否符合5.2节的格式要求检查单位换算是否弄错比如时间轴差了1000倍检查vpwl源的极性正负极有没有接反检查仿真步长是否太大导致波形不够平滑瞬态仿真里的“maxstep”如果设置得太粗PWL波形的拐点会被忽略输出看起来像阶梯波。举个例子我上周做电源上电时序仿真给一个LDO的输入加PWL上电波形文件里写的是0μs到20μs线性从0V到5V仿真出来却是一条从0V直接跳到5V的阶跃波形。排查了半天发现是瞬态仿真的maxstep设成了1μs正好把中间的所有点都“踩”掉了只剩下首尾两个点。把maxstep改成0.1μs后波形恢复正常。这个坑特别隐蔽如果只看PWL文件的设置永远找不到原因。6. 把碰壁沉淀成习惯我的Virtuoso使用检查清单6.1 经验一任何新库、新Cell先做最小测试进入新项目、拿到新PDK、建了新库之后我的第一个动作不是直接画大图而是建一个干净的测试cell放一个最小测试电路比如一个反相器从schematic到layout到DRC/LVS全部跑通再把真实的电路搬进去。这个习惯帮我拦下了很多低级的PDK配置问题。很多PDK更新后techfile里的层映射会发生细微变化如果直接在大项目里跑出了问题很难定位是PDK的问题还是自己画图的问题。最小测试可以快速暴露环境层面的异常。6.2 经验二CIW窗口和日志文件是最诚实的“诊断医生”Virtuoso的Command Interpreter WindowCIW看起来只是个命令行输出窗口实际上它是整个工具的灵魂。任何脚本错误、加载失败、回调函数缺失都会在CIW里打印。很多“功能点了没反应”的灵异事件其实都能在CIW里找到对应报错。关键是养成习惯每次遇到异常先往下翻CIW的日志找红色的错误信息。同时仿真日志文件也值得重视。ADE L在每次仿真的输出目录下会生成spectre.out或hspice.out之类的日志里面记录了几百行模型加载信息。当corner不生效时打开日志搜索“section”看模型加载器到底加载了哪个section。如果日志里显示的是tt但你明明设了ss说明你的设置没有传到仿真器问题出在模型库配置上。如果日志里确实加载了ss但仿真结果还是和tt一样那就要怀疑PDK的ss模型本身是否有问题。6.3 经验三做好脚本化备份别把一切托付给GUIVirtuoso的图形界面能做很多事但可追溯性很差。我强烈建议把常用的仿真配置用ocean脚本保存下来放到项目目录下统一管理。哪怕你更喜欢在ADE L里操作也可以在跑完一组仿真后用“Session-Save Ocean Script”把当前配置导出成脚本。下次做回归测试、改工艺角重跑的时候直接修改脚本里的corner或变量值一键跑完所有组合比在GUI里来回点选高效得多还不会漏配置。版图同样建议配置一些快捷键脚本。Virtuoso的bindkey文件通常是~/.cadence/virtuoso_bindkeys里可以自定义快捷键映射。我习惯把“切换层次显示”、“标记某个层”、“隐藏所有label”这些高频操作绑到固定键位上画图速度提升非常明显。这些配置一两行就能搞定但很多人不知道还在用默认快捷键慢慢点。最后再补一句Virtuoso这个工具功能庞大到没人能完全掌握所有细节碰壁是常态关键是每次碰壁之后不要只在脑子里记一下写下来。哪怕是一个只有你自己看得懂的便签下次遇到类似问题翻笔记比重新Google半天快得多。这篇笔记里记录的都是我自己真正踩过的坑坑有多深只有踩过才知道。希望你看完能少踩几个。
返回列表