1. 约束管理器到底在管什么
1.1 从一次改板返工说起
画过四层板以上的人大概都经历过这种场景:板子发出去打样,回来一测,DDR跑不起来,眼图一塌糊涂,最后定位到某几根数据线等长差了将近200mil。回头翻设计文件,发现当初布线时压根没设等长规则,全靠手工拉线时目测。这种返工一次,少则三五天,多则两周,打样费倒是小事,项目节点耽误不起。
Allegro的Constraint Manager就是干这个的。它不是一个“画图工具”,而是一套贯穿原理图到PCB的规则引擎。你在里面定义的线宽、间距、等长、差分对、阻抗、过孔类型,会直接约束布线器(Router)和自动检查(DRC)的行为。换句话说,它决定了你的板子“能怎么画”和“画完合不合格”。
很多人对Constraint Manager的理解停留在“设个线宽间距就完了”,这其实只用了它两成功能。真正高效的用法,是把电气规则、物理规则、间距规则分层管理,让不同网络自动套用不同约束,而不是一根根线去手动改。这篇内容适合已经能独立画简单板子、但一遇到高速信号或密集BGA就头疼的Layout工程师,也适合想从AD转Allegro、被规则系统绕晕的朋友。
1.2 规则分层:别把所有约束塞进一个抽屉
Constraint Manager的规则体系大致分几层:Electrical(电气规则)、Physical(物理规则)、Spacing(间距规则)、Same Net Spacing(同网络间距)、Properties(属性)。每一层下面又按网络类(Net Class)、差分对(Diff Pair)、总线(Bus)、XNet等维度细分。
我见过不少新手把所有规则都往Default里塞,结果就是:电源线想加宽,得单独选网络改;差分对想设等长,又得重新建一套。正确的做法是先分类,再套规则。比如把电源网络归到PWR类,把DDR数据线归到DDR_DATA类,把差分对归到DIFF类,然后针对每个类设一套规则。这样后续加网络时,只要把它归到对应的类,规则自动生效,不用重复劳动。
提示:Net Class的划分建议在原理图阶段就规划好,通过OrCAD的Net Class属性传递到Allegro,比在PCB里手动归类省事得多。
1.3 为什么不用默认规则凑合
Default规则是给“没有特殊要求的网络”兜底的。如果你把高速信号也扔进Default,那等长、阻抗、差分间距这些约束就没法单独设。更麻烦的是,Default的间距规则通常是全局最小的,比如6mil。但BGA区域可能需要4mil才能出线,而板边又需要8mil以上保证加工良率。如果全用Default,要么布不通,要么加工超差。
所以Constraint Manager的核心思路是:默认规则保底,类规则覆盖,个别网络再单独微调。这个优先级顺序是:单个网络/对 > Net Class > Default。理解了这个优先级,后面设规则就不会乱。
2. 物理规则与间距规则的实操设置
2.1 线宽规则:从电流和阻抗两个维度倒推
线宽不是拍脑袋定的。它受两个因素约束:载流能力和特征阻抗。
载流方面,常用的经验公式是IPC-2221的曲线,但实际工程中我习惯用简化估算:1oz铜厚,外层1mm线宽大约走1A,内层减半。比如3A的电源线,外层至少3mm(约118mil),内层至少6mm。当然这是保守值,实际还要看温升要求。如果空间紧张,可以并排走多根细线,或者用铜皮(Shape)代替走线。
阻抗方面,单端50ohm、差分100ohm是常见目标。线宽和层叠结构直接相关。比如四层板常见的层叠是:Top-GND-PWR-Bottom,介质厚度约0.2mm,Er约4.3。用Allegro自带的阻抗计算器(在Cross Section里)可以反推线宽。我实测下来,这种层叠下,Top层50ohm单端线宽大约6mil,差分对(间距6mil)线宽约5mil。但不同板厂工艺不同,最好让板厂提供他们的层叠参数再算。
在Constraint Manager里设线宽,路径是:Physical规则 → 选中Net Class → 在Line Width栏填Min/Default/Max。这里有个细节:Min是布线器允许的最小值,Default是默认走线宽度,Max是最大值。如果你希望某类网络必须走特定宽度,把三个值设成一样即可。
注意:Neck模式(颈缩)的线宽在Physical规则里单独设。BGA出线时经常需要颈缩,比如从6mil缩到4mil,这段颈缩长度也要限制,否则阻抗突变太严重。
2.2 间距规则:别只盯着全局最小值
Spacing规则里,Default的间距通常设6mil或8mil。但实际设计中,不同网络之间需要不同间距。比如:
- 普通信号对普通信号:6mil
- 信号对电源:8mil
- 电源对电源:10mil
- 高压区域:根据安规要求,可能20mil以上
在Constraint Manager里,Spacing规则是一个二维矩阵:行是网络类,列也是网络类,交叉点就是间距值。你可以为每个类单独设。比如PWR类对SIG类的间距设8mil,PWR对PWR设10mil。
这里有个容易踩的坑:Same Net Spacing。同网络的不同段之间,比如过孔和走线、焊盘和走线,也需要间距。如果设得太小,DRC会报错;设得太大,又布不通。一般同网络间距设4mil左右,BGA区域可以放宽到3mil。
2.3 过孔规则:别让过孔成为瓶颈
过孔在Physical规则里设。常见参数:过孔直径(Via Diameter)、钻孔直径(Drill Diameter)、过孔类型(Through/Blind/Buried)。
我一般会建几种过孔:普通信号过孔(如8/16mil)、电源过孔(如12/24mil)、BGA区域微孔(如6/12mil)。然后在Physical规则里,针对不同Net Class指定允许的过孔列表。比如PWR类只允许用12/24和8/16,SIG类可以用8/16和6/12。
提示:过孔列表在Physical规则的Via List里设置。如果某个网络没有指定过孔,布线器会用Default里的过孔。所以Default里最好放最通用的那种。
2.4 差分对规则:等长、间距、阻抗三件套
差分对在Electrical规则里设。主要参数:
- Primary Gap:差分对两根线之间的间距,通常等于线宽(如5mil)。
- Primary Width:线宽。
- Neck Gap/Width:颈缩时的间距和宽度。
- Tolerance:允许的间距误差,一般设10%或20%。
- Min/Max Length:最小和最大长度。
- Max Uncoupled Length:最大未耦合长度,这个很关键。差分对在出BGA或经过过孔时,两根线会分开,这段未耦合长度不能太长,否则共模噪声会变大。一般设50mil到100mil。
等长规则在Electrical规则的Relative Propagation Delay里设。选中差分对,设一个目标长度(比如2000mil),然后设Tolerance(比如50mil)。布线时,Allegro会实时显示长度差,超了会变红。
3. 从零搭建一套可复用的规则模板
3.1 准备工作:层叠与网络分类
在打开Constraint Manager之前,先把两件事做了:层叠设置和网络分类。
层叠在Cross Section里设。四层板典型层叠:
| 层 | 类型 | 厚度 | 材料 |
|---|---|---|---|
| Top | 信号 | 0.035mm | 铜 |
| Dielectric | 介质 | 0.2mm | FR4 |
| GND | 平面 | 0.035mm | 铜 |
| Dielectric | 介质 | 0.2mm | FR4 |
| PWR | 平面 | 0.035mm | 铜 |
| Dielectric | 介质 | 0.2mm | FR4 |
| Bottom | 信号 | 0.035mm | 铜 |
这个层叠下,Top和Bottom的50ohm线宽大约6mil,差分100ohm约5mil/6mil间距。具体数值用Allegro的Impedance Calculator算一下。
网络分类在Constraint Manager的Net Class里做。我一般建这几个类:
- PWR:所有电源网络,如VCC、VDD、3V3、5V等。
- GND:地网络,通常不需要特殊规则,但可以单独设间距。
- CLK:时钟信号,如晶振输出、时钟芯片输出。
- DDR_DATA:DDR数据线。
- DDR_ADDR:DDR地址线。
- DIFF:所有差分对。
- SIG:普通信号。
分类时可以用通配符,比如“VCC*”匹配所有以VCC开头的网络。这样后续加网络时,只要命名规范,自动归入对应类。
3.2 物理规则模板:线宽与过孔
在Physical规则里,为每个类设线宽和过孔:
| Net Class | Min Width | Default Width | Max Width | Via List |
|---|---|---|---|---|
| PWR | 10mil | 20mil | 50mil | 12/24, 8/16 |
| SIG | 4mil | 6mil | 20mil | 8/16, 6/12 |
| CLK | 5mil | 6mil | 6mil | 8/16 |
| DDR_DATA | 4mil | 5mil | 5mil | 8/16, 6/12 |
| DDR_ADDR | 4mil | 5mil | 5mil | 8/16, 6/12 |
| DIFF | 4mil | 5mil | 5mil | 8/16, 6/12 |
这里PWR的Max设50mil是为了允许用粗线走大电流。CLK的Min=Default=Max=6mil,强制时钟线必须走6mil,避免阻抗变化。
3.3 间距规则模板:矩阵式管理
Spacing规则里,建一个矩阵:
| PWR | SIG | CLK | DDR | DIFF | |
|---|---|---|---|---|---|
| PWR | 10mil | 8mil | 8mil | 8mil | 8mil |
| SIG | 8mil | 6mil | 6mil | 6mil | 6mil |
| CLK | 8mil | 6mil | 6mil | 6mil | 6mil |
| DDR | 8mil | 6mil | 6mil | 5mil | 5mil |
| DIFF | 8mil | 6mil | 6mil | 5mil | 5mil |
DDR和DIFF之间设5mil是为了在密集区域能布通。但要注意,5mil间距对大多数板厂来说是常规工艺,良率没问题。如果板厂工艺能力有限,可以放宽到6mil。
3.4 电气规则模板:等长与差分
Electrical规则里,主要设三块:
差分对:在Diff Pair里,为DIFF类设Primary Gap=5mil,Primary Width=5mil,Neck Gap=4mil,Neck Width=4mil,Tolerance=10%,Max Uncoupled Length=100mil。
等长:在Relative Propagation Delay里,为DDR_DATA设目标长度2000mil,Tolerance=50mil。为DDR_ADDR设目标长度2200mil,Tolerance=100mil。为CLK设目标长度1500mil,Tolerance=20mil。
时序:如果有DDR,还需要在Electrical规则的Total Etch Length或Pin Delay里设时序约束。这部分比较复杂,建议参考芯片手册的时序要求,结合PCB走线延迟(约180ps/inch)来算。
注意:等长规则里的目标长度不是随便填的。它应该基于最长的那个网络来定,或者基于时序要求反推。如果目标长度设得太短,布线器会强行绕线,反而增加寄生参数。
4. 规则调试与常见问题排查
4.1 DRC报错太多怎么办
设完规则一跑DRC,满屏红叉,这是新手最崩溃的时刻。别急,先分类看报错类型。
间距报错:最常见。先看是哪个网络对哪个网络,然后检查Spacing矩阵里对应的值是不是设得太小。如果是BGA区域,可以单独为BGA区域设一个Region规则,放宽间距。
线宽报错:通常是Min Width设得比实际走线宽。比如你设了Min=6mil,但BGA里走了4mil。解决办法是在Physical规则里为BGA区域设一个Region,允许4mil。
等长报错:看是超长还是超短。超长的话,检查是不是绕线太多;超短的话,可能是目标长度设得太长,或者网络没走完。
差分对报错:常见的是Uncoupled Length超限。检查差分对在出BGA时是不是分开太远,或者过孔处两根线长度差太大。
4.2 规则优先级冲突
前面说过优先级是:单个网络 > Net Class > Default。但实际中还有Region规则和Room规则。Region是在PCB上画一个区域,里面的规则可以覆盖全局规则。比如BGA区域可以设一个Region,里面线宽4mil、间距4mil。
Region规则的优先级高于Net Class规则。所以如果你在BGA Region里设了4mil,但Net Class里设了6mil,BGA里会按4mil走。这个特性很有用,但也要小心:如果Region画得太大,把不该放宽的地方也放宽了,就会出问题。
4.3 规则导入导出与复用
Constraint Manager的规则可以导出成.dcf文件,下次新项目直接导入。但导入时要注意:网络名可能不一样。比如旧项目叫VCC_3V3,新项目叫3V3,导入后规则不会自动匹配。解决办法是用通配符,或者在导入后手动重新归类。
我一般会建一个“模板板”,里面把所有规则都设好,网络类也用通配符。新项目开始时,先把模板板的.brd文件复制一份,删掉里面的走线和器件,保留规则和层叠。这样比从头设规则快得多。
4.4 常见问题速查表
| 问题 | 可能原因 | 解决办法 |
|---|---|---|
| DRC报间距错误 | Spacing矩阵值太小 | 检查对应网络类的间距,BGA区域用Region放宽 |
| 线宽不够 | Min Width设太大 | 为BGA区域设Region,允许更小线宽 |
| 差分对等长超差 | 目标长度不合理 | 重新计算目标长度,或放宽Tolerance |
| 过孔不被允许 | Via List没包含该过孔 | 在Physical规则里把过孔加入对应类的Via List |
| 规则导入后不生效 | 网络名不匹配 | 用通配符重新归类,或手动调整 |
| 铜皮被DRC报错 | Same Net Spacing太小 | 增大同网络间距,或调整铜皮避让 |
| 等长绕线太多 | 目标长度设太短 | 基于最长网络重设目标长度 |
| 差分对阻抗不对 | 线宽/间距与层叠不匹配 | 用Impedance Calculator重新计算 |
5. 高效操作的几个私房技巧
5.1 用Skill脚本批量改规则
Allegro支持Skill脚本,可以批量修改规则。比如把所有PWR类的线宽从20mil改成25mil,用脚本几秒钟搞定,手动改得点半天。网上有不少现成的Skill脚本,比如批量改线宽、批量加过孔、批量设等长。我常用的一个脚本是axlDBChangeDesignRules,可以按类批量改规则。
如果你不会写Skill,也可以用Allegro自带的“Find and Replace”功能,在Constraint Manager里批量替换数值。但要注意,替换前先备份.brd文件。
5.2 实时DRC与Online DRC
Allegro的Online DRC可以在布线时实时检查规则。开启方法:在Setup → Constraints → Mode里,把Online DRC打开。这样你走线时,如果违反规则,线会变红,不用等跑完DRC才发现。
但Online DRC会拖慢布线速度,尤其是大板子。我的做法是:布局阶段关掉,布线阶段打开,最后再跑一次完整DRC。
5.3 规则模板的版本管理
规则模板也要版本管理。我一般用Git管理.dcf文件和.brd模板。每次改规则,提交一次,写清楚改了什么、为什么改。这样如果新规则导致问题,可以快速回滚。
提示:
.dcf文件是文本格式,可以用Git diff看具体改了哪些规则。比二进制文件方便得多。
5.4 与板厂沟通工艺能力
规则设得再漂亮,板厂做不出来也是白搭。发板前,把线宽、间距、过孔、层叠这些参数发给板厂确认。特别是最小线宽/间距、最小过孔、阻抗控制要求。板厂会回复他们的工艺能力,比如最小线宽4mil、最小间距4mil、最小过孔6/12mil。如果设计超出了,要么改设计,要么换板厂。
我一般会在Constraint Manager里设一个“工艺底线”规则,比如Min Width=4mil,Min Spacing=4mil。这样即使某个区域放宽了,也不会低于板厂能力。
5.5 规则检查清单
发板前,按这个清单过一遍:
- [ ] 所有电源网络是否归入PWR类,线宽是否满足载流要求
- [ ] 差分对是否设了等长、间距、阻抗
- [ ] DDR数据线是否设了等长,Tolerance是否合理
- [ ] 时钟线是否设了线宽和间距,是否包地
- [ ] BGA区域是否设了Region规则,线宽间距是否放宽
- [ ] 过孔列表是否包含所有需要的过孔类型
- [ ] Same Net Spacing是否设了,铜皮避让是否正常
- [ ] Online DRC是否跑过,有没有遗漏的报错
- [ ] 规则是否导出备份,版本是否记录
这套流程走下来,基本能避免大部分规则相关的返工。Constraint Manager刚开始用会觉得繁琐,但一旦模板建好,后面新项目就是复制粘贴的事。我现在的做法是:新项目先复制模板板,改层叠和网络名,跑一遍DRC,然后开始布局。规则的事,基本不用再操心了。