做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的约束管理器中,有一类叫CSet(Constraint 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间距DRC
3.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 Pin(Same Net):从8mil改成5mil。
- Minimum SMD Pin to SMD Pin(Diff Net):从8mil改成5mil。
- Minimum Pad to Pad(Same Net):从8mil改成5mil。
- Minimum Pad to Pad(Diff 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而把整板所有地方的间距都“开绿灯”,真正的干净不是报错清零,而是在合理的规则框架下每个间距都有据可查。希望这篇实战记录能帮各位少走弯路。