ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Allegro区域规则实战:解决SMD Pin间距DRC报错

Allegro区域规则实战:解决SMD Pin间距DRC报错 做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 SetCSet一组间距参数比如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区域规则创建全流程从画边界到绑定CSet3.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.25mmDRC确实会消失但整板其他原本不紧张的区域也会被“降级”到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_LOOSESMD 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页里创建了RegionPhysical规则也会跟着变反过来也一样。回到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报错清单能干净不少跟板厂沟通工艺参数时也有底气了。
返回列表