1. 差分等长线到底在解决什么问题
差分等长线这个词,刚入行的朋友听到容易发懵——差分我懂,等长我也懂,合在一起是要干嘛?说白了,差分等长线就是给一对(或多对)差分信号做"步调一致"的约束,让它们在PCB上走线的物理长度差控制在一个允许范围内,从而保证信号到达接收端时,正负两端的时序偏差小到不会把差分信号本身毁掉。
我在实际项目里踩过最典型的一个坑,是早年做一块HDMI接口的板子,TMDS差分对当时只关注了阻抗控制,忘了做对内等长。板子打回来一测,眼图糊成一团,误码率居高不下。后来用Allegro的Constraint Manager把对内长度差卡到5mil以内,问题立刻消失。那次之后我就养成了一个习惯:只要涉及差分,先问自己三个问题——对内等长做了吗?对间等长做了吗?参考平面完整吗?
Allegro 17.4在差分约束这块的工具链已经相当成熟,从原理图阶段就可以把差分对的属性带过去,到PCB阶段用Constraint Manager统一管理,整个流程是打通的。但工具好用不代表不会出错,很多新手卡在"原理图里定义了差分对,导入PCB后却找不到"这种问题上,根子往往在原理图侧的属性设置或者网表导入的环节。
这篇文章我打算把从原理图到PCB的完整链路拆开讲,包括差分对怎么在原理图里定义、Constraint Manager里哪些参数必须设、等长绕线怎么绕才不破坏阻抗、以及我这些年攒下来的一些排查经验。适合已经会用Allegro画基本板子、但对差分约束还不太有把握的朋友,也适合从Altium转过来、想搞清楚Cadence这套工具逻辑的同行。
2. 原理图阶段的差分对定义与准备
2.1 差分对属性到底在哪里设置
很多人以为差分对是在PCB里才定义的,其实更规范的做法是在原理图阶段就把差分属性带上。Allegro这套工具链里,差分对的源头信息通常来自原理图工具(Capture CIS或者HDL),通过网表传递到PCB。
在Capture CIS里,差分对的标识一般通过两种方式实现。第一种是给网络命名时用约定俗成的后缀,比如CLK_P和CLK_N、TX+和TX-,然后在PCB侧用自动识别规则去匹配。第二种是在原理图元件属性里直接添加DIFF_PAIR相关的属性字段,让网表携带明确的差分信息。
我个人的习惯是两种结合:命名规范用_P/_N后缀,同时在关键差分对的元件属性里补上差分标识。这样做的好处是,即使PCB侧自动识别规则没配好,也能通过属性字段兜底。
注意:命名后缀不要混用。我见过一个项目里有人用
_P/_N,有人用+/-,还有人用_H/_L,结果自动识别只匹配到一半,剩下的一半得手动补,非常浪费时间。项目开始前一定要统一命名规范。
2.2 网表导入前必须检查的几件事
网表导入PCB之前,有几项检查我每次都会做,这几项如果漏了,后面在PCB里排查会非常痛苦。
第一,确认差分对的网络名在原理图里是成对出现的,没有落单。落单的网络导入PCB后不会自动组成差分对,需要手动创建,麻烦且容易漏。
第二,确认差分对的引脚分配正确。有些器件的差分引脚在原理图符号里画反了,导入PCB后正负颠倒,虽然电气上可能还能工作,但等长约束的方向就乱了。
第三,确认差分对经过的串阻、串容等器件是否会影响差分属性。如果差分对中间串了电阻,网表里会变成两段网络,这时候需要在Constraint Manager里把这两段关联起来,否则等长约束只作用于其中一段。
# 在Allegro命令行里快速查看当前设计中的差分对列表 # 打开Constraint Manager后,也可以通过界面查看 # 这里给一个常用的检查思路:导出网表后在PCB里用Report功能实际操作中,我通常会在导入网表后第一时间打开Constraint Manager,看Differential Pair这一栏里有没有内容。如果空空如也,说明原理图侧的差分属性没传过来,得回头查原理图。
2.3 差分对命名规范的实际建议
命名规范这件事,看起来是小事,实际上影响整个项目的效率。我总结了一套自己常用的规则,供参考。
| 信号类型 | 推荐命名 | 不推荐命名 | 原因 |
|---|---|---|---|
| 高速差分对 | PCIE_TX0_P/PCIE_TX0_N | PCIE_TX0+/PCIE_TX0- | 后缀统一,自动识别规则好写 |
| 时钟差分对 | CLK_100M_P/CLK_100M_N | CLK100MP/CLK100MN | 分隔符清晰,避免歧义 |
| USB差分对 | USB_DP/USB_DM | USB_D+/USB_D- | 行业惯例,便于协作 |
命名里带上信号类型和序号,后期排查问题时一眼就能定位。我见过一个项目用了A1/A2这种命名,结果三个月后连原作者都忘了A1是什么信号,维护成本极高。
3. Constraint Manager里的核心参数设置
3.1 差分对内等长与对间等长的区别
这是新手最容易混淆的地方。对内等长(Intra-pair skew)指的是同一对差分信号里,正负两根线之间的长度差;对间等长(Inter-pair skew)指的是多对差分信号之间,各对之间的长度差。
对内等长的要求通常更严格。以PCIe Gen3为例,对内长度差一般要求控制在5mil以内,而对间长度差可以放宽到几十mil甚至上百mil,具体看协议要求。USB 2.0的对内要求相对宽松,但USB 3.0就严格得多。
在Constraint Manager里,这两类约束在不同的地方设置。对内等长在Differential Pair的规则里设,对间等长通常通过Match Group或者Relative Propagation Delay来设。
提示:不要把所有差分对都塞进一个Match Group里。我见过有人把USB、PCIe、HDMI的差分对全放一个组,结果约束互相打架,绕线绕到崩溃。正确的做法是按接口类型分组,每组单独设约束。
3.2 阻抗与线宽的联动计算
差分阻抗的目标值确定后,线宽和线间距是需要联动计算的。这里给一个实际的计算思路,以常见的100欧姆差分阻抗为例。
假设使用FR-4板材,介电常数约4.2,走线在表层(Microstrip结构),铜厚1oz。通过阻抗计算工具(比如Polar SI9000或者Allegro自带的阻抗计算器)可以反推出线宽和间距的组合。常见的组合是线宽5mil、间距7mil左右能达到100欧姆,但具体数值跟层叠结构强相关。
| 层叠位置 | 目标阻抗 | 参考线宽 | 参考间距 | 备注 |
|---|---|---|---|---|
| 表层Microstrip | 100欧姆 | 5mil | 7mil | 需结合具体板厂能力 |
| 内层Stripline | 100欧姆 | 4.5mil | 8mil | 上下都有参考平面 |
| 表层Microstrip | 90欧姆 | 6mil | 6mil | USB常见 |
这些数值不是拍脑袋定的,必须让板厂提供他们的层叠结构和阻抗计算报告,然后把这些参数填进Constraint Manager的Impedance规则里。我吃过一次亏,自己算的线宽和板厂实际能做的有偏差,板子回来阻抗偏了十几欧姆,眼图直接不达标。
3.3 约束优先级与冲突处理
Constraint Manager里的约束是有优先级的。当全局规则和特定规则冲突时,特定规则优先。这个机制很有用,但也容易埋坑。
举个例子,你设了一个全局的差分对内等长规则是10mil,然后给PCIe的差分对单独设了5mil。这时候PCIe的差分对会遵循5mil,其他差分对遵循10mil,没问题。但如果你后来又给某个网络类设了一个更严格的规则,而那个网络类里恰好包含了PCIe的差分对,就可能出现规则覆盖的混乱。
我的做法是:全局规则设得宽松一些作为兜底,然后对每个接口类型单独建规则集,明确指定适用范围。每次改完规则后,用Constraint Manager的Check功能跑一遍,看有没有冲突或者未覆盖的网络。
# 在Allegro中查看当前约束的优先级 # 通过Constraint Manager的Worksheet界面 # 选择Objects -> 查看具体网络的约束来源3.4 差分对创建后的验证步骤
差分对在Constraint Manager里创建或自动识别之后,不要急着开始布线,先做几项验证。
第一,确认差分对的极性正确。在PCB里选中差分对,看正负标识是否和原理图一致。极性反了会导致等长绕线方向错误。
第二,确认差分对的引脚对正确。有些器件的差分引脚在封装里定义了两个可选的引脚对,如果选错了,等长约束会作用在错误的引脚上。
第三,确认差分对经过的过孔、串阻等是否被正确纳入约束范围。如果差分对中间有器件,需要确认约束是否跨越了这些器件。
我通常会在布线前用Allegro的Show Element功能逐个检查关键差分对的属性,确认无误后再开始。这个习惯帮我避免了好几次返工。
4. PCB布局布线中的差分等长实操
4.1 差分对布线的起始策略
差分对布线不是拿起鼠标就画,起始点的选择很关键。我的习惯是从接收端或者发送端中引脚排列更密集的那一端开始,因为密集端的扇出空间有限,先把难的部分处理好,后面就有调整余地。
以BGA封装的器件为例,差分对从BGA球栅阵列里扇出时,往往需要打过孔换层。这时候要注意过孔的位置和数量。同一对差分信号的两个过孔应该尽量靠近,且到过孔的距离要一致,否则会引入额外的长度差。
注意:差分对换层时,两个过孔最好在同一个参考平面上,且过孔周围的参考平面要完整。如果参考平面被分割,差分信号的返回路径会被破坏,阻抗不连续,信号质量会明显下降。
从BGA扇出后,差分对进入布线通道。这时候要规划好走线方向,尽量避免频繁换层。每换一次层,就多一次过孔带来的长度差和阻抗不连续。
4.2 等长绕线的具体手法与禁忌
等长绕线是差分等长线实战里最考验手艺的环节。绕线的目的是补偿长度差,但绕得不好反而会引入新的问题。
常见的绕线手法有几种。第一种是蛇形绕线(Serpentine),在较短的那根线上绕出S形或者锯齿形来增加长度。第二种是波浪形绕线,弧度更平缓,对阻抗的影响更小。第三种是螺旋绕线,在空间受限时使用,但对阻抗影响较大。
我个人的经验是优先用波浪形,其次用蛇形,螺旋形尽量不用。波浪形的弧度平缓,阻抗变化小,对信号完整性的影响最小。
绕线时有几个禁忌必须遵守。第一,绕线的幅度不要太小,相邻绕线之间的间距至少要保持3倍线宽以上,否则会产生串扰。第二,绕线不要靠近差分对的另一根线,否则会破坏差分对的耦合。第三,绕线不要在参考平面不完整的地方进行,否则阻抗会失控。
| 绕线手法 | 阻抗影响 | 空间占用 | 推荐场景 |
|---|---|---|---|
| 波浪形 | 小 | 中 | 大多数场景首选 |
| 蛇形 | 中 | 小 | 空间受限时 |
| 螺旋形 | 大 | 最小 | 极端空间受限,慎用 |
4.3 过孔与换层对等长的影响
过孔对差分等长的影响经常被低估。一个过孔在电气上会引入额外的长度,这个长度跟过孔的深度(也就是板厚和层叠位置)有关。如果差分对的两根线换层时经过的过孔深度不同,就会引入额外的长度差。
更隐蔽的问题是,过孔在PCB里占据的物理长度和电气长度不是一回事。物理上过孔可能只有几十mil深,但电气上它引入的延迟可能相当于更长的一段走线。在Allegro里,可以通过设置过孔的Z-axis delay来让工具把过孔的电气长度纳入等长计算。
我的做法是:在Constraint Manager里启用Z-axis delay,并确保过孔模型正确。这样工具在计算长度差时会把过孔的影响算进去,绕线时就不用自己手动补偿了。
提示:如果板子比较厚(比如16层以上),过孔的电气长度影响会很明显。我做过一块20层的板子,差分对换层两次,过孔引入的长度差就有十几mil,如果不处理,对内等长根本没法达标。
4.4 实时等长监控与动态调整
Allegro 17.4提供了实时等长监控的功能。在布线过程中,工具会实时显示当前差分对的长度差,并在超过约束时给出提示。这个功能非常实用,可以避免布完线才发现等长不达标、然后大改的情况。
我通常会在布线时打开这个功能,边布边看。如果发现长度差快接近上限了,就及时调整绕线策略,而不是等到最后再补救。
动态调整的时候,优先调整绕线的幅度和密度,而不是改变走线路径。改变路径可能会影响其他约束,比如阻抗、串扰等。绕线幅度和密度的调整相对独立,影响范围小。
另外,Allegro的Delay Tune功能可以自动帮你绕线到目标长度。这个功能好用,但不能完全依赖。自动绕线出来的形状有时候不够优化,可能需要手动微调。我的习惯是先用自动绕线打个底,然后手动优化关键部分。
5. 常见问题排查与避坑经验
5.1 差分对在PCB里找不到怎么办
这是新手最常遇到的问题。原理图里明明定义了差分对,导入PCB后Constraint Manager里却空空如也。排查思路如下。
第一步,检查网表是否包含了差分属性。在原理图工具里导出网表时,确认差分属性字段被包含。有些导出设置会过滤掉自定义属性,导致差分信息丢失。
第二步,检查PCB侧的差分识别规则。Allegro里有一套自动识别差分对的规则,基于网络名的模式匹配。如果命名不符合规则,就不会被自动识别。可以在Constraint Manager里手动创建差分对,或者修改识别规则。
第三步,检查网络是否被正确导入。有时候网表导入时部分网络丢失,差分对自然也就不存在了。用Allegro的Report功能查看网络列表,确认差分网络都在。
| 问题现象 | 可能原因 | 排查方法 |
|---|---|---|
| Constraint Manager里无差分对 | 网表未携带差分属性 | 检查原理图导出设置 |
| 部分差分对缺失 | 命名不符合识别规则 | 检查命名规范或手动创建 |
| 差分对存在但约束不生效 | 约束未正确关联 | 检查约束的适用范围 |
5.2 等长绕线后阻抗不达标怎么排查
绕线后阻抗不达标,通常有几个原因。第一,绕线太密,相邻走线之间的耦合改变了等效阻抗。第二,绕线区域的参考平面不完整,返回路径受阻。第三,绕线改变了线宽或者间距,导致阻抗偏离目标。
排查的时候,先用Allegro的阻抗检查功能看哪些区域阻抗异常。然后对照绕线形状,看是不是绕线太密或者太靠近其他网络。如果是参考平面的问题,检查绕线区域下方的平面是否有分割或者挖空。
解决方法是调整绕线形状,增大绕线间距,或者换一个参考平面完整的区域绕线。如果空间实在不够,可以考虑换层绕线,但要注意过孔的影响。
5.3 对间等长与对内等长的冲突处理
有时候对内等长和对间等长的要求会冲突。比如某一对差分信号为了满足对内等长,绕了很多线,导致这一对的总长度比其他对长很多,对间等长就不达标了。
处理这种冲突,我的思路是优先保证对内等长,因为对内等长对信号质量的影响更直接。对间等长可以通过调整其他差分对的长度来补偿,或者在协议允许的范围内放宽对间等长的要求。
如果对间等长的要求也很严格,那就需要在布局阶段就规划好各对差分信号的走线路径,尽量让它们的自然长度接近,减少后期绕线的压力。布局阶段多花十分钟,布线阶段可能省一小时。
5.4 我踩过的几个典型坑
第一个坑是忽略了串阻对差分属性的影响。有个项目里差分对中间串了共模电感,网表里变成了两段网络,Constraint Manager里只识别到其中一段,另一段没约束。结果布完线发现两段的长度差很大,等长完全不达标。后来在Constraint Manager里手动把两段关联起来才解决。
第二个坑是过孔模型没设对。有次做一块厚板,过孔的电气长度没纳入计算,绕线时看着长度差达标了,实际打样回来一测,眼图还是不达标。后来把过孔模型补上,重新绕线才通过。
第三个坑是绕线太靠近板边。板边的参考平面往往不完整,绕线经过那里阻抗会突变。我有一次把差分对的绕线绕到了板边附近,结果那一段的阻抗偏了二十多欧姆。后来把绕线往板内移了移,问题解决。
提示:板边至少留出3倍线宽以上的禁布区,差分对绕线尤其要注意这一点。板边的参考平面不完整是隐形的阻抗杀手。
6. 从约束设置到打样交付的完整检查清单
6.1 布线完成后的自检项目
布线完成后,不要急着出Gerber。先做一轮自检,确认所有约束都满足。
第一,用Constraint Manager的Check功能跑一遍,看有没有违反约束的网络。第二,用Allegro的Report功能导出差分对的长度报告,逐个核对对内和对间的长度差。第三,用阻抗检查功能确认关键差分对的阻抗在允许范围内。第四,检查差分对经过的过孔、串阻等是否都被正确纳入约束。
我通常会把这几项做成一个检查表,每次出板前逐项打勾。这个习惯帮我避免了好几次因为疏忽导致的返工。
6.2 出Gerber前的最终确认
出Gerber前,还有几项确认要做。第一,确认层叠结构和板厂的能力匹配,特别是阻抗控制的部分。第二,确认差分对的约束在Gerber里被正确体现,比如绕线的形状、过孔的位置等。第三,确认板厂的阻抗计算报告和你的设计目标一致。
如果板厂反馈某些阻抗做不到,不要硬扛,及时调整设计。我见过有人坚持自己的设计,结果板厂做出来的阻抗偏差很大,板子直接报废。和板厂沟通清楚,比事后返工划算得多。
6.3 打样回来后的验证思路
板子打样回来,先别急着上电。用万用表或者飞针测试确认差分对的连通性,没有短路或者断路。然后用TDR(时域反射计)测一下差分对的阻抗,看是否和设计目标一致。如果条件允许,用示波器或者误码仪测一下眼图,确认信号质量达标。
如果发现阻抗或者眼图不达标,对照设计文件和实测结果排查。常见的原因包括绕线太密、参考平面不完整、过孔模型不准等。根据排查结果调整设计,重新打样。
我个人在实际操作中的体会是,差分等长线这件事,工具只是辅助,核心还是对信号完整性的理解。知道为什么要等长、等长不好会怎样,比会操作工具更重要。工具用熟了自然就会,但理解不到位,工具用得再溜也做不出好板子。
最后再分享一个小技巧:在Constraint Manager里给关键差分对设一个稍微严格一点的约束,比如要求5mil,实际按3mil去绕。这样即使有误差,最终结果也在允许范围内。这个"留余量"的习惯,在高速设计里非常实用。