
有一次我接手一块别人画了一半的板子四层板DDR3 走线密密麻麻。对方说“基本差不多了你帮忙看下”。我打开 Cadence Allegro跑了一遍 DRC结果直接蹦出一千多条错误其中一大半是 partial route conflicts。这种场面估计不少画板子的朋友都见过。很多人一到这一步就开始慌要么一条条去点要么干脆把 DRC 报错当摆设。其实 DRC 不是用来吓人的它是整个 PCB 设计流程里最客观的一道质检关。Cadence Allegro 的 DRC 能力非常强从早期的简单间距检查到后来基于 Constraint Manager 的物理规则、间距规则、电气规则、制造规则分类管理再到区域规则、差分对约束、铜皮优先级这些高级玩法能做的事情远超很多人的认知。这篇文章我就把 DRC 检查从基础设置到高级规则配置完整捋一遍帮大家把这条“质检线”真正用起来。1. 为什么 DRC 才是 PCB 设计里最该较真的环节1.1 DRC 不是“最后点一下”的仪式很多初学者以为 DRC 是最后出光绘前点一下、通过就万事大吉的步骤。这个认知在简单的两层板、低频电路上也许能蒙混过关但只要板子稍微复杂一点比如有 BGA、有差分对、有电源层分割、有高压安规间距这种“最后点一下”的做法就会出大问题。因为等到整板布线完成之后再回头处理 DRC 错误牵一发动全身改一根走线可能影响一片铜皮调一个过孔可能破坏一整条差分对。到那时候你面对的就不是“检查”而是“返工”。DRC 的正确用法是设计过程中的持续反馈机制而不是设计结束后的期末考试。1.2 On-line DRC 与 Batch DRC 的检查范围和差异Allegro 的 DRC 分两种常见形态一种是你在布线、铺铜、移动器件时实时运行的在线 DRCOn-line DRC另一种是放到整板结束后统一跑的批量 DRCBatch DRC。在线 DRC 的作用是“边做边报”它能帮你第一时间发现当前操作引起的间距、连接、未布线等基础问题批量 DRC 则是把整板的规则完整地跑一遍输出报表和图形标记。很多人不知道的是Allegro 默认的在线 DRC 只检查一部分基础规则比如间距和连接性很多高级规则比如差分对相位、Stub 长度、区域规则并不在在线检查的默认范围内。所以你光看界面右下角没有报错并不代表板子真的干净。这也是很多“明明在线检查没报错、批量 DRC 一跑全是错”的根源。注意千万不要把 On-line DRC 的“当前无错误”和整板 DRC 通过混为一谈。两者检查范围、检查深度和检查时机都不同。2. DRC 基础设置从 Constraint Manager 开始的正确姿势2.1 物理规则与间距规则必须分开配置Allegro 的规则核心在 Constraint Manager约束管理器它分为 Physical物理、Spacing间距、Same Net Spacing同网络间距、Electrical电气等几大类。基础设置首先要做的就是给整板设定一套默认规则。以最常见的 4 层板为例默认线宽可以用 6 mil内层电源/地网络可以放宽到 20 mil 甚至直接铺铜默认间距用 6 milBGA 扇出区域可以单独设 5 mil高压区域则要按安规要求加大间距。这些数值不是拍脑袋定的而是由板厂生产能力、芯片封装引脚间距、信号完整性和安规要求共同决定的。我见过很多工程师在 Constraint Manager 里只改了一个 Minimum Line Width其他全用默认结果批量 DRC 出来大量网络间距报错。原因很典型物理规则管的是“线宽、孔尺寸”间距规则管的是“线与线、线与孔、孔与孔的距离”这两者是完全独立的维度。你把物理规则改了间距规则不跟着改等于只做了一半设置。所以基础配置的第一步是把 Physical Constraint Set 和 Spacing Constraint Set 都按实际需求建好再绑定到对应的网络或网络类上。2.2 用网络类Net Class管理规则而不是单条网络如果有几十个电源网络、几百个信号网络一条条去设规则会非常痛苦。正确做法是先建 Net Class网络类。比如把 3.3V、5V、12V 这些电源网络归入 PWR 类把 DDR 的地址线、数据线、控制线归入 DDR 类把 USB、HDMI 这类高速差分线归入 DIFF 类然后为每个类单独指定物理规则和间距规则。这样后续调整时只需要改类的规则所有成员网络自动生效DRC 检查也会跟着新规则走。另外要注意的是 Net Class 的优先级问题。Allegro 在判断一条网络到底该用哪套规则时有严格的优先级逻辑单网络规则 网络类规则 全局规则。很多时候你发现某条网络明明设置了 6 mil 间距实际却在按 4 mil 检查多半就是它同时被归属到某个类而类里的规则优先级更高。排查这类“规则不生效”的问题时不要瞎猜直接在 Constraint Manager 里选中那条网络看它继承的规则来源是哪一层。2.3 基础规则项速查表规则项作用典型设置Minimum Line Width最小线宽6 mil常规信号Minimum Line Spacing最小线间距6 mil常规信号Minimum Neck Width窄颈宽度BGA 扇出区域常用Minimum Via Size / Hole Size过孔盘径/孔径18/8 mil 常见Soldermask Clearance阻焊开窗间距一般默认Pad-Pad Connection焊盘-焊盘连接方式电源网络常用全连接这个表可以当个快速参考具体数值要根据你的板厂能力和实际电路来定。我见过不少团队把规则设得很“理想”结果板厂反馈做不了最后又整体放宽反而浪费时间。规则设置在保证电气性能的前提下最好先跟板厂确认一版工艺能力再落到 Constraint Manager 里。3. 高级规则配置差分对、区域规则与铜皮优先级3.1 差分对电气规则里的耦合与相位检查差分对在 Allegro 里属于 Electrical Constraint Set 的一部分但又和 Physical/Spacing 紧密结合。配置差分对时除了要设置线宽、线距之外还必须在 Electrical 选项里设置未耦合长度Uncoupled Length。因为差分对的核心是“通过两条走线的耦合来抑制共模噪声”如果两条线在很长一段距离内没有平行耦合差分效果就会大打折扣。DRC 里的 Diff Phase Tolerance、Uncoupled Length、Min Line Spacing 就是干这个的。很多人的差分对 DRC 报错来自一个非常小的细节差分对的两个 Pin 必须被正确分配为正极和负极且网络名要符合 Allegro 的命名规则比如 _P/_N 或 _PLUS/_MINUS。如果网络命名不规范就算你在原理图里已经把差分对标出来了Allegro 在导入网表后依然可能识别不了这对差分网络导致它按两个普通单端网络去检查自然不会报耦合错误。检查方法很简单在 Constraint Manager 的 Electrical 页面里看 Differential Pair 列表如果里面没有你期望的差分对那问题大概率出在原理图网络命名上。3.2 区域规则局部覆盖全局的正确打开方式区域规则Region / Design Constraints Area是高级规则里非常实用的一项。它的思路是在某个特定区域内用一套独立的规则去覆盖全局规则。比如 BGA 扇出区域通常需要更小的线宽和间距晶振、开关电源这类敏感区域可能需要加大间距或设置禁布区。Allegro 里通过 Add - Constraint Region 来绘制然后在 Constraint Manager 里为这个区域指定单独的 Physical/Spacing Rule Set这样区域内外的走线会按不同规则检查。区域规则的使用有一个常见的坑区域边界没有闭合或者区域画在了错误的层。Allegro 的 Constraint Region 默认是“所有层生效”如果你只想限制某一层需要单独设置。另外区域规则和网络类规则同时存在时它们之间也有优先级关系。一般情况下区域规则优先于全局规则但网络自身的规则如果单独设置了则又优先于区域规则。这个优先级逻辑不搞清楚很容易出现“明明画了区域DRC 还在报错”的怪现象。3.3 铜皮优先级动态铜皮与 Static 铜皮的 DRC 陷阱铜皮优先级是 Allegro 里一个非常容易和 DRC 扯上关系的设置。特别是电源层、地层分割时动态铜皮Dynamic Copper会因为优先级不同决定谁覆盖谁、谁避让谁。如果用 Static Copper 或者优先级设置不对铜皮之间、铜皮与走线之间会产生大量间距错误。你在很多技术讨论里看到的“cadence 铜皮 优先级”和“allegro 铜皮只有轮廓”本质上就是这一类问题。铜皮优先级在 Color/Visibility 里设置 Shape 的优先级时Allegro 用数字表示数字大的优先级高会覆盖优先级低的铜皮。但问题在于动态铜皮在实际铺铜时默认会自动避让所有走线、过孔和焊盘如果某个 Shape 被设成了 Static避让行为就可能失效。DRC 跑出来一片铜皮和焊盘短接的报错十有八九跟这个有关。处理办法是尽量使用 Dynamic Copper少用 Static Copper尤其是在电源层分割这种大范围铺铜的场景下。4. 实战排查从 DRC 报错类型到定位链路4.1 从 DRC 报表到图形 Markers先分组再定位Allegro 跑完 DRC 之后会在图中生成带圆圈或方框的 DRC Marker同时在 Display - Status 里显示各种错误数量。很多人只看总数不看具体类型这是排查效率低的主要原因。正确做法是先打开工具菜单里的 Reports - Design Rule Check生成一份完整的 DRC 报表里面会列出每条错误的坐标、错误类型、涉及的网络或元素。然后按错误类型分组而不是按坐标一个一个跳。常见的 DRC 错误类型包括Line-to-Line Spacing、Line-to-Pad Spacing、Via-to-Pad Spacing、Unrouted Net、Partial Route Conflict、Missing Differential Pair Phase Tolerance、Solder Mask Sliver 等等。每种错误的含义和处理重点都不太一样。比如 Line-to-Pad Spacing 多半是走线太靠近一个不属于它的焊盘Unrouted Net 是网络没有完全连通Partial Route Conflict 则是指一根线只连到了一端另一端悬空。把错误分类之后你会发现很多错误往往集中在少数几个区域或少数几类网络上这时候再去动刀效率会高很多。4.2 高频报错 rtstat-6 partial route conflicts 的根因与处理“drc rtstat-6 partial route conflicts: 1184 net(s) have a partial conflict.” 这种报错很多人在论坛里问过。它的意思是有大量网络存在“部分布线冲突”也就是说这些网络只在部分层或部分路径上完成了连接但并没有形成完整的通路。产生这个问题的原因通常有几种布线过程中只布了一部分后期因为扇出调整、器件移动原来的走线失效了。存在被删除或不完整的铜皮导致网络连接关系中断。使用高亮或编辑命令时误删了某段走线但网络名和引脚连接还残留着。排查这类问题最直接的方法是把 Unrouted Nets 和 Partial Route Conflict 的报表导出然后按网络名排序。你会看到很多报错其实集中在少数几类网络上。这时候不要急着逐条拉线先回到原理图确认这些网络是否被废弃了比如某些测试点、备用引脚如果是残留网络在原理图里清理掉再重新导入网表如果不是残留再用 Allegro 的 Show Element 命令找到断点重新拉线或调整过孔。4.3 一次 Via-to-Pad Spacing 报错的完整排查链路我举一个实际排查过的例子。有一块板子在批量 DRC 时报了 37 个 Via-to-Pad Spacing 错误目标区域集中在 DDR 芯片附近。我没有直接去移动过孔而是先在 DRC 报表里看错误坐标分布发现全部集中在芯片 fanout 区域的第二到第四排。于是重点检查这个区域对应的 Spacing Rule Set发现 BGA 区域用了单独的区域规则但区域只画了大半边界刚好从 DDR 芯片正中间穿过导致芯片一侧按 6 mil 间距检查另一侧按 4 mil 检查。用 Allegro 的 Constraint Region 边界调整工具把区域画完整再重跑 DRC37 个错误全部消失。这说明一个道理DRC 排查的链路应该是“报错分组 - 定位共性 - 检查规则边界 - 修正根因”而不是“看到一个错误改一个错误”。5. 长期维护让 DRC 检查真正“管用”的经验5.1 分阶段跑 DRC而不是最终统一清错我个人的习惯是每完成一个功能模块比如电源、DDR、接口区就跑一次批量 DRC把当时能看到的错误先清掉。这样做的好处是错误永远控制在一个小范围内随时知道“当前板子的健康度”。很多人喜欢把所有模块全部布完再统一查结果一查就是上千条错误根本分不清哪些是新引入的、哪些是老早存在的。分阶段 DRC 其实就是给设计过程做“持续集成”这个思路和写代码跑单测是一样的问题发现得越早修正成本越低。5.2 团队约束模板统一与版本管理如果你在一个团队里做 PCB 设计强烈建议把 Constraint Manager 里的规则导成模板文件.dcf 或 .xml团队共用一份基线规则。因为不同工程师对“安全间距”“线宽下限”的理解可能完全不同A 觉得 6 mil 够了B 可能习惯用 8 mil。如果各建各的规则在同一块板子交接时很容易出现大量 DRC 错误。用统一的约束模板可以从源头减少这类问题。模板也要有版本管理规则变更时同步给所有成员不要三个人改三套。另外导入网表后记得要重新关联一次规则否则容易出现在别人机器上没问题、到你机器上大面积报错的情况。5.3 出光绘前的 DRC 复核清单最后讲一下出光绘前应该做的 DRC 复核。除了常规的批量 DRC 之外还有几项建议手动确认一是检查 Undo 记录里是否有大量“被删除”操作如果有说明板子上可能存在隐藏的残缺走线二是查看动态铜皮的避让状态用 Display - Status 查看相关标志三是检查所有 Constraint Region 是否仍然处于启用状态有时候为了快速布线会临时关掉某些区域的 DRC 约束事后忘记恢复这会让最终板子“看起来没有错误实际存在违规”。这三个细节是我吃过几次亏之后总结出来的。现在每回出板前我都会把这三项和批量 DRC 一起作为固定动作宁可多花十分钟复核也不愿意等板子打回来再面对一堆本可以提前发现的问题。