ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Calibre PEX与Virtuoso ADE后仿联调:从寄生参数提取到故障排查

Calibre PEX与Virtuoso ADE后仿联调:从寄生参数提取到故障排查 做模拟IC后端的人几乎都经历过这种场面版图LVS一片绿Calibre PEX也“成功结束”结果一进Virtuoso ADE做后仿要么报错满天飞要么仿真结果离奇到怀疑人生。PEX和后仿真联调这件事看起来就是“把Calibre结果倒进ADE”实际上中间隔着好几层配置和约定任何一层出问题前面所有工作都白干。这篇文章就把我这些年踩过的坑、总结的排查链路和工作流习惯一次性说清楚内容主要围绕Calibre xRC与Virtuoso ADE联调也覆盖PEX结果反标进仿真器的完整过程适合正在做模拟版图后仿真的工程师还有刚接触后仿真的研究生群体。1. 后仿崩盘前先想清楚Calibre在这条链路里到底扮演什么角色很多人一开始就把PEX理解成“LVS的加强版”觉得LVS过了PEX就是顺手把寄生参数导出来。这个理解是后仿真连环翻车的根源。PEX和后仿这套流程本质上是“版图物理信息 → 寄生参数网表 → 仿真器可识别的抽象视图”的三级转换Calibre在其中不是只做一次抽取就完事它输出的东西要能被Virtuoso ADE正确解读才行。1.1 PEX不是LVS的顺手产物LVS检查的是“版图是不是实现了原理图”它输出的是一个布尔结果匹配或者不匹配。PEX则完全不同它要做的是在版图几何形状上提取出电阻、电容甚至电感然后把这些寄生元件“贴回”到晶体管连接关系里生成一个带寄生参数的新网表。这个网表既可以是一份文本文件比如SPECTRE格式、HSPICE格式也可以是一个能被Virtuoso直接读取的视图比如calibreView或av_extracted view。关键点在于PEX抽取的规则来源于工艺厂提供的PEX rule file而不是LVS rule file里顺带写一段就能用的。很多PDK会把LVS和PEX的规则放在同一个压缩包里但在Calibre Interactive界面里它们是两个独立的runset。我见过不止一次有人拿LVS的rule去跑PEX结果Calibre直接报错或者更隐蔽的情况是抽取出的寄生参数完全不符合工艺实际。1.2 拿到手的“后仿网表”究竟长什么样如果你用Calibre xRC跑完PEX选择输出SPECTRE格式的网表文件打开后会看到类似结构的内容首先是文件头部的注释标明这个网表由哪个版本Calibre、哪份rule文件生成然后是子电路定义里面是晶体管的替代描述每个晶体管旁边挂着一堆寄生的RC网络最后是顶层调用和端口声明。如果选择输出为calibreView情况就不同了。calibreView本质上是一个在Virtuoso库里创建的特殊cellview它内部引用了PEX过程中生成的寄生网表文件和符号symbol在ADE仿真时通过config view把它当作一个“黑盒”或者“灰盒”来调用。这种方式不需要手动改网表界面操作上最顺滑但前提是symbol、cellmap、model library三层配置全部对齐否则会在仿真启动阶段报五花八门的错。经常有人问“Calibre转换完的文件存在哪”这其实取决于你在PEX界面里设置的输出目录。网表文件、dspf文件、log文件默认生成在当前工作目录或者你指定的output directorycalibreView则会被写入你指定的库目录下viewName通常是calibre或av_extracted。如果找不到文件先去这两个地方翻基本都能找到。1.3 教程没告诉你的版本耦合问题还有一个隐蔽的坑是版本耦合。Calibre的版本、PDK的PEX rule版本、Virtuoso的版本、仿真器版本这四者之间存在微妙的兼容关系。比如某些老工艺PDK里的PEX rule是在旧版Calibre上验证过的新版Calibre虽然能跑但输出的网表格式可能有些细微变化导致spectre读取时报“unrecognized statement”。我自己的教训是每次换PDK版本或者换Calibre主版本时不要闷头跑一个大设计先用一个最小测试结构比如一个反相器、一个差分对跑通PEX和后仿确认整个链路稳定了再上实际项目。这个最小烟雾测试能帮你把版本问题隔离在最早期。2. PEX抽取阶段最容易忽略的规则与参数清单式梳理后仿真出问题很多时候问题并不出在Virtuoso ADE那一段而是PEX抽取阶段埋下的雷。这个阶段如果不仔细后仿阶段会出现“全网表生效了但参数明显不对”这类最难定位的故障。2.1 PRC文件与runset是后仿的“地基”Calibre PEX通常使用xRC规则对应的rule deck里除了包含LVS部分的连接关系定义还需要包含PEX所需的寄生提取规则。在Calibre Interactive界面里选择PEX之后你会发现它比LVS多出了很多选项卡其中最重要的就是“PEX Options”和“Outputs”。PRC文件比如rcx_std_3d.prc或者工艺库里提供的一系列.prc决定了提取的精度模式常见的是标准RC提取、高精度3D提取等。PRC文件如果选错后仿跑出来的结果可能整体偏差10%以上。选哪一档取决于你的设计需求普通模拟模块用标准档足够高精度ADC、SerDes这类对寄生极度敏感的设计才考虑更高精度的选项。另外runset文件里常常会有针对不同金属层厚度、介质层介电常数的设置这些常量必须与工艺厂最终量产的参数一致否则抽取出的电容绝对值就会出现系统性偏差。这也是为什么我坚持使用工艺厂最新发布的runset而不是拿着几年前的项目拷来的旧runset反复复用。2.2 Gate-level还是Transistor-level别凭感觉选PEX抽取模式一般分transistor-level晶体管级和gate-level门级。对于模拟电路后仿真绝大多数情况下你要选transistor-level因为它会把每个晶体管都保留为有源器件并且提取完整的RC寄生网络。gate-level模式则会把标准单元内部的晶体管网表折叠成门级模型只保留门之间的互连寄生这个模式通常用于数字模块的时序分析和功耗分析。模拟工程师如果误选了gate-level会出现一个典型现象后仿真网表里晶体管数量变少一些偏置结构、自举开关根本找不到仿真结果完全失去参考意义。反过来数字工程师在跑标准单元时序时如果选了transistor-level虽然结果更精细但网表规模会爆炸仿到天荒地老。所以跑PEX之前先问自己一个问题我要仿真的是模拟行为还是数字时序答案决定了抽取模式这个选择没有中间地带。2.3 reduction、format与输出目录决定调试效率的三个开关PEX界面的Outputs选项卡里format选项通常有SPECTRE、HSPICE、ELDO、SPICE、DSPF、SPEF等。如果你是标准Virtuoso ADE环境选SPECTRE或者HSPICE格式最稳妥。这里有一个容易被忽略的点如果你后续要在ADE里用hspiceD仿真器跑后仿PEX输出格式最好选HSPICE如果用spectre跑PEX输出格式选SPECTRE。虽然很多情况下仿真器能自动识别网表后缀但跨格式使用偶尔会触发语法兼容问题没必要给自己埋雷。reduction选项同样重要。reduction的作用是合并寄生网络中的冗余节点减少网表规模。对大规模的模拟模块比如一个有几百个晶体管的运放开reduction能显著减小网表体积仿真速度也更快但代价是精度微微下降。如果你在做高精度匹配相关的仿真建议先关掉reduction跑一版再打开reduction跑一版对比结果差异在可接受范围内再放心使用。输出目录建议固定成一个专门的后仿目录并且保持和原理图library分开。这样PEX日志、网表、dspf文件都集中在一起出问题时排查起来很清晰。3. Virtuoso ADE里三个“看不见”的映射cellmap、symbol与config viewPEX抽取完成后真正决定后仿真能否跑通的是Virtuoso ADE里那一套映射机制。很多报错信息都指向“view not found”或“model not defined”本质上都是映射没配好。这一章把这些映射的底细翻出来讲清楚。3.1 config view的正确打开方式跑后仿时通常你需要创建一个config view在这个view里把testbench的schematic部分和被测模块的calibre view组合起来。也就是说顶层testbench仍然用普通schematic而被测模块的viewName从schematic换成calibre或者av_extracted。很多初学者直接在ADE里点“Create New Config”然后手动填cell和view结果最多只能用面包板的方式拉通一两个单元。对于更复杂的层次化设计推荐的做法是使用Virtuoso的Config Editor工具在里面以表格形式把每一层模块的view都指定好。需要注意的是这个指定是递归的如果被测模块下面还有子模块而你的PEX没有抽取子模块的calibre view那需要在config里把子模块仍指向schematic否则会出现“view not valid”之类的错误。另外config view本身还要指定仿真器视图映射文件通常是simulation view mapping这些文件一般在安装目录或PDK目录里由CAD团队统一维护。如果公司里没有统一维护你自己也得把这一层弄明白因为报错时不会有人替你查。3.2 calview.cellmap写成什么样才不算坑cellmap文件是Calibre提供给你的“翻译词典”它告诉Virtuoso当你在config里引用calibre view时应该把它映射到哪个仿真器对应的抽象视图上。常见的文件名是calview.cellmap里面会有类似这样的内容* hspiceD block blockName ( pin1 pin2 pin3 ) hspiceD * spectre block blockName ( pin1 pin2 pin3 ) spectre实际用的时候我们更常直接使用通配符写法比如* spectre * block * ( * ) spectre这样无论模块名、端口名是什么都映射到spectre视图。如果你的PDK提供了自带的cellmap文件通常里面已经写好了工艺库中所有基础器件的映射你只需要在上面追加自定义模块的映射规则即可。有一个坑经常出现cellmap文件里没包含某个PEX view对应的底层器件比如某些PDK的cap、res结果仿真启动时提示“unknown model”。这个时候你需要在cellmap里显式把该器件map到仿真器的对应器件模型上或者检查PDK是否还提供了独立的pex model library文件在ADE的model library设置里把那个文件include进来。3.3 没有symbol时PEX View也会“哑火”calibreView在Virtuoso里显示时依赖一个东西symbol。它并不像schematic那样拥有自己绘制的电路图形而是借用被测模块自身的schematic symbol来显示。如果这个模块没有symbol或者symbol的pinName与PEX网表里的端口名不一致仿真启动时就会报“Symbol required”或“Pin not found”的错。遇到这种情况常规做法是手动创建一个symbol。方法有两种一是直接在schematic view上执行Create Symbol让Virtuoso按schematic的端口自动生成二是从其他同端口类型的器件拷一个symbol过来再改名。我自己更倾向于第一种因为自动生成的符号端口顺序和名称与schematic完全一致降低后续匹配出错概率。需要注意的是修改了symbol后一定要重新保存一次schematic view然后重新生成calibreView否则symbol和PEX网表的端口对应关系还是旧的最后仿真结果会跟没改一样报错。4. 仿真器视角网表反标、模型文件与数值合理性过了映射这一关仿真器开始读网表了这时又有一批新的问题浮出水面。这些问题往往比view mapping更隐蔽因为它们的报错信息可能只是一句“Error encountered during transient simulation”具体原因要看日志文件才能发现。4.1 网表反标后的instance参数在读什么打开生成的SPECTRE格式寄生网表你会看到晶体管的参数不再只是简单的w、l而是多出了很多与版图相关的寄生项比如ad、pd、as、ps、nrd、nrs有的还会包含sa、sb、sc等。这些参数是PEX工具根据版图的源漏区面积、周长以及邻近关系自动计算出来的如果你的版图画法不标准这些参数会和理想值差很多。后仿真结果偏慢、偏快、电流变小、带宽变化很多时候都可以从这些参数上找线索。例如ad、pd偏大说明源漏区面积和周长都很大对应的结电容就大电路速度自然上不去。你可以在ADE里打开“Outputs → To Be Plotted”把关键节点电压和电流打出来再和pre-sim对比如果差异集中在某个晶体管的d/s寄生参数上就能反推出版图哪里需要优化。另外要注意PEX网表里晶体管的model name是从PEX rule映射过来的。如果发现某个instance的model name是unknown或者default那通常是抽取时没有正确识别器件类型常见原因是版图里器件的层次层次识别码layers map和规则文件不匹配。这时候回到Calibre Interactive的“Inputs”选项卡里检查layers map设置。4.2 电源地命名与模型include是重灾区后仿真里报错频率最高的两类问题一是电源地网络名称不一致二是模型库文件没有include全。电源地名称不一致的典型表现是PEX抽取时把VDD!识别成了VDD或者把VSS!识别成了GND!导致网表里出现悬空节点仿真时某些晶体管栅极悬空结果完全乱掉。解决办法是在PEX界面的“Outputs”里明确指定power net names和ground net names例如把VDD!、VSS!填进去让Calibre在抽取时把所有电源地网络正确连接起来。如果你设计里用了多个电源域比如AVDD、DVDD、AVSS、DVSS也要一次性都填进去。模型include的问题则主要出现在PDK使用了独立的PEX model library的场合。很多先进工艺PDK会提供一个专门给后仿用的model文件里面定义的模型参数和pre-sim的Model Library略有不同比如增加了与应力、温度相关的修正。如果你只include了pre-sim模型库后仿能跑但结果不一定反映真实工艺行为如果include了但路径不对仿真直接在“Loading model file”阶段报错。建议在ADE的model library setup里把PDK推荐的pex model放在pre-sim模型之后加载让后仿模型覆盖前仿模型中的对应定义。4.3 后仿数值的合理性校验方法跑出结果后先别急着看波形做一次“数值合理性校验”能帮你避免拿错误结果分析半天。最简单的方法是找几个已知容值的节点比如某条信号线上的金属寄生电容大约在fF量级而抽取结果里显现出几百fF那大概率是抽取设置出错或者命名错误导致电容接到了不该接的节点上。还可以对比不同corner下的后仿结果。如果两个corner之间后仿差异大得离谱先回看PEX阶段是否把电阻温度系数、电容电压系数这些二级效应正确包含进来了。有些PDK的PEX rule里默认不带某些二级效应需要你在PEX界面的“Options”里手动打开。另外一个很实用的检查方法是只抽C不抽R。把PEX输出的电阻选项关掉只保留电容再跑一遍后仿和完整RC后仿对比。如果两者差异很小说明你的设计里电阻寄生不敏感后续优化可以集中精力在电容上如果差异很大说明互连电阻是关键路径版图优化时要考虑加宽金属、减少长走线。5. 问题排障的完整链路从抽取端到仿真端的逐层排查后仿联调一旦出问题最忌讳的就是瞎试。我总结了三条经验先判断问题属于抽取还是仿真再对照高频报错字典逐条排除最后才考虑性能优化。按这个顺序来能把排查时间缩短一半以上。5.1 先判断“是抽取的问题还是仿真的问题”判断方法很简单把PEX输出的网表文件直接拿给仿真器读不通过ADE也不通过calibreView而是在命令行里用spectre或hspice去跑一个很小的testbench。如果命令行仿真都报错那问题在抽取端或网表本身如果命令行仿真能过那问题多半在Virtuoso ADE的映射或配置上。比如spectre直接读网表时提示“unrecognized property”说明PEX输出的网表语法和你的spectre版本不兼容重点排查PEX format选项和仿真器版本如果提示“unknown model”重点排查model library include。相反如果命令行仿真一切正常而ADE里跑就崩那就去查config view、cellmap、symbol这条链路。5.2 高频报错对照表我遇到过的十五种情况下面这张表是我这些年在后仿联调中遇到的高频报错归纳按“报错信息 → 可能原因 → 解决方向”列出你可以直接把它当作排查手册用。报错信息关键字可能原因解决方向view not found / unbound viewconfig view里引用了不存在的viewName检查PEX是否成功生成calibre/av_extracted且目录正确Symbol required被测模块没有symbol在schematic上Create Symbol再重新生成PEX viewPin not found / cannot find terminalPEX网表端口名与symbol端口名不一致统一端口命名检查PEX netlist的端口顺序和schematic一致unknown modelmodel library未包含或映射错误在ADE model library中include PDK后仿模型文件unrecognized statementPEX网表语法与仿真器不兼容调整PEX输出格式为SPECTRE或HSPICE匹配仿真器duplicate instance层次化抽取时子模块被重复调用检查PEX层次设置合理使用hierarchical/lumped选项element has no model器件类型PEX未正确识别检查layers map确认器件层次识别层齐全fatal: read lock on databaseVirtuoso库被其他进程锁定关闭无关窗口检查是否有多个Virtuoso实例占用库Error found by spectre during ...需要看详细日志通常是模型或语法问题在ADE里找simulation目录下的spectre.out或simulation.log查看细节Pcell eval failedPEX view里的参数化单元评估失败检查PDK Pcell版本重新生成PEX viewNumber of terminals does not matchsymbol端口数与网表端口数不一致重建symbol或检查PEX设置中的port pin assignmentModel is not found in archive模型文件路径失效重新检查model library的路径确认文件未移动... is stripped单元库没有映射到仿真视图在cellmap或者config里补充该器件的view mappingground / bulk floating电源地网络未识别或体端未连接PEX里填全global net检查是否缺少BULK pinToo many digits in integer某些缩减参数导致数值异常检查PEX reduction设置关闭过激进选项这些内容不看一遍是不会放在心上的遇上了再回来对照也不迟。5.3 后仿跑不动的性能优化思路后仿真最大的抱怨永远是“跑得太慢”。除了换更好的机器和加并行核数还有几个立竿见影的办法。第一合理使用reduction。我在2.3里提过这里再强调一下reduction不是越低越好也不是越高越好最好针对你的设计规模调试一个折中值。模拟模块在几千个寄生节点以下reduction的影响一般可以忽略但到了数万节点以上开reduction能明显缩小网表。第二尝试层次化抽取。如果你的设计是顶层下一堆子模块重复实例化比如阵列结构、多通道结构Calibre支持对其中一个子模块抽取然后顶层复用同一个子电路定义这样网表规模能大幅度压缩。代价是子模块之间的耦合寄生可能无法完全模拟所以适合对模块间耦合不敏感的设计。第三在ADE中选择合适的仿真档位。spectre的aps、tran的gear2、lte tolerance等选项都能显著提升仿真速度。这些方法在做前仿真时大家可能也用过后仿真由于网表大了几个量级这些选项的价值就更加突出了。不要一上来就追求极高精度先用中等精度跑通再在关键节点上用高精度复算这是工程实践里更务实的路径。6. 我把PEX后仿做成“不慌不忙”流程的几点习惯最后聊一些流程层面的习惯。这些习惯不解决某一个具体的报错但它们能让整个PEX和后仿流程的可控性大幅提高。很多人在项目里频繁加班赶后仿往往就是缺少这套流程带来的确定性。6.1 工程目录与日志管理一年后还能复原现场我习惯在项目启动时就把目录结构固定好。比如project/下分schematic/、layout/、pex_out/、simulation/、logs/几个子目录所有PEX输出统一写到pex_out/所有ADE仿真输出放在simulation/下Calibre的运行日志单独存到logs/里。这样做的价值在项目后期尤其明显一个模块跑完后仿三个月后要回看当初的抽取条件你只要打开logs/下的log文件就能看到当时用了哪个rule文件、哪些PEX选项、输出目录是什么。不需要去问旁边工位的同事也不用翻聊天记录。日志是工程项目的记忆这句话在PEX后仿上尤其适用。6.2 建立你的版本兼容性档案版本兼容性问题我在这篇文章里从开头提到现在因为它确实是最阴魂不散的问题。除了依赖CAD团队的统一管理你也可以自己维护一份简单的版本档案。每次成功跑通一个完整后仿流程时记录下这些信息Calibre版本号、PDK版本号、PEX rule文件路径、PRC文件选择、Virtuoso版本、spectre/hspiceD版本、model library路径列表。用不到半年你就会发现这份档案不仅能让你自己少走弯路还能在团队内部评审时帮别人跳过同样的坑。有一次我的同事后仿怎么都跑不通我翻档案发现他用的PEX rule版本和现用PDK相差了两个小版本让他换回匹配版本后一次通过。版本对齐这件事看着小实际影响巨大。6.3 回归思维从“跑通一次”到“每次都能复现”最后一个建议是把后仿真当作一个可重复的流程来对待而不是一次性操作。每次修改版图、重新抽取、重新后仿都要有意识地对比本次结果和上一次结果。这个习惯一开始会觉得繁琐但对模拟电路设计尤其重要因为很多后仿真问题不是“报错”而是“结果悄悄变了”。比如你在某一版版图里加了一条屏蔽走线后仿结果显示运放带宽下降了如果不做前后对比你可能以为是屏蔽线本身的问题但实际可能是抽取时某个层次设置变化导致寄生效应的偏差。有了回归对比的习惯就能快速定位变化点不至于被错误的方向带偏。就我个人而言后仿联调这件事真正考验人的地方往往不在某个具体的报错而在于面对一堆复杂线索时能不能快速定位问题分层。把Calibre PEX和Virtuoso ADE联调的原理吃透把常见坑提前规避掉把排查流程固化下来后仿真就会从“玄学”变成一项真正可控的工程能力。希望这篇文章能帮你少走一些我当年走过的弯路。
返回列表