1. 差分对等长检查到底在查什么
1.1 从信号完整性说起:为什么差分对必须等长
差分信号传输的核心逻辑,是依靠两条走线之间的电压差来传递信息。接收端只关心正负两条线之间的差值,理论上任何同时叠加在两条线上的噪声都会被抵消掉。这个机制成立的前提是:两条线收到的噪声尽可能一致,信号到达接收端的时间尽可能一致。
一旦正负两条走线的长度出现明显偏差,信号到达接收端的时间就会错开。错开的那部分时间里,差分电压不再是一个干净的眼图,而是出现台阶、振铃甚至误判。对于高速信号来说,几毫米的长度差在时域上就是几个皮秒到几十个皮秒的偏斜,速率越高,容忍度越低。
我在实际项目中遇到过最典型的情况:一组PCIe差分对,正线比负线长了大约8mil,眼图测试时眼高直接掉了将近20%。后来把长度补齐,眼图立刻恢复。这个教训让我在后续所有项目里,都把差分对组内等长检查当成布线收尾阶段的必做动作,而不是可做可不做的选项。
1.2 组内等长和组间等长的区别
很多人容易把这两个概念混在一起。组内等长指的是同一对差分信号内部,正线和负线之间的长度匹配;组间等长指的是多组差分对之间,比如DDR的DQS和DQ之间、多通道SerDes的lane与lane之间的长度匹配。
组内等长的容忍度通常非常小,一般在5mil以内,有些高速接口甚至要求2mil以内。组间等长的容忍度相对宽松一些,根据接口协议不同,可能在50mil到200mil之间。Allegro的约束管理器对这两类等长有不同的约束类型,检查方法也不完全一样。
这篇文章主要聚焦组内等长,也就是差分对正负两条线之间的长度偏差检查。这是最基础、最高频、也最容易出问题的环节。
1.3 Allegro 17.4在等长检查上的能力边界
Allegro 17.4的约束管理器提供了相当完整的差分对长度检查功能。它能够实时显示差分对的长度信息,能够在布线过程中给出动态反馈,也能够在布线完成后生成详细的检查报告。
但它不是万能的。约束管理器只能告诉你“当前长度是多少”“偏差是多少”,它不会自动帮你修线。定位到偏差之后,怎么调整、调整哪一段、调整多少,仍然需要工程师自己判断。另外,约束管理器的长度数据依赖于正确的约束设置和正确的差分对定义,如果前期设置有问题,后面查出来的数据就是错的。
所以整个流程的关键不在于“会不会点那个按钮”,而在于理解数据是怎么来的、怎么判断数据是否可信、以及发现问题后怎么高效处理。
2. 检查前的准备工作:约束设置与差分对定义
2.1 差分对定义的正确姿势
在Allegro里做等长检查,第一步永远是确认差分对有没有被正确定义。我见过太多案例,工程师在约束管理器里查了半天长度,结果发现差分对根本没配对,或者配错了。
定义差分对有两种常见方式。一种是在原理图阶段就通过命名规则自动识别,比如正线命名为TX_P、负线命名为TX_N,导入网表时Allegro会自动配对。另一种是在PCB Editor里手动创建,通过Logic菜单下的Assign Differential Pair功能,手动指定哪两条网络是一对。
手动创建时有一个细节容易被忽略:差分对的命名。Allegro允许你给差分对起一个逻辑名称,这个名称会出现在约束管理器里。建议命名时带上接口类型和通道编号,比如PCIE_TX0、PCIE_RX0,这样后面查长度时一眼就能定位到具体是哪一组。
注意:如果差分对是在PCB阶段手动创建的,一定要确认创建后网络属性里的DiffPair信息已经更新。有时候创建完没有刷新,约束管理器里看不到新配对的差分对。
2.2 约束管理器里的差分对约束设置
差分对定义好之后,打开Constraint Manager,在Physical规则或者Spacing规则里找到对应的差分对。Allegro 17.4的约束管理器左侧是规则树,右侧是具体的参数表格。
需要关注的核心参数有两个:一个是Target Length,也就是目标长度;另一个是Tolerance,也就是允许的偏差范围。对于组内等长,通常不需要单独设置Target Length,因为正负两条线本身就是互相参考的。但Tolerance必须设置,否则约束管理器不会给出偏差警告。
设置Tolerance时,我一般会根据信号速率来定。低速信号可以放宽到10mil,高速信号建议控制在5mil以内,超高速信号比如25G以上,最好控制在2mil以内。这个值不是拍脑袋定的,而是根据信号在PCB上的传播速度换算出来的。以常见的FR4板材为例,信号传播速度大约是每纳秒6英寸,换算下来1mil大约对应0.17皮秒。如果接口允许的偏斜是10皮秒,那么长度偏差就应该控制在60mil以内,留一半余量就是30mil。
2.3 层叠与传播延迟对长度数据的影响
这里有一个很多人踩过的坑:Allegro约束管理器里显示的长度,是物理长度还是电气长度?
答案是:默认显示的是物理长度,也就是走线在PCB上的实际几何长度。但真正影响信号到达时间的,是电气长度,也就是传播延迟。如果正负两条线走在不同的层上,即使物理长度完全一样,电气长度也可能不同,因为不同层的介质厚度和介电常数不一样。
Allegro 17.4的约束管理器支持显示电气长度,但需要提前在Cross Section里正确设置每一层的叠层参数。如果叠层设置不准确,电气长度数据就不可信。
我的建议是:对于组内等长要求严格的差分对,尽量让正负两条线走在同一层。如果因为布线空间限制必须换层,换层时要确保两条线同时换到同一层,并且换层过孔的延迟也要考虑进去。一个过孔的延迟大约在0.1到0.2皮秒之间,对于超高速信号来说,这个量级已经不能忽略了。
3. 三种方法快速定位长度偏差
3.1 方法一:约束管理器直接查看法
这是最直接的方法,适合在布线完成后做整体检查。
打开Constraint Manager,切换到Differential Pair模式,在右侧表格里找到Length这一列。Allegro会分别显示正线和负线的长度,以及两者的差值。如果差值超过了之前设置的Tolerance,这一行会变成红色或者黄色,一眼就能看出来。
这个方法的优点是快,所有差分对的长度信息集中在一个表格里,可以排序、可以筛选。我通常会把表格按偏差值从大到小排序,优先处理偏差最大的那几组。
缺点是信息比较粗,只能看到总长度,看不到具体是哪一段走线导致了偏差。如果一组差分对走了很长的路径,中间经过了多个区域,光看总长度很难判断问题出在哪里。
实操心得:在约束管理器里查看长度时,建议同时打开Electrical Length和Physical Length两列。如果两者差异很大,说明正负两条线走在不同层上,需要进一步检查叠层设置。
3.2 方法二:PCB Editor内实时测量法
这个方法适合在布线过程中或者布线刚完成时,针对某一组具体的差分对做精细检查。
在PCB Editor里,选中差分对的正线或者负线,右键选择Show Element,会弹出一个信息窗口,里面包含这条线的总长度、分段长度、过孔数量等信息。分别查看正线和负线,手动计算差值。
更高效的方式是使用Allegro的Delay Tuning功能。在Route菜单下找到Delay Tuning,选中差分对后,Allegro会以图形化的方式显示当前长度与目标长度的偏差。偏差部分会用不同的颜色标注出来,非常直观。
这个方法的优点是精度高,可以看到每一段走线的长度。缺点是操作比较繁琐,一组一组查效率不高,适合在约束管理器里发现异常后,针对性地深入排查。
3.3 方法三:Skill脚本批量检查法
如果板子上有几百组差分对,手动一组一组查是不现实的。这时候就需要用到Skill脚本。
Allegro支持Skill语言进行二次开发,可以编写脚本自动遍历所有差分对,提取长度信息,计算偏差,并输出成表格。网上有不少现成的Skill脚本可以下载,也可以根据自己的需求定制。
一个典型的Skill脚本逻辑是这样的:先获取所有差分对的列表,然后遍历每一组,分别获取正线和负线的长度,计算差值,如果差值超过阈值就记录下来,最后输出一个报告文件。
这个方法的优点是效率极高,几百组差分对几秒钟就能查完。缺点是需要一定的Skill编程基础,而且脚本的准确性依赖于差分对定义和约束设置的正确性。
我个人的习惯是:项目初期用约束管理器做整体扫描,发现异常后用PCB Editor精确定位,项目收尾阶段用Skill脚本做最终批量确认。三种方法配合使用,基本不会漏掉任何一组有问题的差分对。
4. 长度偏差的常见原因与调整策略
4.1 偏差来源一:布线路径不对称
这是最常见的原因。正线和负线虽然是一对,但在实际布线时,由于周围有其他的走线、过孔、焊盘等障碍物,两条线的路径很难做到完全对称。一条线可能需要绕一个弯,另一条线走直线,长度差就出来了。
解决方法是使用Allegro的蛇形绕线功能,在较短的那条线上增加绕线,把长度补回来。绕线时要注意几个参数:绕线幅度、绕线间距、绕线角度。幅度太小起不到补偿作用,幅度太大占用布线空间;间距太小会导致线间耦合,影响阻抗;角度一般用45度或者圆弧,避免90度直角。
4.2 偏差来源二:过孔数量不一致
如果正线打了两个过孔,负线只打了一个,长度差就会很明显。一个过孔的高度大约等于板厚,对于1.6mm的板子来说,一个过孔就是63mil左右的长度。两个过孔和一個过孔之间就差了一个板厚。
解决方法是尽量让正负两条线的过孔数量保持一致。如果因为布线层限制必须打不同数量的过孔,那就要在较短的那条线上用绕线补偿回来。
4.3 偏差来源三:引脚内部长度差异
这个原因比较隐蔽,很多人会忽略。芯片引脚内部到Die之间的键合线长度是不一样的,有些芯片的Datasheet会给出引脚延迟参数,有些则不会。如果芯片引脚本身就有延迟差异,那么即使PCB上的走线完全等长,实际到达Die的信号仍然有偏斜。
对于这种情况,只能在PCB走线上做预补偿。如果Datasheet给出了引脚延迟差异,就按照差异值换算成PCB长度,在走线上提前补掉。如果Datasheet没有给出,那就只能通过实测来确定。
4.4 调整策略:先粗调后精调
发现偏差后,不要一上来就精细调整。我的习惯是分两步走:先粗调,把偏差从几十mil降到几mil;再精调,把偏差控制在1mil以内。
粗调时可以用大幅度的绕线,快速把长度补上来。精调时用小幅度、密集的绕线,慢慢逼近目标值。Allegro的Delay Tuning功能支持实时显示当前偏差,调整时可以一边绕线一边看数据,非常方便。
注意:绕线会增加走线的寄生电容和寄生电感,对阻抗有影响。绕线完成后,建议用Allegro的阻抗检查功能确认一下阻抗是否还在允许范围内。
5. 实操全流程:从检查到修复的完整记录
5.1 项目背景与检查目标
前段时间做了一块通信板,板上有16组PCIe Gen3差分对,速率8Gbps。根据协议要求,组内等长偏差需要控制在5mil以内。板子布线完成后,我按照下面的流程做了一次完整的等长检查。
5.2 第一步:约束管理器整体扫描
打开Constraint Manager,切换到Differential Pair模式,按Length差值排序。16组差分对里,有3组偏差超过了5mil,最大的一组偏差到了12mil。另外还有2组偏差在3到5mil之间,属于临界状态。
把偏差最大的3组标记出来,分别是PCIE_TX2、PCIE_RX5和PCIE_TX7。接下来针对这3组做精细检查。
5.3 第二步:PCB Editor精确定位
以PCIE_TX2为例,在PCB Editor里选中这组差分对,使用Show Element查看正线和负线的分段长度。发现正线在BGA出线区域比负线多绕了一个弯,多出了大约8mil。另外正线比负线多打了一个过孔,又多了大约4mil。两处加起来正好是12mil的偏差。
PCIE_RX5的情况类似,主要偏差来自过孔数量不一致。PCIE_TX7的偏差则主要来自绕线路径不对称。
5.4 第三步:针对性修复
对于PCIE_TX2,过孔数量不一致的问题没法改,因为BGA出线层是固定的。只能在负线上做绕线补偿。在负线的空闲区域增加了一段蛇形绕线,幅度15mil,间距20mil,绕了3段,补回了大约12mil的长度。
对于PCIE_RX5,同样用绕线补偿。这组差分对的布线空间比较紧张,绕线幅度只能做到10mil,绕了5段才补够。
对于PCIE_TX7,偏差较小,只在负线上加了两段小幅绕线就解决了。
5.5 第四步:修复后复检
三组都调整完成后,重新打开Constraint Manager查看长度数据。PCIE_TX2的偏差从12mil降到了1.2mil,PCIE_RX5从9mil降到了0.8mil,PCIE_TX7从7mil降到了0.5mil。全部满足5mil以内的要求。
最后用Skill脚本做了一次全板批量检查,确认所有16组差分对的组内偏差都在允许范围内。
6. 常见问题与排查技巧实录
6.1 约束管理器里看不到差分对怎么办
这是最高频的问题。原因通常有三个:一是差分对没有正确定义,二是约束管理器的规则没有应用到对应的网络,三是软件显示设置的问题。
排查顺序:先在PCB Editor里用Logic菜单下的Assign Differential Pair确认差分对是否存在;然后检查Constraint Manager的规则是否已经启用;最后检查Display选项里Differential Pair的显示是否打开。
6.2 长度数据明显不对怎么办
如果约束管理器里显示的长度和实际走线长度对不上,大概率是叠层设置有问题。检查Cross Section里的层数、厚度、介电常数是否和实际板厂提供的参数一致。另外,如果走线经过了不同的层,电气长度和物理长度会有差异,需要确认当前显示的是哪一种。
6.3 绕线后阻抗变了怎么办
绕线会增加走线的寄生参数,导致阻抗下降。如果绕线后阻抗超出了允许范围,可以适当增大绕线间距,减少线间耦合。另外,绕线尽量走在阻抗控制区域之外,避免影响关键信号。
6.4 差分对数量太多,检查效率太低怎么办
用Skill脚本。网上有很多开源的差分对检查脚本,下载后根据自己项目的需求稍作修改就能用。如果不想用脚本,也可以在Constraint Manager里用Filter功能,只显示偏差超过阈值的差分对,减少人工筛查的工作量。
| 问题现象 | 可能原因 | 排查方法 | 解决措施 |
|---|---|---|---|
| 约束管理器看不到差分对 | 差分对未定义或规则未启用 | 检查Assign Differential Pair和规则状态 | 重新定义差分对,启用对应规则 |
| 长度数据异常 | 叠层设置错误或显示模式不对 | 检查Cross Section参数和显示设置 | 修正叠层参数,切换显示模式 |
| 绕线后阻抗超标 | 绕线间距过小导致耦合增强 | 用阻抗检查功能确认 | 增大绕线间距,调整绕线位置 |
| 检查效率低 | 差分对数量多,手动排查慢 | 评估是否可用脚本 | 编写或下载Skill脚本批量检查 |
6.5 一个容易被忽略的细节:测试点的长度影响
如果差分对上挂了测试点,测试点的走线分支也会计入总长度。有时候正线和负线的测试点分支长度不一样,就会引入额外的偏差。检查时要把测试点分支的长度也考虑进去,或者在约束管理器里把测试点分支排除掉。
7. 我个人的实操体会
差分对组内等长检查这件事,说难不难,说简单也不简单。工具本身提供了足够的能力,关键在于工程师对数据的判断和对细节的把控。
我踩过最大的一个坑,是在一个项目里完全依赖约束管理器的数据,没有去检查叠层设置。结果约束管理器显示所有差分对都等长,但实际测试时眼图就是不对。后来发现是叠层参数填错了,电气长度算出来是错的。从那以后,我每次做等长检查之前,都会先花五分钟确认叠层设置和差分对定义,这五分钟能省掉后面几个小时的返工。
另一个体会是:等长检查不要等到布线全部完成才做。最好在布线过程中就实时关注,Allegro的Delay Tuning功能可以在布线时实时显示偏差,边布边调,效率比布完再改高得多。
最后分享一个小技巧:如果一组差分对的偏差怎么调都调不下来,不妨检查一下是不是有隐藏的走线片段没有被统计进去。Allegro有时候会把一些很短的走线片段忽略掉,但这些片段累加起来也可能造成明显的偏差。用Show Element逐段查看,往往能找到问题。