做PCB设计的时候,我最烦的就是在一片板上已经把规则改得很宽,结果DRC还是铺天盖地报错,尤其是那种高密度板上的SMD Pin间距问题。看着密密麻麻的Violations列表,不知道你是会一条条去Waive,还是会怀疑人生。其实很多情况下,问题不在你的全局规则设置,也不在封装绘制,而是你没有给Allegro一个“局部特事特办”的手段——这个手段就是区域规则(Region Rules)。
先说清楚我这篇要干什么:围绕Cadence SPB17.4版本的Allegro PCB Designer,专门讲如何用区域规则解决SMD Pin间距类DRC报错。会从报错产生的原理讲起,落到Constraint Manager的具体设置,再走一遍完整的区域绘制、规则绑定、DRC重跑流程,最后把我用过的一些坑和心得一并交代。适合刚接触Allegro不久、被DRC折磨得头大的人,也适合那些全局规则已经懂、但还没真正用Region玩过“局部放行”的人。
1. 为什么DRC一直揪着SMD Pin间距不放
1.1 DRC检查的“间距”到底是谁和谁的距离
在Allegro里,SMD Pin的间距检查属于Spacing(间距)约束,DRC报错的全称一般是类似SMD Pin to SMD Pin Spacing这种。它比较的是两个不同网络(Different Net)的SMD类引脚之间的边缘距离,一旦这个距离小于当前有效的Spacing规则值,就会给你标一个Violation。
这里的重点在于:Allegro默认按“网络”来找规则,而不是按“器件”。也就是说,两个贴片引脚如果分属不同的Net Class,系统会去查这两个Net Class之间配置的Spacing Constraint Set(简称CSet)。如果你没有单独配置,就全部落到默认的DEFAULT规则上。
所以很多新人改规则时的第一反应是去把DEFAULT改得很大,或者去把某个Net Class的线宽线距调小。这本身没问题,但有一个场景是全局规则搞不定的:一块板上大部分区域可以走紧密间距,但某几个局部区域因为封装特殊、结构受限,或者电源铜皮挤压,需要比周围更宽松的间距;反过来也成立——大部分区域允许常规间距,但某个特殊区域(比如阻抗控制段、高压隔离区)必须更严格。
这个情况下,你不可能给整板统一加宽间距,那样板子改完可能走线都走不通;也不可能一条条Waive,那样DRC等于白跑。区域规则就是给你这种“局部例外”用的。
1.2 全局规则解决不了的“局部场景”
我举个自己遇到过的典型案例。有一块混合信号板,MCU附近有一排SMD去耦电容,因为结构件限高,电容位置必须贴得很近,引脚间距已经压到0.25mm左右。但是整板其他地方的布线密度并不高,全局SMD间距规则设的是0.35mm。这就意味着,每次跑DRC,那排电容附近的报错能到几十条,红的绿的标得满屏都是。
最开始我处理的方式比较笨,单独给那排电容上的网络设置了一个较宽的CSet,结果发现不行——因为报错的是“电容引脚到旁边其他网络引脚”的距离,只设单侧网络规则根本覆盖不了。后来才转向区域规则:在那个电容阵列周围画一个区域,区域内统一使用CAP_LOOSE这个宽松CSet,问题一下全消,DRC干净了,板子散热和结构要求也没被破坏。
所以一句话总结:SMD Pin间距DRC报错不是孤立事件,背后多半是“全局规则”和“局部物理需求”之间的冲突。处理这类冲突的正规手段,在Allegro里就是Region。
2. 动手之前,先把Constraint Manager里的几个概念理顺
2.1 CSet、Net Class和Spacing Rule的关系
在深入操作前,必须把Allegro中三个容易混淆的概念放在一起说清楚:
- Spacing Rule Set(CSet):一组间距参数,比如
Line to Line、Line to SMD Pin、SMD Pin to SMD Pin的值集合。你可以把它理解成一套“间距规则的模板”,起个名字存起来,比如5MIL、8MIL、LOOSE_12MIL。 - Net Class:网络的分组。你可以把一组电源网络设成一个Class,把一组高速信号设成另一个Class。然后给不同的Class之间指定不同的CSet。
- Region(区域):板上的一个物理范围,在这个范围内可以覆盖一套或几套CSet,覆盖时优先于单纯按Net Class查到的规则。
这三者的关系,我用一张表格帮你理清楚:
| 概念 | 作用范围 | 优先级(从低到高) |
|---|---|---|
| DEFAULT CSet | 整板所有网络 | 最低 |
| Net Class之间的CSet | 指定网络组之间 | 中间 |
| Region内绑定的CSet | 物理区域之内 | 最高(区域优先于网络Class) |
也就是说,当你在某块区域里绑定了CSet后,只要DRC对象(比如SMD引脚)落在该区域内,就优先采用区域的CSet值,而不是去管它们属于什么Net Class。这正是解决局部间距冲突的核心机制。
2.2 先备好一套“局部宽松”的CSet
区域规则绑定的对象就是CSet,所以在创建区域之前,建议先打开Constraint Manager,把区域要用到的CSet准备好。
操作路径是:Allegro PCB Designer→Setup→Constraints→Constraint Manager。打开之后,左侧导航栏切到Spacing标签页,能看到All Constraints、Net Class Assignment等分支。在Spacing Constraint Set分支下,默认有DEFAULT,右键可以创建新的CSet,比如我就习惯命名成SMD_LOOSE或REGION_8MIL。
创建CSet时,建议你确认以下几个关键间距参数:
SMD Pin to SMD Pin:决定贴片引脚之间的最小距离SMD Pin to Line:影响走线离焊盘的远近Line to Line:影响区域内的走线间距SMD Pin to Shape:如果区域内要铺铜,这个值就要留够Shape to Shape、Shape to Line:涉及动态铜皮的间距
这些值不用一上来就调到特别大,建议结合板厂的工艺能力和实际空间评估。常规1oz铜厚、普通FR4工艺,SMD Pin到SMD Pin设到6~8mil基本比较稳妥,特殊高压或安全间距要求另说。
提示:在Constraint Manager里创建好CSet之后,注意保存规则文件,最好在板子工程的
Rules文件夹里保留一个.dcf或文本形式的规则存档,方便后续版本间同步。
2.3 网表阶段就规划Net Class,后面省一半事
虽然区域规则会覆盖Net Class的间距,但在某些混合场景中,你仍然需要Net Class先分层化。比如你希望区域内“同网络”的引脚不报错,但“不同网络”的引脚之间仍保持最小间隙——这种判断虽然不会因为Net Class而改变,但Net Class设置好能让DRC的高亮信息更清晰,排查时一眼看出冲突双方是谁和谁。
所以在设计开始时,我就建议把电源、地、普通信号、差分信号等分好Net Class。这不是区域规则的前置必选项,但它能让后面的Constraint Manager操作更清晰,也会让DRC报错信息更容易读。
3. Allegro区域规则创建全流程:从画边界到绑定CSet
3.1 在版图上画出区域边界Shape
在Allegro中,区域规则是通过一个物理的Shape或Rectangle来定义边界的。我先走一遍最常用的创建步骤:
- 确保当前激活的是你要应用区域规则的层,通常是
TOP或BOTTOM,或者ALL ETCH层。 - 菜单栏选择
Setup→Constraints→Application Mode,这个先确认一下当前有没有切到Etch Edit模式。如果模式不对,后面选Shape时容易被当成Route Keepout来处理。 - 用
Add→Rectangle或Add→Shape画一个覆盖目标区域的图形。这个图形的作用范围,默认对所有层都生效,除非你在后续属性里指定只作用于某些层。
画区域的时候要注意:区域边界不要画得太紧贴着SMD引脚。如果你的区域边界正好压在引脚中间,DRC判断时很容易出现“一边在区域内、一边在区域外”的尴尬情况,后面的规则覆盖就不稳定了。预留1~2mm的余量是必要的。
3.2 用Property将区域设为规则区域
画完Shape后,它现在还不是Allegro眼中的“规则区域”。你需要给它指定属性:
- 选中刚才画的Shape。
- 打开
Edit→Properties,在属性列表中找到RULES属性。 - 给
RULES属性赋值,赋的值是一个或多个“物理区域约束集合”的名称。
由于SPB17.4里同时存在Physical和Spacing两套约束,如果你只是解决间距类DRC,可以给Spacing区域单独创建并指定一个名称。这个名称是你自己起的,跟CSet名字不必相同,但为了方便管理,我建议两者保持一致,比如区域规则名称叫REG_SMD_LOOSE,绑定的CSet也叫SMD_LOOSE,一眼就能对上。
更具体的做法:先在Setup→Constraints→Constraint Manager里切到Spacing页,在Region分支下创建一条区域规则,名称类似REG_SMD_LOOSE,在里面把需要覆盖的CSet选成SMD_LOOSE。然后回到版图,给Shape的RULES属性填REG_SMD_LOOSE。两步做完,区域规则就正式生效。
3.3 限定区域规则作用的层
区域Shape默认对所有层生效,这在多层板里可能会造成意想不到的影响。比如你在TOP层画了区域想管SMD引脚间距,但它同时也会影响BOTTOM层、内层的走线间距。如果你的本意只是让TOP层的某个器件区域放宽间距,建议在属性里限定层。
对应的属性是RULES_LAYERS_BY_LAYER或利用RULES结合LAYER参数(具体名称与版本略有差异,SPB17.4里常见的是RULES属性支持带层名参数)。实际设置时,可以在属性编辑器中填写类似(TOP RULE_NAME)或按照你当前版本的语法填写。填好后,该区域规则就只对TOP层生效。
这一步很多人容易漏,漏掉的结果就是“区域把本来不该影响的内层走线也放宽了”,后续其他网络跑到BOTTOM层被错误放行,DRC过了,可实际安全间距不够,隐患很大。
3.4 检查区域内实际覆盖的引脚
区域画好、属性绑定完后,先别急着跑DRC。用Display→Element选那个Shape,能查看它的属性;更重要的一步是确认哪些引脚被纳入了这个区域。
你可以打开Highlight,手动框选区域内的引脚,高亮后与DRC报错列表里的对象对照。也可以利用Tools→Show Elements,选择一个引脚,查看其属性里是否显示被某个区域约束覆盖。SPB17.4在引脚属性面板中会显示它所属的约束区域,仔细看就能确认。
这一步非常值得花时间。我见过不止一次:区域画了、规则也绑了,但DRC还是报错,最后发现是区域Shape被画在了Board Geometry层,或者Shape太小没有完整包住所有SMD引脚,导致部分引脚不认区域规则。
4. 从报错到干净的DRC:一次SMD Pin间距冲突的完整修复
4.1 复现一条典型的SMD Pin间距报错
为了让你看得更明白,我模拟一个常见场景。假设板上有两个不同网络(比如3V3和GND)的SMD电阻贴得很近,DRC报错如下:
SMD Pin to SMD Pin Spacing: 3V3-1 to GND-1 Constraint: 0.35mm Actual: 0.25mm这个报错的意思是:3V3网络的1号引脚到GND网络1号引脚边缘距离只有0.25mm,但当前规则要求至少0.35mm。这种报错在Display→Status里会显示为DRC Violation计数增加。
如果你在约束管理器里把全局SMD Pin to SMD Pin改成0.25mm,DRC确实会消失,但整板其他原本不紧张的区域也会被“降级”到0.25mm,这是我不想接受的妥协。更合理的方式,是把这两个器件所在的局部区域单独划出来,区域里允许0.25mm。
4.2 定位报错坐标,确定区域边界
我这里建议你直接在Message窗口里点击DRC错误输出行的坐标,Allegro会在版图中央定位到相关对象。然后用Display→Shadow打开当前DRC高亮,看清是哪些引脚在打架。
确认冲突对象后,用Add→Rectangle在它们外围画一个矩形。画的时候把附近所有需要放宽间距的器件都包含进去,同时不要跨到不相关的走线区域。如果你对边界位置没把握,可以先把Shape画大一点,等DRC跑完后看覆盖范围再往里缩。
4.3 绑定区域规则并重跑DRC
接下来按第三部分的操作,给这个Shape绑定REG_SMD_LOOSE区域规则,确认其中Spacing CSet是SMD_LOOSE,SMD Pin to SMD Pin设为0.25mm。
然后重新跑一遍DRC:菜单Display→DRC→Update DRC,或按下快捷键后等待引擎更新。在SPB17.4里,更新完成后Display→Status中的DRC计数会刷新。如果区域规则覆盖正确,那组SMD Pin间距报错应该立即消失;如果与区域无关的其他地方还有报错,则不受影响。
4.4 边界引脚的取舍经验
我处理类似案例时,有一条很重要的实践经验:区域边界至少离最外侧引脚的边缘留出0.5mm以上。为什么?因为实际布局中,器件坐标有误差、引脚间距不齐,如果边界压着焊盘边缘,DRC引擎判定引脚归属时有可能出现“一半算区域内、一半算区域外”的中间态。这种情况下DRC报错会反复跳动,区域规则时灵时不灵。
另外,区域边界最好避开其他规则的边界。比如你已经给某个高压区域画过另一个Area,两个区域不要发生交叠,否则Allegro处理交叠部分时,规则优先级会变成复杂多层叠加,排查起来要命。能避免交叠就避免交叠。
5. 区域规则在SPB17.4里的元凶级坑:覆盖、限制与层级
5.1 区域覆盖的优先级到底怎么算
Allegro把规则查找顺序设计为“越具体越优先”。区域规则优先于普通Net Class规则,但在多个区域交叠时,SPB17.4会按照创建顺序或区域类型做优先级排序。最典型的例子:你既有走线宽度/物理规则区域(Physical CSet),又有间距规则区域(Spacing CSet),两个区域Shape内容不同、边界重叠,最终某个引脚可能一部分走物理规则,一部分走间距规则。
要用好区域规则,就得接受一个概念:物理规则和间距规则是分开的两套体系。在Constraint Manager里,分别是Physical页和Spacing页,Region在两侧各自独立创建。不要以为你只在Spacing页里创建了Region,Physical规则也会跟着变;反过来也一样。
回到SMD Pin间距问题,我们只关心Spacing页的Region。但如果你的区域内同时还需要调整线宽,就需要在Physical页也配置对应的Region规则。SPB17.4支持把两个区域规则用同一个Shape的RULES属性引用,但实际判断时两者是独立运行的。
5.2 区域内的“非铜”对象仍受全局规则约束
区域规则管的是“间距约束”,但它不是万能的。比如某些非电气对象,像是Board Outline、Route Keepout、Package Keepout,它们和SMD引脚之间的间距不一定能被区域内CSet完全覆盖。尤其是如果你在Route Keepout旁边放了SMD器件,DRC报错经常会涉及Keepout to Pin,这种约束属于其他规则分支,区域规则管不到。
所以如果你遇到的SMD Pin间距DRC报错旁边还叠加着Keepout错误,先单独处理Keepout对象,再来看区域规则,不然你会误以为区域规则失效了。
另外还有一个很经典的坑:Shape(铜皮)和SMD Pin的间距报错,可能不归SMD Pin to Shape管,而会被归类到Shape to SMD Pin。在Constraint Manager中两者的字段名和实际作用方向不完全一致,如果你的CSet只改了SMD Pin to Shape而没有改反向参数,铜皮与焊盘之间的DRC依然存在。
注意:在SPB17.4里,建立CSet时,尽量把成对的间距都同步设置,比如
Line to SMD Pin和SMD Pin to Line、Shape to SMD Pin和SMD Pin to Shape。虽然很多情况下软件会强制对称,但不同Net Class组合时偶尔会出现不对称规则,这也是DRC漏报或误报的来源。
5.3 区域Shape的层归属带来的幻觉
有朋友在群里问:为什么我在TOP层画了区域、绑了规则,BOTTOM层上的SMD引脚间距报错也消了?大概率是因为他画的区域Shape层属性是All Etch而不是Top。在Allegro中,如果你用Add→Rectangle时选择的层是Route Keepout或Board Geometry,那它不会作为电性区域生效;如果你用的层是Top或All Etch,它默认会对所有ETCH层生效。
这就解释了那个“区域规则在BOTTOM层也生效”的现象。如果这不是你的本意,就需要回到Shape属性里明确指定层范围。我建议在画Shape前,先确认Options面板里的Active Class和Subclass是ETCH下的对应层,比如ETCH / TOP,画出来才是只作用在TOP的约束区域。
5.4 动态铜皮和静态铜皮对区域规则的响应
另一个实务问题是铺铜。动态铜皮(Dynamic Shape)会自动遵循当前所在区域的Spacing规则,所以区域内CSet改宽后,铜皮会自动避让得更远。但静态铜皮(Static Shape)不会——它是“死”的,之前的避让结果不会自动更新,需要你手动Shape→Fill或Update后重新生成。
这解释了为什么某些板子上,区域规则生效后电气间距DRC全消了,但SMD Pin到Shape的间距还是报错。排查时一定要看区域内有没有静态铜皮,有的话先选中Shape,右键选择Update让Allegro按新规则重新避让,再跑DRC。
6. 处理“区域外全对、区域内全错”的边界特殊案例
6.1 同一颗器件一半引脚在区域内怎么办
有些时候你不是自己画的区域,而是从别的工程师手里接过板子。这时候你可能会遇到一个很恼人的情况:一颗BGA或连接器,一部分引脚在区域内,一部分引脚在区域外,DRC报错数量不减反增,规则像是“穿身而过”。
这种一半覆盖的情况,建议不要硬靠区域规则去调。要么把区域扩大,把整颗器件包进去;要么放弃区域,改用Net Class或Pin Pair规则去处理。半覆盖状态的规则判定会非常微妙,SPB17.4虽然会按引脚逐个判断,但实际布局中同一个器件跨越两个区域规则时,封装内部的引脚间距计算容易出现你预想不到的组合。
6.2 区域规则里也要区分“同网络”和“不同网络”
在Constraint Manager中,区域CSet同样区分Same Net和Different Net两类。默认情况下Same Net的间距规则往往比较宽松或为0,因为同一网络的引脚通过铜皮相连,DRC通常不检查它们之间的间距;而不同网络的引脚间距才是我们真正关心的。
如果你在区域内大规模放宽了Different Net的间距,但忘记检查Same Net设置,有些网络劈开穿过同一焊盘阵列的情况,DRC可能会报出奇奇怪怪的间距错误。我在一个高速连接器区域遇到过:内部引脚同网络的间距被设成了1mm,结果大量同网络的电阻两脚之间报错。解决方案就是把区域CSet中Same Net SMD Pin to SMD Pin也设成与Different Net一致的安全值。
6.3 万不得已时的“批量处理”手段:区域规则叠加Net Class
有些场景下,区域规则覆盖面太宽,总会有几个“不太合群”的网络混进来,导致本来只想放行一部分网络,结果区域内所有网络的间距都被放宽了。这时候你可以在区域的CSet基础上,再通过Net Class之间的规则做二阶收紧。
举个例子:你的区域REG_SMD_LOOSE把SMD间距放宽到0.25mm,但区域内的一个高电压网络(比如AC_NET)必须保持0.5mm最小间距。这时你可以在Constraint Manager中设置AC_NET这个Net Class与其他Net Class的组合规则仍是0.5mm。由于区域规则在处理时还要满足“区域内所使用的CSet允许的约束”,但Net Class之间的显式约束比CSet里的泛化值优先级更高,最终DRC仍然会按更严格的那个来检查。
这个特性听着绕,但用好了非常强,相当于你在区域里又做了“局部中的局部”。我实际处理高压隔离区就是靠这个组合,让大部分信号走区域宽松规则,但高压信号保持严格间距。
7. 区域规则维护与团队协作中的几个实际问题
7.1 规则文件备份与版本同步
区域规则配置好后,强烈建议导出一份文本规则文件。通常在Constraint Manager里用File→Export可以导出.dcf或.dcr文件,里面包含了Net Class、CSet和Region定义。团队协作时,把这份文件跟板子封装一起提交到版本库,能避免换电脑、换版本后区域规则丢失。
SPB17.4的.brd文件本身会保存规则,但如果你在别的版本(比如16.6或17.2)打开,区域规则可能会出现兼容性警告。导出独立规则文件,是跨版本移植的保险措施。
7.2 清理无用Region
区域规则是会累积的。画了不用、忘记删除的Region,和别的区域重叠后会干扰判断。我建议每次Run DRC前,在Constraint Manager的Region分支下看一眼当前板上有哪些区域规则,把不需要的都删掉;再回到版图,用Display→Element逐个点选Shape确认用途。
这个习惯看着琐碎,但能省下大量排查时间。实际项目里很容易出现“某个工程师为了临时实验画了个区域,后来忘了删”,等到下一轮改版、DRC报错时,谁也记不清那个区域是哪来的。
7.3 从区域规则视角重新审视DRC报告
最后给一条实践建议:处理DRC报错时,不要只盯着报错条数,先从报错坐标的分布判断是否和区域有关。我会在Display→DRC里按Markers高亮所有报错,然后看颜色分布——如果报错成片集中在某个器件群附近,优先往“区域规则没覆盖到”这个方向排查;如果报错零星分布全板,再考虑全局规则问题。
这条经验帮我把DRC处理时间压缩了将近一半,因为80%的SMD Pin间距矛盾,根源都是局部物理空间挤兑,而不是全局规则设置失误。
区域规则这个功能,说到底是Allegro为“规则灵活度”给设计师留的口子。合理运用它,你就能做到:板上大部分区域保持你的严谨默认值,某些特殊地方放心地“网开一面”。我在实际项目里的体会是,区域规则不要藏着不用,但也别滥用——每个区域Shape都应该有明确的工程原因,要么是器件结构限制,要么是间距安全要求,而不是为了消除DRC而随手画个框。等你真正用顺手了,会发现DRC报错清单能干净不少,跟板厂沟通工艺参数时也有底气了。