ARTICLE DETAIL

资讯详情

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

模拟版图DRC 0.005um格点错误:定位、修复与SKILL脚本批处理实践

模拟版图DRC 0.005um格点错误:定位、修复与SKILL脚本批处理实践 做模拟版图的人大概都经历过这种晚上Tapeout前最后一遍DRC换了新一版rule deck结果屏幕上一排排“0.005um”的格点错误Not On Grid / Grid Spacing刷过来。坐标放大到最大都看不出哪儿歪了DRC却咬死不放连Layout里最基础的格点对齐规则都过不去。我第一次遇到时第一反应是Calibre rule文件写错了后来把报错坐标翻出来一个个对才发现是某个金属层的直角顶点横坐标落在1.2375这种位置距离最近的0.005格点差了0.0025平时根本没人注意。先说结论Cadence Virtuoso里这套格点体系看着简单真正出问题时牵涉三个容易混淆的设置、一层经常被忽略的层次化调用关系还有一个不常被提起的浮点尾数问题。这篇文章就把0.005um DRC错误的来龙去脉讲透并把从定位、修复到预防的完整流程都过一遍适合正在被格点错误折磨的模拟/混合信号版图工程师也适合刚接触DRC的新人。1. 为什么会出现0.005um的偏差Grid体系拆解与误差来源1.1 显示格点、吸附格点、设计格点三者各管一段在Cadence Virtuoso里和“格点”相关的设置至少有三个但大多数教程只把焦点放在Snap Grid上导致问题一出现就只知道“重新吸附一下”治标不治本。这三个概念分别是格点类型控制位置实际作用常见误区Display Grid显示格点Options - Display只在屏幕上画网格线用于视觉参考不写入任何坐标数据很多人以为把显示网格调密就万事大吉Snap Grid吸附格点Options - Display / LSW菜单控制鼠标操作时的捕捉分辨率决定你移动光标时坐标落在哪有人为了“自由画”直接关掉Snap画完必出Grid DRCLayout Grid / Design Grid设计格点工艺文件或PDK中定义DRC检查时的判据决定哪些坐标算合法是最终的数据尺度被忽略最多因为界面里没有显眼开关那为什么DRC里会冒出0.005um这种数字因为很多PDK的设计格点就是0.005um也就是5nm。当DRC检查多边形所有顶点坐标时只要某个顶点的x或y坐标不能被0.005整除就判定为Not On Grid并报错。所以“0.005um”更像是一个检查阈值而不是说你的图形真的偏了0.005um整。实际偏差可能是0.0025、0.0017甚至更小。我见过不少工程师把Display Grid调到0.001Snap Grid调到0.005Layout Grid是0.005看起来好像“显示得更细”但操作时Snap会强制落到0.005上显示又是0.001的网格视觉上明明“对齐了”换到另一个环境一跑DRC就翻车。最佳实践很简单显示格点、吸附格点、设计格点三者保持同一分辨率建议全部等于PDK规定的grid值除非你有特殊绘制需求。1.2 顶点越界的三条来路手工输入、编辑算法与浮点尾数搞清楚三张格子的分工后再看0.005um偏差是怎么“偷偷”进入版图的。根据我的经验来源基本集中在三条路径上。第一条是手工输入和命令操作。很多人画图时直接敲坐标比如“x: 10.2345, y: 3.6789”小数位一多就没法保证落在0.005的整数倍上或者在CIW窗口、Property编辑器里改位置时手滑多打了一位。这个最容易理解也最容易查。第二条是编辑算法导致的顶点偏移。这里要展开讲一下Cadence里大量编辑操作并不是“几何平移”那么简单比如做图形的AND、OR、切割、拉伸时新生成的顶点常常是由两条边求交得到的。两条边只要角度比较怪求交出的坐标就可能是无限小数最后以浮点数形式存进数据库。这时候坐标显示可能是“1.237499999”但DRC能精确读到那个尾数咬死你。第三条是操作叠加。比如你对一个矩形做了Stretch然后又用Align命令对齐到另一个对象的边界而不是对齐到格点顶点就会被带到奇怪的地方。尤其是Align、Magnet、自动布线这类“智能吸附”功能它们的优先对齐目标是图形几何边界不是设计格点。除了这三条最后还有一个很不显眼但必须知道的点Virtuoso内部坐标本质上是浮点数存储。这意味着你在界面上看到“1.235”不代表数据库里真的存的是精准的1.235可能是1.2350000000001。绝大多数情况下这个尾数不会触发DRC因为rule deck里通常有tolerance容差但当偏差值超过容差比如0.0025它就会原原本本地出现在报告里。所以修复时永远不要依赖肉眼要去看Property里的精确坐标和DRC报告文本。1.3 层次化引用中的整体漂移最容易被误判的一类比顶点越界更隐蔽的是层次化设计里的整体漂移。我接手过不少“DRC突然多出几十个Grid错误”的case打开版图一看错误全集中在某个子模块里。你以为是这个子模块内部图形歪了实际上子模块里所有坐标都干干净净问题出在它被调用到顶层时instance的origin坐标不在格点上。举个具体例子子单元A内部有一个接触孔坐标是(5.000, 5.000)完全合法。但顶层在Place这个instance时origin被放在了(10.0025, 10.000)这种位置那么A单元里的所有对象进了顶层都会整体平移0.0025。DRC检查顶层时A里原先合法的接触孔坐标变成了(15.0025, 15.000)于是报错。这个偏移对肉眼来说根本看不出来但对DRC来说是板上钉钉的非法坐标。还有一种更常见的场景从别的平台导入GDS或者从数字后端拿过来的数据转入模拟环境。不同工具之间即使单位一样database unit数据库最小分辨率也可能不同stream in时精度处理不当就会给整个cell套上一层系统性偏移。例如在某个工具里DBU是0.001到另一个工具变成0.005换算后就会出现0.005的“系统误差”。所以遇到格点错误要做的第一件事不是急着去Snap而是先判断问题发生在哪个层次是单个对象自身的顶点坐标问题还是某个cell instance的整体origin问题。这两类问题的修复策略完全不同修复成本也差一个数量级。2. 定位链路从DRC报告数字到具体版图对象2.1 四步从RVE跳到问题坐标无论用的是Calibre RVE、Assura还是PVS的结果浏览器定位一两个Grid错误都很快难的是处理几十上百个。这里我分享一套稳定的四步流程照着做基本不会漏。第一步在DRC结果浏览器里双击报错条目版图窗口会自动跳到错误坐标位置并高亮相关图层。这里要注意0.005um的尺寸实在太小双击后如果你不把Zoom Level拉高到极限根本看不到问题对象在哪。第二步把不相关的图层全部关掉。用LSW窗口里的可见性控制只留下报错图形所在层以及必要的参考层别的层一关就能减少视觉干扰。不要一上来就看整颗芯片你人眼的分辨率在5纳米尺度上是不可靠的。第三步按ShiftF把视图约束在当前cell避免你盯着的其实是顶层里无数instance互相叠加后的幻影。如果你的错误位于子模块内部先定位instance path再决定是进入子cell修复还是在顶层直接操作。第四步选中可能出问题的对象按Q打开Property编辑器看Geometry里的points坐标。这里有一个快速的校验法则如果设计格点是0.005那么所有合法坐标的小数位只会出现0.000、0.005、0.010、0.015……这些值。一旦你看见1.2375、3.1428这种数字就直接锁定问题顶点了。2.2 先用坐标判断问题类型别急着Snap在动手“修复”之前我强烈建议先根据坐标判断这属于哪种问题类型。判断错误会直接导致重复劳动甚至把原本好的图形改坏。现象特征问题类型初步处置方向单个图形个别顶点坐标非法其他顶点正常局部编辑残留对单个对象做Snap或手动修正坐标某cell内所有图形坐标都差同一个非零值instance origin偏移修正instance的origin坐标别去改子单元内部图形所有金属层、过孔层整体偏移相同数值数据导入/DBU单位问题回查GDS导入设置用stream in选项统一对齐视觉上对齐DRC却报错坐标文本看似正常浮点尾数问题用精确到更长小数位的坐标显示或直接看DRC文本报告里的数值换了PDK或rule deck后新出现的Grid错误设计格点定义变化确认PDK的grid值统一环境设置这张表是我给自己团队做排查手册时总结的。绝大多数情况下你只要把几个报错坐标放在一起对比就能在一分钟内判断出方向。比如所有错误坐标都带相同的尾数0.0025那基本就是整体偏移如果错误坐标有各种各样的尾数那多半是手工编辑和算法残留。2.3 读懂“0.005”这个数字的实际含义很多人拿到DRC报告看到“0.005um”就直接以为图形偏了5纳米。实际上不同PDK和不同rule deck对这种Grid错误的报告值定义不完全一致。有些报告的是“distance from legal grid point”也就是偏离合法格点的距离有些则只是把容差阈值显示出来告诉你“这个检查的精度是0.005um”并不是你的图形真的偏移了0.005。判断方法很简单打开报告文本看错误坐标是多少然后手动算一下。比如报错坐标是x1.2375设计格点0.0051.2375 / 0.005 247.5说明这个点位正好落在格点的中间真实偏差是0.0025而不是0.005。这两个数字在你的认知里差一倍但在报告里都可能被叫做“0.005um error”。理解了这一点你在和别人沟通时就不容易被数字带偏。比如代工厂的工程师问你“偏移量多大”你能准确回答“grid间距0.005实际偏差0.0025”对方立刻知道你根因清楚如果你只是回复“报0.005错误”对方还得再猜。3. 修复实操单点校正、整体搬移与SKILL批量Fix3.1 动手前先确认三件事修复动作本身不复杂但一旦开始改数据就不可逆了。所以在运行任何Snap或Move之前我建议先花30秒确认三件事。第一件备份当前数据。最简单的方式是在Virtuoso里把当前cellview另存为一个copy或者导出一次GDS放到临时目录。这不是小题大做我见过有人跑了一遍批量Snap后整排差分对源极接触孔全部偏了一个格点最后只能从备份恢复。第二件确认你要修复的对象是pcell还是普通图形。参数化单元pcell内部的坐标通常由参数推导直接对pcell做Snap很容易丢失参数化属性甚至导致整个pcell变性。正确的做法是回到pcell的CDF参数里去修改间距、宽度等参数让新生成的几何自然落在合法格点上。第三件明确当前编辑范围是顶层还是子cell。在顶层直接修改子instance内部的图形会把层写关系打乱后续同步很痛苦。推荐的做法是Descend进入子cell修复再返回顶层更新instance。3.2 单点问题的三条修复路径对单个对象我常用的修复路径有三条按优先顺序排列。路径一重新设置Snap Spacing后再执行Snap。在Virtuoso中打开Options - Display把Snap Spacing设置成和你设计格点一致的值然后选中问题图形执行Edit - Other - Snap。操作前注意确认对象不是pcell并且这个图形没有和相邻图形存在精确依赖关系比如两个图形原本有严格的2um间距要求。Snap有可能会破坏这种间距。路径二直接精确修改坐标。如果你只遇到一两个错误用Property编辑器把非法顶点的坐标直接改成最近的合法格点值是最简单直接的方式。比如原来x1.2375直接改成1.2350或1.2400看你想要它往哪边靠。这个方法最可控因为你明确知道改的是哪个点副作用最小。路径三用Move或Align做整体纠正。如果一个图形整体都在格点之外比如整体偏移了0.0025那么框选图形后按精确坐标Move把某个基准顶点移到最近的合法坐标上效率比逐点改高很多。这里有个技巧Move时不要用鼠标拾取因为拾取过程可能再次引入吸附误差直接在Move对话框中输入相对位移如dx0.0025dy0或用Rrelative坐标输入基准点。3.3 修正Cell Instance的整体漂移如果是instance origin导致的整体漂移修复思路完全不一样。你不需要进入子单元内部改任何图形只需要把instance的origin坐标调整到最近的合法格点。操作方法选中这个instance按Q打开属性框看Origin坐标。比如Origin是(10.0025, 10.000)而设计格点是0.005那就把x改成10.0000或10.0050看在当前层上下文里哪个更合理然后应用。改完之后子单元里的所有对象都会跟着整体平移之前报错的那一堆Grid错误就会一次性消失。这里要补充一个容易踩的坑改origin坐标时不要用鼠标拖动的方式因为拖动过程中可能被Snap Grid影响落到一个“合法但不是你想要”的位置。直接用键盘输入精确值最稳。另外还要提醒一点如果这个子单元在顶层被多次引用你修复了一次instance其他instance的origin仍然可能有问题。所以修完后要重跑一次DRC看是不是还有同类型报错。如果多处instance都偏了建议用SKILL脚本批量遍历所有instance并统一修正而不是手动一次次点。3.4 用SKILL脚本快速扫描与对齐当错误数量超过两位数手动点选就没有效率了。我的做法是写一个简单的SKILL脚本扫描当前cellview里所有图形的顶点坐标凡是不满足格点条件的全部打印出来之后再决定是逐点修还是批量Snap。下面是核心逻辑的意思按你自己的环境微调即可; 用法: 在CIW窗口load该脚本后执行 checkGrid() ; gridStep 根据PDK的设计格点修改 procedure( checkGrid( optional (gridStep 0.005) (tol 0.0001) ) let( (pts badCount) badCount 0 foreach( shape geGetAllShapes(geGetEditCellView()) when( member( geGetObjType(shape) list(polygon rect path) ) pts rodGetPoints(shape) foreach( p pts when( abs( p~x - round(p~x / gridStep) * gridStep ) tol || abs( p~y - round(p~y / gridStep) * gridStep ) tol printf( Grid error at (%L, %L), shape type %L\n p~x p~y geGetObjType(shape) ) badCount badCount 1 ) ) ) ) printf( Total grid errors: %d\n badCount ) ) )这段脚本做的事情很简单遍历当前cell里所有polygon、rect、path取出每个顶点坐标判断坐标除以gridStep后四舍五入再乘回去是否在容差范围内。如果不在就打印坐标。运行后你就能得到一份精确的“问题清单”比肉眼扫版图快得多。如果你想更进一步把对齐动作也批量化了思路是在发现非法点后直接把这个顶点坐标改成round(x / gridStep) * gridStep然后重新生成图形。但这里我强烈建议不要无脑对齐尤其对模拟版图里的匹配结构、电流镜、差分对盲目Snap可能会破坏对称性你需要先人工判断每个错误该如何靠。3.5 修复后的完整验证组合DRC、LVS一步不能少修复完别急着下班。我见过很多次Grid错误清零但因为Snap/Move改变了图形交叠关系又冒出short、open、甚至LVS mismatch的情况。原因很直接你把某个图形移动了0.0025虽然肉眼无感但它与旁边图形的间距、交叠面积、节点连接关系都可能发生变化。所以一套标准验证流程是重跑完整DRC。不要只跑Grid检查要跑全套尤其是Metal Density、Spacing、Enclosure这些和几何关系强相关的规则。确认DRC Summary中原来的Grid错误项为0并且没有新增的其他错误。跑一次LVS。尤其检查那些被你手动改过坐标的模块的netlist连接是否仍然一致比如某个过孔移动后是否还正确连接上下两层金属。如果时间允许保存一个验证时刻的GDS方便后续版本对比。在模拟版图里这一步多花20分钟能让你真正安心地去跑下一轮流片前检查。4. 防止复发统一环境、自动检查与数据交接规范4.1 把三张格子纸设成同一把尺子很多0.005um DRC错误其实是“环境差异”逼出来的。同一个版图文件在A工程师的Virtuoso里打开一切正常在B工程师的机器上却报出一堆Grid错误。为什么会这样因为两个人的Display Grid、Snap Grid设置不一样文件本身没变但操作环境变了。解决这个问题的最好办法是团队统一环境配置。在项目启动时把.cdsinit或display资源文件里相关的格点参数固定下来至少统一以下几项配置项推荐值说明Layout Grid设计格点与PDK/工艺规定一致如0.005这是DRC判据不要改动Display Grid与Layout Grid一致视觉和真实数据对齐Snap Grid与Layout Grid一致或设为Layout Grid的整数分之一保证画图时不会出现非法坐标这个表格里的“推荐值”不是死的如果你的PDK设计格点是0.001那就全部用0.001。核心原则只有一个显示、吸附、验证三把尺子必须统一。我自己所在团队的做法是由CAD工程师在环境初始化脚本里统一load这些参数并禁止个人在启动后随意修改。刚开始有人觉得被限制但经过几次“我这边没问题你那边报错”的扯皮事件后所有人都支持了。4.2 在保存动作里加入自动Grid检查比统一环境更狠的一招是把Grid检查挂到保存动作上。Virtuoso支持在保存版图时触发自定义procedure你可以利用这一点让每个工程师每次保存前都自动跑一遍格点扫描。具体思路是写一个SKILL procedure比如checkGridOnSave()内容就是上一章那个检查脚本再加入一个交互提示如果发现Grid错误弹窗警告让工程师选择“知道继续保存”还是“取消保存去修复”。然后通过Virtuoso的save callback机制把这个procedure绑定到文件保存事件上。这样做的价值在于把问题拦截在“产生阶段”而不是等到Tapeout前集中爆发。很多人觉得写脚本麻烦但当你经历过一次在几千个错误里挑根因的绝望后你会愿意花这一个晚上写脚本的。此外如果你的验证流程里既有Calibre又有Assura还可以写一个专门的Grid-only rule deck只跑格点检查不跑其他项把它做成一个快捷验证入口。这样可以很快把整个设计扫描一遍不用等完整DRC跑完。4.3 外部数据接入与PDK更新时的注意事项最后一个要说的场景是外部数据的接入。很多团队不是所有layout都从Virtuoso原生画出来的从其他EDA工具、第三方IP供应商、代工厂参考版图拿过来的GDS/OASIS很容易自带一层“历史偏移”。导入这类外部数据时要用好stream in对话框里的格点对齐选项。Cadence Virtuoso的stream in提供snap to grid或类似的对齐选项开启后导入过程中系统会把所有顶点坐标吸附到指定格点。它很适合处理已知的、统一偏移的数据但如果数据里有复杂的非格点图形比如某些特殊角度图形强制Snap会把几何形状彻底改变这时候需要谨慎评估。PDK更新也是一样。代工厂每升一版PDK或者你切换到不同的工艺角库时设计格点可能有变化。不要想当然地以为“同一个工艺格点肯定一样”。我遇到过一次旧PDK的Layout Grid是0.005新PDK微调成了0.001结果整个设计里所有基于旧格点画的图形全被新rule deck报成Grid错误。那种情况不需要急着改图形先回查PDK的design rule文档确认新的grid值再用统一的迁移脚本把所有合法坐标更新到新格点上。最后分享一个从实际项目里获得的体会格点问题本质上是版图工程的“走步规则”所有人踩同一个节拍才不至于在最后冲刺时被绊倒。我吃过最大的亏是轻视了层次化调用里的整体漂移在一个顶层模块上手工修了整整两天原因只是一个instance origin差了0.0025。后来我把所有cell统一放在格点上、把检查脚本挂在保存动作里这种问题几乎再没在项目后期出现。画版图这件事越早把规则焊死在环境里后期越省心。
返回列表