
做PCB设计这些年和SMD Pin间距DRC报错打交道几乎是每天的必修课。最近在Cadence SPB17.4的Allegro环境里处理一块高密度板卡时又遇到了一整片SMD焊盘间距违规数量多到让人头皮发麻。折腾了一下午最终靠区域规则把所有报错清零顺便把板子上局部“过紧”的区域理顺了。这篇文章就把这次实战过程完整拆开来讲包括区域规则的底层思路、在Allegro里的操作流程、以及我踩过的那些坑希望能帮到被DRC轰炸困住的人。1. 问题背景与定位SMD Pin间距DRC为什么总是“局部爆炸”1.1 一次典型的报错现场事情是这样的板子上有一颗0.5mm pitch的BGA还有一处LQFP封装的器件布局比较紧凑。整板设置的通用间距规则是8mil焊盘到焊盘、走线到焊盘都是8mil。但当我把DRC跑完打开状态面板一看几百条Spacing约束违规齐刷刷冒出来。双击其中一条定位到PCB后你会发现这些违规点几乎集中在BGA外围引脚和LQFP的引脚扇出区全是对应SMD焊盘之间的间距不足有一部分甚至只有6mil左右。这里有个细节值得注意报错名称显示的是“SMD Pin to Pin spacing”而不是走线间距违规。Allegro的DRC检查会把间距规则拆得非常细包括Pin to Pin、SMD Pin to SMD Pin、Line to Pin、Line to Via、Via to Pin等等。全局规则里SMD Pin to SMD Pin设成8mil但0.5mm pitch的BGA焊盘如果偏大焊盘边缘之间的空气间隙就是会小于8mil。再加上扇出时过孔离焊盘太近相邻网络之间就会刷屏式报错。1.2 为什么违规集中在特定区域SMD Pin间距报错集中爆发根本原因是局部封装密度和全局规则之间出现了矛盾。常规做法当然是调大焊接工艺或者缩小焊盘但这些往往受制于器件手册和装配工艺。全板规则是给“大多数区域”定的如果你的板子大部分区域走线稀疏8mil完全够可一旦碰到BGA、QFN这种高密度封装8mil就成了不可能完成的任务。于是整个DRC列表里同一类错误反复出现占掉了所有报警份额。这类问题的本质是“局部区域需要更宽松的约束”但全局规则不允许。这时候如果我们直接在全局层把SMD Pin间距从8mil改成5mil板子上其他区域的所有网络都会受影响——电源和地、模拟信号、高压区域全部被“一刀切”放大了风险。更麻烦的是你永远不知道哪一天评审会问到为什么整板间距从8mil变成了5mil你只能解释说是为了局部某颗器件妥协的这个解释通常很难让所有人满意。1.3 处理这条报错的可能路线我梳理过三种常见处理路径各位可以对照自己的情况选择第一种改封装。把SMD焊盘宽度改小从而拉开相邻焊盘边缘距离。这个方法对单个器件有效但你得评估焊盘缩小后回流焊的立碑、虚焊风险还要更新封装库并重新同步所有使用这颗料的设计牵一发动全身。第二种绕线或者挪孔。通过调整走线路径、过孔位置让焊盘之间的空隙恢复到8mil。在局部区域空间充裕时有效但在高密度BGA或LQFP扇出区空间早就是绕不开的死角往往尝试半天还是会在某个地方卡住。第三种区域规则。用“电气特区”的思路在违规区域单独设定一套允许的间距参数。这是Allegro原生支持的功能也是这次实战最终采用的方案。2. 区域规则的底层逻辑为什么它比全局规则更适合这类问题2.1 全局规则、CSet 和区域规则之间是什么关系在Allegro的约束管理器中有一类叫CSetConstraint Set的约束集。你可以把CSet理解为“一套预设规则包”里面包含了Physical物理和Spacing间距两大类参数。全局规则可以被理解为一个默认CSet所有网络、所有区域都套用这套默认值。而区域规则则是额外创建一套CSet然后把它指派给某个画出来的多边形区域这个区域内部的DRC检查就会优先使用区域CSet中的约束值。可以类比成城市交通管理整座城市默认限速60公里某些学校门口或者施工路段单独划一块区域改限速30公里这些“特殊路段”就是区域规则。没有区域规则你只能把整座城市的限速统一改成30公里这显然不现实。2.2 优先级是怎么排的Allegro在DRC计算时对间距规则的优先级有一套明确的逻辑网络级或Class-Class级的精确约束优先级最高其次是区域规则最后才是全局规则。也就是说如果你给某两个网络单独设置过间距约束即使它们在同一个区域CSet覆盖范围内也会优先按网络级约束判断这个细节后面会再说。区域规则的优先级高于全局规则这是它能够覆盖掉全局8mil约束的机制基础。Allegro会对规则区域内的每一对目标焊盘、走线、过孔、铜皮做一次区域归属判断只要该几何对象落在区域内就按区域CSet里的值来算间距。这也是为什么区域Shape画得准不准直接决定DRC收敛效果。2.3 区域规则适合解决哪些具体场景根据我的经验区域规则绝不是只能用来“放宽间距”它同样可以“收紧间距”。结合这次SMD Pin间距DRC优化我把常见的适用场景列出来给大家参考高密度BGA扇出区外圈焊盘到过孔、焊盘到焊盘需要局部放宽。板边连接器、TYPE-C座子、HDMI座附近焊盘与金属外壳之间要有足够的安全间距这时需要局部收紧。电源模块底下、高压和低压安全间距要求严格的区域单独划一个收紧区域避免全板线宽线距被带偏。射频天线匹配区域需要大面积铺地兼小间距走线局部放宽或收紧都可能有需求。区域规则的优势在于“精准打击”不像全局规则那样一刀切。放在生产制造端看它也方便后续检查板厂拿到Gerber后如果发现局部间距和整板不一致他们能在文件中看到对应的规则区域解释成本低很多。3. 实战操刀在SPB17.4的Allegro里一步步清掉SMD Pin间距DRC3.1 第一步把DRC违规点定位到可视范围打开板子的第一步先别急着画区域。用Display - Status打开DRC状态面板确认当前的错误总数再通过Tools - DRC Browser按间距规则排序筛选出所有“SMD Pin to Pin Spacing”违规项。这时候PCB编辑界面里会出现一片被高亮的“绿色或白色”报错标记。建议打开Color/Silkscreen层设置把DRC markers显示出来同时关闭无关层只留Top层、Pin、Via和DRC层方便观察。定位时有一个实用技巧DRC Browser里有每个违规对象的坐标可以按照坐标排序让所有SMD Pin间距违规按x轴或y轴排列。这样你就能很清楚地看出违规点是集中在某一两个小区域内还是分散在全板。如果分散很开先不要急着用一个巨型区域包住所有点那样会把太多无辜走线也罩进去后面往往会带来新的隐患。3.2 第二步画出规则区域Shape确认好违规集中区之后在Allegro左侧命令栏或菜单里选择Add - Rectangle在违规区域画一个矩形。画在哪里呢我的习惯是放在Board Geometry的“Constraint_Region”子层或者放在Routing Keepup层也行。但要注意为了不影响后续出光绘和制板不建议把这个Shape直接画在Top层除非你后续记得在底片设置里过滤掉它。你可以先画在Top层然后再修改它的层属性。画矩形时不要贪大先框住最密集的报错点即可。如果违规区域是不规则形状可以用Add - Polygon画多边形或者先用矩形画一个大概范围再用Edit - Shape编辑边界。实际项目里我通常先画一个覆盖大部分违规点的矩形跑一次DRC再把剩余的零星违规点看情况并入。如果拼成一个多边形太费劲宁可多画两块小区域也别画成一个大而全的形状。3.3 第三步在Constraint Manager里新建CSet这是整个优化动作的核心。打开菜单Constraint - Constraint Manager左侧工作簿里选择Spacing - All Layers - Region然后在右侧空白区域右键点击Create - CSet输入名称建议带有项目识别度比如“SMD_5MIL_REGION”。创建完成后在Spacing约束里找到这个新CSet然后把它下面的各类间距参数逐项调整。这次主要目标是放宽SMD焊盘之间的间距所以重点设置这几个Minimum SMD Pin to SMD PinSame Net从8mil改成5mil。Minimum SMD Pin to SMD PinDiff Net从8mil改成5mil。Minimum Pad to PadSame Net从8mil改成5mil。Minimum Pad to PadDiff Net从8mil改成5mil。注意我在这里特意把Same Net和Diff Net都改了因为实际检查中不少报错来自相邻引脚属于同一个网络的情况比如多个电源引脚并联时它们之间的间距同样会被DRC计算。只改一种很容易出现“报错数量减少但没清零”的现象。3.4 第四步把CSet指派给区域Shape回到PCB编辑界面用鼠标选中刚才画的矩形Shape右键选择Assign CSet在弹窗中选中“SMD_5MIL_REGION”这个约束集。如果你选的Shape本来不是可以作为规则区域的类型右键菜单里会看不到Assign CSet选项这时需要检查Shape是否闭合、层是否正确比如板框外的Shape无法成为有效区域。指派完成后可以再用Display - Status重新跑一次DRC点击Update DRC按钮观察报错数量变化。这一步会发现问题如果区域画小了有些违规点仍然在报如果区域画大了原本没问题的区域里可能会出现新的报警——因为某些走线或过孔和焊盘之间的距离原本卡在刚好8mil你把它改到5mil后虽然不报错但焊盘和走线之间的实际间距并没有改变所以通常不会“新增加”错误反而更可能出现的是区域外的对象因为和区域边界相交而产生警示。这种因为区域边界穿过了铜皮或走线导致的异常可以通过紧贴焊盘边缘画边界来避免。3.5 第五步把区域压缩到最优尺寸DRC清零只是一个阶段离“干净”还差一步。我习惯把区域范围反复压缩每次缩小一点点再跑一次DRC直到再缩就会出现报错为止。这个过程看似繁琐但对于生产制造和评审很关键。区域越小对周边走线和铺铜的影响就越小后期如果要做阻抗控制或EMC仿真也不容易被大块规则区域干扰。实际操作时可以用“先大后小、分段收缩”的方法先保留一个较大的矩形区域把DRC清完然后选Edit - Shape把边界往内推。例如BGA区域的Shape可以先包住整个BGA再根据实际报错坐标缩小到外圈两排引脚附近。每收缩一次大约点一次Update DRC整个过程只需要几分钟但后续省下的沟通成本远超这几分钟。4. 常见问题与排错实录为什么区域规则有时候不生效4.1 区域规则没生效先自查这三个点如果你按前面流程走完DRC还在报错大概率是这三个地方出了问题。第一检查Shape所在层。Allegro的区域规则是分层的你在顶层画的区域只在顶层生效。如果DRC违规发生在内层或底层你需要把区域Shape复制一份放到对应的“信号层区域子类”下面。比如L2层有SMD Pin间距违规就得在L2层也画一块相同的区域Shape再Assign CSet。第二确认CSet是否正确指派。右键Shape后选择“Assign CSet”弹窗里要看清楚选的是Spacing CSet还是Physical CSet。这两个约束集是分开的选错了自然不生效。另外如果在Constraint Manager里修改了CSet数值PCB界面不会实时更新必须重新点Update DRC才会重新计算。第三确认DRC更新方式。很多朋友以为改了规则报错标记就会自动消失。Allegro里DRC更新分“静态”和“动态”模式。如果你设置的是静态DRC就必须手动点击Update DRC动态DRC模式下移动、修改对象时会自动刷新但改了CSet这种规则类数据有时也需要手动触发一次全量更新。4.2 DRC报错类型没变少只是换了名字有一种很让人头疼的情况区域规则加完SMD Pin to Pin Spacing不再报错了但紧接着Line to SMD Pin或者Via to SMD Pin的报错数量涨了上来。原因很简单区域CSet里我只改了焊盘到焊盘的间距没有调整走线到焊盘、过孔到焊盘的间距。如果原本这些对象的间距是7.5mil而全局规则要求8mil那它们当然还在报错。解决办法是把区域CSet里的相关间距项都审视一遍。比如把Minimum Line to SMD Pin也改成5mil把Minimum Via to SMD Pin改成5mil甚至把Minimum Line to Line也一起评估一下。我的建议是不要只针对当前报错类型做最小化修改而是要整体浏览一遍这个区域会涉及的间距参数做出一个统一且安全的约束集。否则你会发现DRC报错像打地鼠按下去一个又冒出来一个。4.3 区域把不该放宽的网络也罩进去了怎么办这是区域规则最常见的副作用之一。举例来说某个区域内除了SMD Pin间距违规的普通信号网络还有一条高压网络或模拟敏感网络你希望它依然保持8mil间距不跟着区域规则一起放宽。这时候单靠一个CSet是没法区分的需要引入Net Class或者Class-Class规则。做法是在Constraint Manager里先把这条高压网络设成一个Net Class比如叫“HV_NET”然后针对这个Net Class创建一个单独的Spacing CSet把间距参数设回8mil。在区域规则的优先级体系中Net Class级的约束会覆盖区域级约束所以这个高压网络在区域内依旧保持8mil。要注意的是Class-Class规则还牵扯到“一对一”“一对多”的交叉设置操作复杂度会高一些但对于有特殊安全要求的板子这一步不能省。4.4 两个区域重叠时到底按谁的规则算如果在同一层上画了两个规则区域并且有重叠Allegro的实际行为是“先生成或先绑定CSet的区域优先级更高”。但是不同版本、不同数据库环境下表现可能不太一样我建议在工程上直接避免重叠。如果实在无法避免用命名规范来管理区域顺序比如在区域名称里加“01、02”前缀并且确保你给两块区域分配的是同一个CSet这样就算重叠也不会出现规则冲突。还有一种边界情况是一个对象部分在区域内、部分在区域外。这种情况下Allegro的常规处理是对象整体按区域规则判断。所以画区域时尽量不要从焊盘或走线中间穿过否则某条走线被“劈成两半”虽然线宽线距算法上没问题但DRC报告会比较难理解也和板厂沟通制造说明时容易造成误会。4.5 出光绘前必须处理的区域层遗留问题如果区域Shape画在了Top层等信号层出光绘时这份Shape会被视为铜皮图形或走线图形板厂会在制造说明里看到一块奇奇怪怪的东西。因此建议在出光绘前把辅助用的规则区域Shape统一移到Board Geometry的Constraint子类下。这类层在Artwork控制里一般默认不作为铜箔输出只作为设计说明的一部分。如果不清楚自己放到了哪一层可以用菜单Display - Element查找Shape属性确认层归属之后再出Gerber。4.6 动态协调区域规则和铺铜优先级Allegro里还有一个容易混为一谈的概念铺铜规则Shape优先级。有人会把区域规则和禁止铺铜区弄混比如为了解决焊盘间距问题铺一块Route Keepout结果导致BGA内部大量走线无法通过。你要做的不是“禁止走线”或“禁止铺铜”而是“独立设置间距规则”。所以优先使用“Shape Assign CSet”的组合而不是“Route Keepout”。当然在更复杂的板子里动态铜皮避让和区域规则会同时起作用。如果你用了大片动态铜皮铜皮边界和焊盘的间距也受区域CSet影响。设置区域规则后如果发现某处铜皮“钻”进了焊盘之间的窄缝看起来不美观可以再用Shape - Decompose或手动编辑铜皮外形来微调。但这是后期美化工作和DRC合规是两码事别混在一起操作。5. 让区域规则真正工程化的几个经验5.1 尽早规划别等DRC爆表后再“救火”这次处理SMD Pin间距DRC本质上是前期没有给高密度区域预留规则缓冲。我现在做新板子会在布局完成后、布线开始前就根据BGA扇出需求预先把区域CSet建好并画好大概的区域范围。等到布线时这些区域已经生效DRC在布线过程中实时反馈就不会出现整板几百条报错集中爆发的局面。这个习惯能节省大量返工时间。在创建CSet时我还会把常用的几种宽松规则提前分类建好比如“BGA_FANOUT_5MIL”“CONNECTOR_6MIL”“HIGH_VOLTAGE_12MIL”等。遇到新项目直接从规则库里调用把“画区域→绑CSet→跑DRC”变成一套标准动作效率很高。5.2 命名规范和设计记录要跟上区域规则最怕的是“人走茶凉”。三个月后PCB评审别人问为什么这里有一块区域是5mil规则你如果答不上来设计质量就会被打折扣。所以我会在工程目录下保留一份设计说明记录每个区域CSet的用途、适用层、适用范围。命名尽量自解释例如“BGA_U1_OUTER_SMD5MIL”一眼就知道是U1这颗BGA外圈SMD焊盘用的5mil规则。区域Shape本身也可以放在一个独立的Constraint子类下面用颜色区分不同规则方便后期查阅。5.3 用“DRC收敛工作法”处理批量导出报告说一个我常用的DRC收敛工作法当报错数量很大时先不要急于逐一修改。用DRC Browser把所有违规项按坐标排序然后导出成一个文本报告Report - Design Rules Check里面会带有的坐标、对象类型、规则约束名。我通常是先在Excel里做一次简单排序按坐标将违规分组再用不同颜色标出主要集中区域。这种方式比在PCB界面里满屏找标记高效得多也方便在多人协作时把不同区域分给不同工程师处理。在实际处理过程中我也建议每完成一轮区域优化就重新生成一份DRC报告对比报错数量和分布变化。当你看到报告最下方的“Total Errors”逐渐减少最后趋于0那种成就感是实实在在的。这些就是我从一次SMD Pin间距DRC报错里总结出的区域规则优化经验。Allegro的区域规则不是什么黑魔法但它确实是解决“局部紧、全局松”这类问题的最佳工具之一。如果你也正在面对类似报警可以按这个流程试一遍重点是把区域画准、把CSet设置完整、把DRC机制跑明白。最后再说一个个人体会区域规则用得好的前提是敬畏它——千万不要为了清零DRC而把整板所有地方的间距都“开绿灯”真正的干净不是报错清零而是在合理的规则框架下每个间距都有据可查。希望这篇实战记录能帮各位少走弯路。