1. 为什么差分等长是高速板的“生死线”:先理解再动手
先说一个我自己踩过的教训。去年做了一块带USB 3.0接口的板子,TX/RX差分对原理图是标准的,走线也按3W原则处理了,预审DRC全绿。结果上测试机,USB 3.0直接降级成USB 2.0,再查眼图,RX眼高只有规范值的六成。最后定位到的根因,就是差分对内P/N两根线差了70多mil——不是没规则,是规则里只设置了线宽线距,压根没设置相位容差。Allegro 16.6到现在还是很多公司的主力版本,打开Constraint Manager(CM)满屏数字让人发怵,于是不少人干脆跳过差分等长配置,只当普通单端板画。这篇文章就把差分等长从规则创建、参数配置、绕线操作到最终DRC验证完整走一遍,全部按16.6界面的实际路径来写,你对着自己的软件窗口一步步找就能对上。
1.1 差分信号的工作原理:两个信号不是“互为备份”
差分信号的本质是两根网络上的电压互补变化,接收端真正关心的是两个信号的差值。也就是说,P和N两根线必须基本同时到达接收端,差值的幅度和时序才正确。如果一根长一根短,到达时间有先有后,接收端采到的差分电压就不是完整的摆幅,相位上也会出现偏移。表现出来就是眼图变小、抖动增加、误码率上升。
这里最容易犯的认知错误,是把两根线当成两条独立的单端线来布。实际上,在整个传输路径上P和N都要严格耦合:同一层、相邻走线、连续性尽量一致。等长不只是最终长度数字相等,而是等时。在FR4板材上,走线延迟大约150~170ps/inch,表层和内层因为介电常数不同,延迟也会有细微差别。跨层换过孔也一样,两个过孔的残桩都会贡献时延。所以“长度一样”不等于“延迟一样”,这正是Allegro里既有长度类约束、又有时间类约束的原因。
1.2 对内不等长会带来什么:从共模噪声到眼图塌陷
对内不等长的危害是具体的,不是“指标不好看”这种虚的问题。
第一是共模噪声变大。P和N到达接收端有时间差,接收端的共模抑制能力是有限的,没抵消掉的部分就变成共模电流,沿着线缆或板边辐射出去,EMI测试直接超标。很多板子辐射骚扰过不了,查到最后就是某对差分线在里面偷偷差了十几mil。
第二是接收端时序裕量下降。USB、PCIe、HDMI这类高速信号,本来眼图的闭合容忍度就小,几ps的skew就可能吃掉大量裕量。等长做得越差,时序裕量越小,板子的温度一上来、电压一波动,误码率飙升。
第三是抗干扰能力变弱。P/N走线距离拉大之后,耦合变弱,差分信号对外部干扰的共模抑制能力也跟着下降。也就是说,等长不仅是“长度”问题,它直接决定了一对差分线是不是还“差分”。
1.3 一个实际经验值:把协议的ps要求换算成mil
很多人在CM里填相位容差是拍脑袋的,填5mil还是50mil全看心情。实际上这个值应该由协议的时间预算换算过来。
经验算法:FR4表层层叠下,走线延迟约6ps/mm,也就是150~170ps/inch。假设某协议要求对内skew不超过10ps,那么走线长度差要控制在10ps÷6ps/mm≈1.67mm,折合约65mil。反过来,如果你在规则里填了5mil,那相当于只允许不到1ps的时间差,对大多数协议来说都过于激进,绕线时会被DRC逼疯。
所以正确的顺序是:先查协议或芯片手册里的对内skew要求,换算成mil,再填到CM里。填完相位容差之后,还要考虑总长度预算。高速协议除了对内skew有限制,通常还会对整个链路的飞行时间有窗口要求,这就要配合Min/Max Delay来约束。记住一句话:相位容差管“两根线差多少”,Min/Max管“这一对线走多长”。
2. 16.6版本规则配置前的基础:差分对的创建与规则体系
2.1 先用Logic菜单把P/N网络“绑定”成真正的差分对
Allegro 16.6里,差分对并不是把两根网络命名成P/N就能自动识别的。新建或导入的PCB中,必须先在PCB Editor里执行Logic -> Assign Differential Pair,在对话框里分别选择P网络和N网络,点Assign,才能把它们绑定成一个差分对。绑定完成之后,CM里才能看到这个差分对,也才能针对它设置等长规则。
如果你在原理图Capture里已经标记了差分对属性(比如DIFFP_NET_PROP),导网表时Allegro会自动带入,PCB里可以不用再设。但不少人是拿别的EDA转过来的,差分对属性没带过去,PCB里就必须手动Assign。手动绑定之后记得重新看一眼CM里的Differential Pair工作表,确认状态不是Not Assigned。这一步漏了,后面所有等长规则都是空中楼阁。
2.2 CM里三大规则体系的职责划分
CM的入口在Setup -> Constraints -> Constraint Manager。16.6的CM把规则分成三大块:Electrical(电气规则)、Physical(物理规则)、Spacing(间距规则)。
等长这件事,看着只在Electrical里填,实际上如果Physical里没告诉Allegro这个差分对的线宽和主间距,绕线工具根本不知道怎么把它布成正常的差分对。我自己的习惯是这样分工的:
- Electrical规则负责“走多准”:相位容差、最小/最大延迟、Pin Pair的相对延迟。
- Physical规则负责“走多粗”:线宽、主间距、颈缩线宽、颈缩间距。
- Spacing规则负责“离别人多远”:差分对整体与其他网络的安全间距。
三套规则分别建三个CSet,命名做到一眼能看懂,比如DIFF100_ELE、DIFF100_PHY、DIFF100_SPC。这样后期查规则、改规则、导出报表,都比在一堆默认名字里翻来翻去省事得多。
2.3 16.6里Diff Pair CSet与其他CSet的关联逻辑
在CM里选中一个差分对网络,右键查看属性,能看到Electrical CSet、Physical CSet、Spacing CSet三个属性值。Allegro 16.6的差分对约束是分散在两处的:相位容差、延迟这类挂在Electrical CSet的Differential Pair页签下;线宽、Gap这类挂在Physical CSet的Differential Pair页签下。
也就是说,你只在Electrical里建了规则,却没给网络指派Physical CSet,布出来的线可能还是普通单端线宽,P/N间距也对不上。很多人说“我设置了差分规则,怎么走线出来还是乱的”,十有八九是Physical CSet没指派。三套CSet要配套使用,少一个都会出幺蛾子。
3. 差分等长规则参数逐项拆解:别让CM窗口变天书
3.1 Phase Tolerance与Min/Max Delay到底控制什么
在16.6的CM里,Electrical CSet下面有个Differential Pair工作表,最常用的两列是Phase Tolerance和Min/Max Delay。
Phase Tolerance是Allegro对“等长”最核心的判据,它只比较同一个差分对内两根网络从起点到终点的传播延迟差。单位可以是mil,也可以是ps,取决于当前设计单位和你的层叠。它解决的是“P和N长短是否一致”的问题,相当于对内skew约束。
Min/Max Delay解决的是“这一对信号整体别太长、别太短”的问题。有些差分对信号在总线的读/写时序里有明确的飞行时间窗口,不只要求P/N相等,还要求整对信号落在某个延迟范围内。如果只做Phase Tolerance,两根线确实一样长,但整对长了300mil,照样会因为时序超差而挂。所以16.6里这两组参数是配合使用的:先用Phase Tolerance卡对内差,再用Min/Max Delay卡绝对长度。
3.2 线宽、线距、颈缩参数和等长绕线的关系
Physical CSet -> Differential Pair里的参数,看着与等长无关,实际上关联很大。主间距(Primary Gap)决定差分对的耦合强度,线宽(Line Width)决定单端阻抗,两者的比值共同决定差分阻抗。绕线时,Allegro会按照Primary Gap的值来维持P/N耦合,如果这个值设置得太宽,自动生成的绕线形状也会变宽;设置得太窄,绕线的间距限制又太紧。
16.6里还有一组Neck参数(颈缩线宽/颈缩间距),专门用于BGA出线或连接器密脚区。这些区域往往是等长绕线的起点和终点,最容易出现P/N长度差。很多人在空旷区域绕得漂漂亮亮,一到密脚区就破功,原因就是Neck参数没设置好,或者根本没进入颈缩状态,导致出线区域P/N长度不一致,最后整体等长还是不合格。
3.3 Pin Pair和相对延迟:理解Allegro测量的“参考端点”
Allegro的延迟测量不是拿整根网络的总长度来算的,而是按Pin Pair。一个差分对从连接器到接收IC,中间如果经过两个连接器或一组过孔,会被拆成多个Pin Pair。要做等长,必须搞清楚Pin Pair的范围和参考点到底在哪。
在CM里,Differential Pair工作表展示的延迟数据就是针对特定Pin Pair的。默认情况下,Allegro会自动为网络上的器件引脚建Pin Pair,但如果你要约束的是“连接器引脚到BGA引脚”这一段,建议手动创建或修改Pin Pair,并确认两根网络使用相同的参考端点。否则会出现一个很诡异的情况:两根线明明差不多长,Phase Tolerance却一直报红——因为两边测量的端点不对称,工具认为你还没等长。这个坑最隐蔽,因为它与布线质量无关,纯粹是规则参考没对齐。
4. 从创建规则到DRC验证:16.6完整操作流程
4.1 第一步:建立Electrical CSet并填入差分等长参数
打开CM后,在菜单栏选择Object -> Create -> Electrical CSet,命名比如DIFF100。选中这个CSet,在Differential Pair工作表中填入Phase Tolerance和Min/Max Delay。
Phase Tolerance建议先填一个基于协议预算换算出的值,不要一开始就填极限值。比如PCIe 3.0这类高速信号,如果预算算出来是10ps,你就先换算成mil填进去,跑通布线后再根据仿真或测试结果收紧。Min/Max Delay则需要结合器件手册里的飞行时间窗口,把最长和最短允许值都填上。
这里特别注意:CM左下方的Worksheet列表里有不同类别的表,不要在Wiring表里乱填全局值。CSet是按对象隔离的,但很多人习惯性地在全局表里改数字,导致所有网络都被影响。正确做法是只编辑你创建的CSet行,不要碰“All Constraints”这类全局汇总视图里的数值。
4.2 第二步:建立Physical CSet与Spacing CSet
继续用Object -> Create -> Physical CSet,命名DIFF100_PHY。打开后在Differential Pair行里设置Line Width、Primary Gap、Neck Width、Neck Gap。这几个参数决定差分阻抗和耦合状态,务必和叠层计算出的线宽线距一致。
Spacing CSet同样用Object -> Create -> Spacing CSet创建,命名DIFF100_SPC。在设置表里找到差分对与其他网络的间距规则,比如Diff-Pair to All,一般设置为不小于单端安全间距的2倍,具体按板厂的工艺能力和叠层来定。
这一步最容易出的问题是Physical CSet里的差分对行没有填到“Differential Pair”那一列,而是填到了Single普通单端行。结果就是规则表显示已经设置了,实际布线时差分对用的还是单端参数。填完之后,把光标停在该行,确认你修改的单元格确实属于Differential Pair列。
4.3 第三步:把CSet指派到网络并开启分析模式
选中差分对网络,可以用两种方式指派CSet:一种是在CM的Net工作表中,选中网络后右键,在属性对话框里填入Electrical CSet、Physical CSet、Spacing CSet的名字;另一种是在菜单Set -> Constraints里按网络范围批量指派。
指派完成后,打开Analyze -> Analysis Modes,确保Differential Pair相关检查项全部勾选,尤其是Phase Tolerance和Propagation Delay。如果这些检查项没勾上,DRC根本不会报差分等长的违例,规则设了等于没设。这一步我自己每次都会检查一遍,因为软件升级或模板切换后,Analysis Modes的默认勾选状态可能会变。
4.4 第四步:用Route > Interactive Differential Pair Tune完成绕线
布线完成大形之后,执行Route菜单下的Interactive Delay Tune,或者16.6里专门针对差分对的Interactive Differential Pair Tune命令(不同Hotfix版本菜单名称略有差异)。点选要绕的差分对走线,Options面板里会出现Tune Mode、Gap、Amplitude、Pitch等参数。
设置好之后,沿走线方向拖动鼠标,工具会自动生成等宽等距的绕线形状。在状态栏或Options面板里能看到当前长度、目标长度和差值,跟着数值提示调整,直到差值变绿。用这个工具而不是手动一段段拉线,最大的好处是工具会尽量维持P/N间距,避免人为绕出不规则的耦合结构。
5. 绕线参数与等长调整:绕多少、怎么绕才算合格
5.1 三种Tune模式的适用场景
16.6的Delay Tune工具提供三种常见的绕线模式:
- Trombone模式:适合空间比较充裕的整段补长,绕出来的形状类似手风琴,对信号连续性影响相对较小。
- Accordion模式:适合在规则布线区域里做波浪式绕线,布线密度较高时也能用,形状整齐,便于后续审查。
- Sawtooth模式:适合在细小空间里做微调,幅度小,但单位长度引入的拐角更多,对高速信号来说寄生效应略明显。
选模式不是看哪个好看,而是看绕线区的空间余量。空间窄就选Sawtooth,空间够就选Trombone或Accordion。如果发现工具生成的绕线形状不齐,先调整Tune栅格,再重新绕,比手动微调高效得多。
5.2 Gap、Amplitude、Pitch的参数选择
Gap是绕线区相邻走线的间距,Amplitude是绕线凸出的幅度,Pitch是每个绕线单元的周期间距。这三个参数共同决定绕线占用的面积和引入的寄生电容。
我的习惯取值:Gap不小于主间距的2倍,Amplitude不宜超过走线宽度的10倍,Pitch取Amplitude的4~6倍。这样绕出来的区域不会让阻抗突变太严重。绕完一段之后,最好用约束管理器里的“显示走线长度”功能确认一下实际绕出来的长度,而不是只信Options面板里的估算值。
还有一个容易忽略的点:绕线时P/N两根线必须同时绕,间距保持一致。如果只绕了其中一根,差分对立刻变成非耦合走线,模式转换变大,哪怕DRC显示等长通过了,实测眼图可能还是不过。这正是很多人把等长绕得漂漂亮亮、测试却翻车的核心原因。
5.3 绕线时看状态栏:判断等长是否达标的实时反馈
执行Tune命令时,界面下方有动态数值显示,16.6也会在光标附近弹出实时长度。看两个值:一个是对内相位差或长度差,一个是目标延迟。两个值都满足要求后,再看右下角的DRC图标,确认没有新增的间距或长度违例。
不要依赖“目测差不多”。板子密度一大,目测往往骗人,特别是P/N在出脚区域和过孔附近的小幅差值,眼睛根本看不出来。以CM报表和DRC结果为准,绕完一段就刷新一次DRC,别等到最后统一跑检查时一堆红色。
6. 实战踩坑:六种最隐蔽的差分等长问题与排查链路
6.1 坑一:相位容差设置了,DRC却报“没有差分对规则”
场景:CM里明明给网络设置了Electrical CSet,但DRC报错提示Differential Pair规则缺失。原因通常是网络没有在Logic -> Assign Differential Pair里完成绑定,或者绑定后没有更新DRC。
排查链路:先打开Assign Differential Pair对话框,确认P/N状态是Assigned;然后执行Tools -> Database Check,做一次数据库更新并刷新DRC。很多情况下,绑定操作晚于规则创建,DRC索引没刷新,就会误报。不要一看到报错就怀疑规则值,先从“对象是否真的存在”开始查。
6.2 坑二:用总长度差额代替相位容差,信号没救回来
有人为了省事,只在Min/Max Delay里填一个总长度范围,不填Phase Tolerance。这样只能约束两根线各自的总长度,不能约束两根线之间的差值。两根线一条走内层、一条走表层,总长度相同但延迟不同,照样出问题。
排查链路:检查Electrical CSet里Phase Tolerance列是否有值,如果没有,立刻补上。补完之后再跑一遍DRC,看之前“通过”的差分对是不是瞬间变红——变红是好事,说明规则终于开始干活了。总长度差额和相位容差是两个维度的约束,不能互相替代。
6.3 坑三:单位混用,差之毫厘谬以千里
16.6的CM单位会跟着设计文件走。设计单位是mil时,Phase Tolerance填5就是5mil;切到mm时填5就是5mm,差了39.37倍。有一块板子从公制模板转过来,规则里原本写着0.13mm的相位容差,转单位后实际按mil解析,相当于3.3mil,所有差分对全红。
排查链路:开干之前先统一设计单位,在Setup -> Design Parameter Editor里确认单位。在CM里填数值前,看一下工具栏上的单位标识,心里默认乘以“当前单位换算”。所有规则值都建议在注释或Excel里记录一份原始单位,方便换单位后对照。
6.4 坑四:绕线工具“不听使唤”——物理规则和电气规则打架
如果你在Physical CSet里把Primary Gap设成8mil,却在Electrical CSet里把Gap相关属性填成别的值,或者压根没给网络指派Physical CSet,执行Differential Pair Tune时,工具不知道按什么间距生成绕线,就会绕出畸形的形状。
排查链路:选中差分对网络,右键查看属性,确认三个CSet都已指派、命名一致、参数不冲突。如果绕线工具生成的形状怪异,先回到Physical CSet检查Primary Gap,再回到Electrical CSet检查相位容差。两套规则引用同一个命名体系,可以少踩一半的坑。
6.5 坑五:连接器/BGA区域绕线后对内skew反而变大
连接器出脚和BGA扇出区域空间受限,P/N往往不等长。等长绕线如果只绕了面积大的中段,出脚处的短腿没补,最终相位差依然不合格。
排查链路:先在Pin Pair层面把出脚区域单独设约束,把短的网络优先在这一段补齐;再绕远离器件的中段区域。绕完后在CM里按Pin Pair查看每段的长度差,定位到底哪一段贡献了主要差值。直接看整对总长差是看不出局部问题的,必须拆到Pin Pair级别看。
6.6 坑六:区域规则覆盖全局规则导致的误报
板内如果有Route Keepout、Region或Room做了单独的间距规则,差分对经过这些区域时会套用区域规则而不是全局Spacing CSet。常见现象是:全局规则明明正确,但某一段差分对DRC报间距违例,或Phase Tolerance在过Region边界后跳变。
排查链路:选中报告违例的线段,打开其属性,查看所在Region和实际应用的Spacing CSet。把区域规则里的Diff-Pair相关项补上,DRC就消了。这块问题最容易出现在板边的禁布区、螺丝孔附近的Keepout,以及内层分割线附近的区域,布板前先检查这些区域有没有被意外画进差分对的路径里。
最后说点个人习惯。每次出板之前,我会用CM的Report功能导出一份差分对等长报表,对着板子逐对确认。报表上除了Phase Tolerance之外,我还会给每一对差分对写一个备注,记录它对应的协议速率和换算后的延迟预算。这套习惯帮我挡掉了好几次改版。如果你也正在16.6上为差分等长发愁,希望这套从规则到绕线的完整流程,能让你少走几步弯路。