Allegro覆铜状态修复:彻底解决Unassigned与Out of Date Shapes
Cadence Allegro 里做覆铜十个项目有七个会在某个时间点冒出“Unassigned”“Out of Date Shapes”这两种提示。我最早用 16.6后来切到 17.2、17.4这个问题一直没断过。很多新手看到 Status 面板里出现这类状态就慌以为板子数据坏了其实这是 Allegro 对动态铜皮的正常“记账”机制。真正麻烦的是你不知道它为什么出现也不知道该先处理哪个、后处理哪个。这篇内容就是把这套东西彻底讲清楚Unassigned 和 Out of Date Shapes 分别代表什么、底层原理是什么、如何一次性修复以及怎么通过日常设计习惯避免它反复出现。无论你是刚开始画板还是已经被铜皮状态折磨过几轮按下面的顺序操作都会省很多时间。1. 先把两个报错看清楚Unassigned 与 Out of Date Shapes 到底指什么1.1 Unassigned 不是简单的“没画铜”而是铜皮的网络丢了在 Allegro 里铜皮Shape和走线Cline一样必须有一个网络属性也就是 Net。你在铺铜的时候选中网络“GND”去画软件把这块铜皮和 GND 绑定如果你后来从别的板子复制了一块铜皮过来或者原理图网表重新导入、原始网络被删掉那么这块铜皮就变成“孤儿”软件不知道它该归属到哪个网络于是就会在状态报告里记一笔 Unassigned。这里的重点在于“网络丢了”而不是“没画”。如果你用 Display 菜单下的 Status 打开状态窗口会看到 Shapes 那一栏里写着 Unassigned shapes 几。这个数字不是报错是告诉你有几块铜皮处于未分配网络的状态。平时看不到是因为绝大多数人不会开着 Status 窗口干活等到出光绘前检查才发现。还有一种情况也容易造成 Unassigned你把一个带网络的铜皮选中后用 Edit 菜单里的 Change 把它改成了另一个网络的属性或者有人手动修改了 Shape 的 Net 属性但修改不完整。Allegro 的逻辑是“网络匹配不上就标 Unassigned”不会替你猜。1.2 Out of Date Shapes 是待更新的填充状态Out of Date Shapes 翻译过来就是“过期的形状”。这里说的不是铜皮错了而是铜皮的填充结果需要重新计算。动态铜皮的保护边界、避让结果、热焊盘连接都是根据周围走线、过孔、焊盘实时算出来的。当你挪了一根走线、加了一个过孔、改了器件封装甚至只是改了某个区域的规则原本算好的铜皮就过时了。软件在数据库里给这块铜皮打一个“脏标记”等触发更新时再重新填充。所以 Out of Date 并不是错误。它更像是电脑里的缓存需要刷新或者像是你写文档时改了上面一段后面的目录还没更新。真正出问题的是你带着这个状态去生成 Gerber 或运行 DRC因为旧状态和实际设计不一致可能会漏掉避让也可能报出一堆不存在的短路。1.3 两者为什么会一起出现这两个状态经常同时出现是因为它们在触发时机上高度重合。最常见的场景你删了一个网络原本依赖这个网络的铜皮一下子失去归属变成 Unassigned同时与这块铜皮相邻的其他动态铜因为周围对象发生变化被标记为 Out of Date。再比如从其他源文件导入图形时复制进来的铜皮没有可匹配的网络而原来设计里的铜皮因为新增图形改变了障碍物也变成待更新状态。处理顺序上要记住一条先解决 Unassigned再更新 Out of Date Shapes。如果 Unassigned 还没处理就开始灌铜更新完它依然是 Unassigned而 Out of Date 的铜皮在计算时还可能被 Unassigned 铜皮干扰导致重新更新后仍然无法消除提示。2. 底层机制Allegro 为什么用这两个状态管理铜皮2.1 动态铜和静态铜是两套完全不同的逻辑Allegro 里的铜皮分为动态铜Dynamic Shape和静态铜Static Shape。动态铜的特点是“智能”你画好一个铺铜区域指定网络后它会自动根据周围的走线、过孔、焊盘做避让还会在连接器件引脚时自动生成热焊盘效果。静态铜更像手工铜皮你画成什么样就是什么样软件不会主动帮你改。Unassigned 和 Out of Date Shapes 主要出现在动态铜上。静态铜没有“自动更新”这个过程所以早期版本里如果你用的是静态铜改走线之后需要手动重画或手动修铜不然很容易短路。动态铜虽然方便但代价就是它必须维护大量的实时计算状态任何一次设计变更都可能让局部铜皮失效。这个“失效标记”就是 Out of Date。对很多初学者来说看到 Out of Date 会理解为“错了”实际上它是一种性能优化策略。如果每次改一根线都立刻重算整板铜皮电脑会卡到怀疑人生。Allegro 的做法是先标记再在你主动触发或者达到某些边界条件时统一重新计算。2.2 网络分配、填充状态与 Pour Priority 的关系每一块动态铜皮都有两个核心属性一个是网络Net一个是优先级Priority。网络决定铜皮属于哪根信号或电源优先级决定当两块铜皮重叠时谁避让谁。Allegro 的覆铜体系里同一层上可以有多块互相重叠的铜皮。比如你铺了一层完整的地铜又在上面单独画了一块 5V 电源铜如果不设置优先级两块铜皮会按照默认规则互相避让结果很可能不是你想要的。你需要把 5V 铜皮的优先级抬高让地铜让出空间。这个过程涉及的就是 Power Priority很多版本里在选中 Shape 后右键能直接打开 Priority 设置。那么优先级和 Unassigned 有什么关系有。当你给一块铜皮设定优先级时软件需要知道它属于哪一个网络才能判断它和别的铜皮之间的关系。如果这块铜皮是 Unassigned 的优先级关系就悬空了更新时可能出现计算异常。最典型的表现就是 Out of Date Shapes 一直减少不到零。所以有重叠铜皮的设计里先把网络分配好再谈优先级顺序不能乱。2.3 Out of Date 是怎么被软件“标脏”的Allegro 内部并不是纯几何建模它还会记录一个“版本号”或者“脏标记”。当你在板子上执行了会影响覆铜的操作比如移动走线、修改焊盘、删除铜皮边界软件并不会立刻把相关区域的铜皮重算而是在数据库里把这一块标成“需要更新”。这个标记最终以 Out of Date Shapes 的形式出现在状态窗口里。具体到操作上你改了 Rule 值比如把安全间距从 6mil 改成 8mil原本已经铺好的铜皮避让结果全部失效你动了器件的位置焊盘跟着移动铜皮避让区域也要跟着动你调整了板框铜皮边界被外围改变软件也要重新算。这些都会触发标记。如果你在做完这些操作后直接保存并出图已经过期的铜皮就被原样带到了 Gerber 里这是很多 PCB 加工后才发现避让异常的直接来源。3. 彻底修复按顺序做完这套操作就不用再反复处理3.1 动手前的准备备份与状态确认处理任何状态类问题前我都建议先做一次“另存为”。不用换文件名直接在原文件名后面加个 _before_fix放在同一个工程目录里。动态铜更新这个操作虽然不大可能损伤布线但如果你不小心把某块 Unassigned 铜皮 Assign Net 时选错了网络保存之后再想找回原状态就很麻烦。备份之后打开 Display 菜单下的 Status看三个关键数字Unassigned shapes、Out of date shapes 和 Dynamic fill。不同版本里位置略有差异但一定都在 Shape 相关栏目下。先把数字记录下来处理完后再对照这组数字就知道有没有改干净。3.2 第一步把 Unassigned 铜皮全部 Assign Net处理 Unassigned 最直接的方法是选中铜皮右键菜单里选 Assign Net然后在对话框里选择正确的网络。实际操作中有一个技巧先用 Find 面板把所有过滤选项关掉只勾选 Shapes这样你不会误选到走线或器件。然后点击任意一块 Unassigned 铜皮右键就会看到 Assign Net 选项。如果你的铜皮是动态铜点击之后它会弹出一个列表列出当前设计里所有可用的网络。你选择目标网络确认即可。如果一块铜皮是彻底没用的碎片比如复制过程中产生的孤立小块那直接删除比分配网络更省事。判断标准很简单它有没有连接到任何器件引脚、过孔或需要接地的区域。没有就删。还有一个批量处理思路如果 Unassigned 数量很多你可以先把所有 Unassigned 铜皮都框选出来然后通过右键批量 Assign Net。Allegro 在这类批量操作上支持得很好但你要小心不要把不同网络的铜皮一起选中否则也只能统一分配成一个网络。3.3 第二步用 Update Shapes 把整个设计的铜皮重新刷新Unassigned 清零之后接下来处理 Out of Date Shapes。在 Allegro 里Update Shapes 是核心命令。老版本菜单位置可能在 Shape 菜单下新版本放在 Setup Shapes Update Shapes名称通常不变。打开 Update Shapes 对话框之后把范围选成“所有动态铜皮”Fill Mode 选择 Smooth然后执行。Smooth 是“平滑重新填充”的意思它会重新计算所有铜皮的避让边界、热焊盘连接和孤岛结果最接近最终效果。其他模式比如 Hatch、Rough 用于编辑过程中临时加速不适合作为最终处理。更新过程中软件会显示进度项目大时可能要等几分钟。更新结束后返回到 Display Status 刷新状态你会发现 Out of date shapes 的数字归零但前提是你刚才确实没有任何 Unassigned 的干扰。如果更新完数字没有归零说明还有某块铜皮的边界或者其他原因导致它一直处于脏状态需要用第四部分里的场景排查。3.4 第三步检查 Status、Island 和 DRCOut of Date 清零只是第一步最后还要跑一遍铜皮相关的完整性检查。在 Update Shapes 之后我会先打开 Display Status 看“Island”相关记录。Island 指的是完全孤立、没有网络连接点的铜皮小岛这种铜皮往往不是有意铺的而是动态避让后分裂出来的碎片。它不一定显示为 Unassigned但会影响板子外观和 EMI所以发现后要手动删除或调整边界。然后再跑一次 DRC。铜皮状态异常时DRC 里面会出现大量假短路、假间距问题状态刷新之后假问题会自动消失。如果 DRC 里仍然有和铜皮相关的问题再去核对具体位置看是不是避让没有正确执行。很多工程师习惯在修改完板子之后直接出光绘这是一个坏习惯。正确的收尾动作是先 Update Shapes再跑 DRC最后出图。3.5 操作顺序为什么不能反有人会想既然 Out of Date 只是刷新那我先统一 Update再分配 Unassigned 行不行试过就知道不行。原因在于 Allegro 的动态铜计算需要用到网络信息。如果一块铜皮 Unassigned它对周围障碍物的处理规则都是模糊的软件不知道它该避让哪些网络、和哪些铜皮建立优先级关系。这时强制更新结果相当于在一个残缺数据上做计算。更新完成之后你再把网络分配给它它又会因为“网络变了”被重新标成 Out of Date。所以你会发现怎么刷新都刷不完。反过来先把网络定死再统一更新一次就能干净。4. 高频翻车场景为什么刚改完过一会儿状态又不对了4.1 复制粘贴、模块复用带过来的“失联铜皮”这是我见过最多的情况。很多工程师画板时会从旧板子里复制一部分电路过来或者直接复用整块模块。如果旧板子的网络规则和当前板子一致复制进来的铜皮通常没问题但只要某个网络名在当前工程里不存在或者代码命名有细微区别比如 GND 和 AGND复制进来的铜皮就变成 Unassigned。这种铜皮还有一个特点肉眼看起来很正常你甚至能直接在屏幕上看到它覆盖了器件引脚但 Allegro 的 DRC 不会认真对待它因为它连网络都没有。遇到这种情况不要试图逐个 Assign Net先用 Find 面板只筛选 Shapes框选所有入境的铜皮统一判断哪些属于同一网络再做批量分配。4.2 改网络名、删网络后铜皮没有跟着重新分配当你修改原理图网络名比如把 VCC_5V 改成 VCC_5V0然后重新导入网表Allegro 不会自动把旧网络名对应的铜皮更新成新网络名。它会认为原有铜皮对应的网络不存在了于是标记为 Unassigned。如果你同时还在继续画线那些新的走线已经用新名字铜皮和走线之间就产生了断节。解决思路是在做网络重命名之前先记下哪些铜皮用了这个网络导入网表后手动重新 Assign Net。更稳妥的做法是在 Board 文件中先不改网络等网表导入完成后用“全选铜皮 右键 Assign Net”统一刷新。很多团队把这项工作放在原理图冻结之后就是为了减少网表反复导入带来的 Unassigned 数量。4.3 导入网表或从其他 EDA 工具转换后产生的对应关系错位多人在协作时经常会有“Allegro 转 PADS 再转回来”这类流程或者直接用第三方工具转换文件格式。每经过一次转换铜皮的网络映射就可能丢一次。尤其是在转换工具无法识别特殊封装、特殊过孔网络时它会把一部分铜皮指定成一个不存在的 NetAllegro 打开后只能标成 Unassigned。这种情况没有万能解药只能靠导入后的检查机制来兜底。我建议无论是从哪个工具转过来第一件事不是连线改板而是先跑一遍“文件 - 导入 - Logic”完成网表同步然后立刻打开 Status 检查 Unassigned 数量。数量为零再继续后续工作能替你省掉一大堆隐藏问题。4.4 重叠铜皮和 Pour Priority 带来的混乱同一层有多块铜皮重叠时Allegro 会通过优先级的顺序决定避让关系。如果你给一块 Unassigned 铜皮设置了较高的优先级而它又压在一整片有网络的电源铜皮上这个状态会让“Who avoids whom”这个关系变得很不可控。最直接的表现是就算你执行 Update Shapes原本应该铺满的区域出现莫名空洞或者 Out of Date 数量反复跳动。处理这类问题务必先把重叠区域里的所有铜皮网络都分配好再统一设置优先级。在 Allegro 里选中一个动态铜皮后右键菜单里能找到 Priority 或“Shape Parameters”相关选项。电源网络通常设置最高优先级让地铜和其它信号铜自动避让。优先级设好后再跑一次 Update Shapes很多顽固的 Out of Date 就会消失。4.5 负片层与平面分割的坑电源层使用负片Negative Layer时铜皮的状态管理和正片层有些不同。负片层上你更多是在编辑 Anti-Etch也就是分割线而不是像正片层那样直接画一块铜皮。当你修改了分割线位置后软件同样会把平面层标记为 Out of Date这时候你在正片层上常用的 Update Shapes 不一定能完整刷新负片层的平面。需要检查 Plane 相关设置并在“Artwork”或“Plane”菜单里执行平面层的更新。具体入口会因为 Allegro 版本不同而变化但思路都是让负片层重新生成铜皮分配结果。很多工程师只刷正片层导致最后出光绘时电源层带着旧分割板子做出来才发现内层电源被切断。这一点一定不要忽略。5. 预防大于补救把铜皮状态管理融入日常设计流程5.1 新板子优先用动态铜别让静态铜遍地都是很多人从其他 EDA 工具转过来时习惯用静态铜皮。静态铜在简单板子上确实很可控但一旦板子复杂度上来改一个器件就要手动修铜效率极低。更可怕的是静态铜不会显示 Out of Date如果改动后没有仔细检查短路风险直接带进生产文件。我建议新板子里的电源和地网络铺铜都使用动态铜。只有一种情况可以保留静态铜就是那种特别小的、需要严格固定形状的散热铜块或屏蔽铜皮。这些区域不希望被自动避让影响静态铜反而更合适。但全板范围内动态铜才是 Allegro 的正确用法。5.2 编辑阶段和处理阶段用不同的填充模式动态铜的 Fill 模式通常有 Empty、Hatched、Rough 和 Smooth 几种。编辑走线的过程中如果一直用 Smooth每次移动线都会触发全板重算电脑会很卡但如果你全程用 Empty铜皮内容是空的你又看不出实际占用空间。我个人的习惯是编辑阶段用 Hatch让板卡住的情况明显减少出图和发板前最后一道工序再切成 Smooth 并执行一次完整更新。这种做法其实是在性能和精度之间取平衡。Hatch 模式下的网格显示已经能反映大致的避让关系不会影响布线判断Smooth 模式则是给生产文件用的它把边界彻底算顺滑得到最终的铜皮结果。记住一个原则编辑可以 Hatch输出必须 Smooth。5.3 用快捷键和工具栏把 Update Shapes 变成顺手动作处理 Out of Date Shapes 最高频的动作就是执行 Update Shapes。不要每次去菜单里翻直接在需要时使用它。在 Allegro 的菜单栏上你可以把“Update Shapes”按钮添加到常用工具栏。更高效的方式是在本地 env 文件里定义快捷键把 Update Shapes 绑定到顺手的键位。不同版本和不同个人环境的写法会有些差异但如果你的 PC 上已经装了 Allegro Skill 或者自定义 aliases这一步能极大加速你的操作。我这里要提醒的是快捷键只能帮你更快地调用命令不能替代判断。真正让 Update Shapes 有用的是执行前先确认 Unassigned 已经清零。如果你在状态窗口里看到 Unassigned 数量大于零你的快捷键再快也只是白跑。5.4 定期“体检”数据库检查与 DRC 联动Allegro 的数据库偶尔会因为频繁复制、删除、撤销重做产生一些内部不一致。尽管这是少数情况但值得在项目关键节点做一次 Tools Database Check。这个操作会扫描整个设计文件修复一些可能是逻辑层面的脏数据。它也能顺带解决一部分“明明操作都对但 Unassigned 一直删不掉”的问题。数据库检查之后再配合一次 DRC 跑分相当于给板子做体检。注意跑 DRC 前必须先处理好铜皮状态。原因是 Allegro 的 DRC 会把 Out of Date 状态当成一种临时缺陷你带着一堆 Out of Date 去跑得到的结果根本无法反映真实问题只会浪费时间排查假错误。把“先更新铜皮再跑 DRC”当成肌肉记忆很多焦虑根本不会发生。6. 排查速查表以后遇到问题直接照着做6.1 状态速查现象典型原因直接处理后续预防Unassigned shapes 大于 0铜皮失去网络归属选中铜皮并 Assign Net或者删除无效铜皮复制/导入后立刻检查网络匹配Out of Date shapes 大于 0设计变更后铜皮未重新填充执行 Update ShapesFill Mode 选 Smooth每次大改动后统一更新一次Update Shapes 后仍不为零存在 Unassigned 或重叠优先级冲突先清零 Unassigned再设置 Pour Priority再次更新避免在未分配网络时设置优先级跑 DRC 时出现大量铜皮假错铜皮状态未更新避让结果过期更新铜皮后再跑 DRC把铜皮更新并入每次评审前动作负片层显示平面未更新分割线变化后平面未重新生成使用 Plane 相关菜单更新平面层出光绘前检查内层 artwork 状态6.2 我的固定处理顺序和几个小习惯这套流程我已经用了很多年基本覆盖了绝大多数铜皮状态问题。第一打开文件后第一件事打开 Status 看三个数字第二在 Find 面板里只选中 Shapes把 Unassigned 数量清零第三执行 Update ShapesFill Mode 选 Smooth第四回到 Status 确认 Out of Date 为零第五跑一次 DRC看结果里是否还有和铜皮相关的问题第六如果问题还在就开始检查重叠铜皮和负片层。最后再分享一个真实的小经验有一次项目交付前客户那边打开文件后说板子上有大量 Unassigned我本地打开却正常。折腾半天才发现是客户用的 Allegro 版本和我这边不一样低版本读高版本文件时部分动态铜皮的动态属性被降级成了静态网络属性没有完整带过去。从那之后我发给外协的文件都会先另存成常见版本格式并且用对方版本试开一次确认铜皮状态全部正常再交付。做 PCB 设计版本兼容性这种东西看着是小问题实际能省掉不少沟通成本。