
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_NPCIE_TX0/PCIE_TX0-后缀统一自动识别规则好写时钟差分对CLK_100M_P/CLK_100M_NCLK100MP/CLK100MN分隔符清晰避免歧义USB差分对USB_DP/USB_DMUSB_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欧姆但具体数值跟层叠结构强相关。层叠位置目标阻抗参考线宽参考间距备注表层Microstrip100欧姆5mil7mil需结合具体板厂能力内层Stripline100欧姆4.5mil8mil上下都有参考平面表层Microstrip90欧姆6mil6milUSB常见这些数值不是拍脑袋定的必须让板厂提供他们的层叠结构和阻抗计算报告然后把这些参数填进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去绕。这样即使有误差最终结果也在允许范围内。这个留余量的习惯在高速设计里非常实用。