AD20差分对等长布线全攻略:从原理图到DRC验证
之前有个项目板子贴片回来之后LVDS链路在低温环境下偶发通讯失败示波器抓了快一天才定位到问题不是器件不良也不是焊接虚焊而是那几对差分线里有一对的等长偏差差不多到了30mil。眼图在常温下还能看温度一低时序裕量直接被吃掉丢包就出来了。后来在AD20里重新处理差分对约束、把等长调到容差范围内问题彻底消失。从那以后我养成了习惯差分线绝不靠“手感和眼力”布线所有等长动作全部在AD20的规则体系和调线工具里完成。这篇文章就是把从原理图定义差分对、到PCB布线、再到等长调线与DRC验证的完整链路捋一遍把实际操作中的参数设置、快捷键和避坑点都写出来。适合正在学AD20差分线处理的朋友也适合那些画过几块板但总在等长阶段被折磨的工程师。1. 等长到底在等什么差分信号的约束与误差来源1.1 差分信号不是“两根线走一样长”那么简单很多新手刚接触差分线时容易把等长理解为“两条蛇形线绕得一样多就行”。这个理解方向没错但等长的本质不是几何长度一致而是电长度一致也就是信号从驱动端出发正负两路到达接收端的时间差要控制在一个很小的范围内。差分信号的优势在于接收端比较的是两根线上的压差外部共模干扰会在两线上产生相同方向的噪声相减之后被抵消。这个机制成立的前提是两根线受到的干扰尽可能一致并且信号到达接收端的时间尽可能同步。如果P和N两条线长度差得比较多接收端的比较窗口就会错位差模信号的能量被损耗共模噪声却因为没有完全抵消反而变大EMI恶化眼图闭合误码率上升。低速设计里这个问题不明显一旦信号速率上了百兆、千兆或者走的是DDR这种对时序极敏感的总线等长偏差就是硬伤。AD20这个工具其实把“等长”拆成了两个层面一个是布线阶段的交互式等长调线另一个是设计规则里High Speed → Matched Lengths的约束检查。前者负责把你的手变成“蛇形线画笔”后者负责告诉系统哪些网络必须对齐、误差必须控制在多少以内。两者配合才是一套完整的等长处理流程。1.2 等长误差从哪来封装、过孔、扇出与绕线等长偏差不是布完线才出现的在原理图阶段误差就已经埋下了。芯片封装的引脚出线长度天然有差异BGA的引脚分布在几行几列之间引脚到die的距离本来就不一样。原理图上看不到这些但PCB布线时能感受到从BGA扇出的一瞬间某些网络需要绕一大圈才能出得来某些网络几乎直出。这就是等长工作的起点——先让所有走线的最短物理路径尽量接近再通过蛇形绕线补齐时间差。过孔也是一个容易被忽略的误差源。一对差分线如果一根走了表层、一根换了层那么两条线的路径上过孔数量不一样信号在过孔处的寄生电容和stub长度带来的延迟也不同。一般来说一个普通过孔会给信号增加大概6到10ps的延迟如果一根线多过两个孔等效长度差很快就到了十几mil。所以做等长之前先把过孔规划好让差分对内部两根线尽量走同样的层切换路径比事后拼命绕蛇形要靠谱得多。还有一个误差来源是扇出区域到主布线区的连接段。BGA焊盘之下那一小段引线通常不是平行的可能一根笔直一根带弯这一段的“非耦合长度”如果过大也会造成差分对内部的不对称。AD20规则里有一项Min/Max Uncoupled Length就是专门约束这个的后面会细讲。1.3 不同接口的等长容差要求差别很大做等长前先搞清楚你的信号对等长有多敏感这是最实际的问题。不同接口规格对内部skew的要求完全不同盲目把容差设成±1mil不但浪费时间还可能因为绕线太密引入新的串扰。这里给一份我平时项目里常用的参考值具体数值最终还是以对应芯片手册为准接口/总线组内等长容差参考说明LVDS并行总线时钟对±5mil数据对±10mil时钟是基准组内对齐更严格千兆以太网MDI±5~10mil主要看PHY的skew预算USB 2.0差分对一般不做全链等长连接器端保持短且对称即可DDR4 DQ/DQS组组内±5~20mil常见具体看控制器与颗粒要求DDR4差分时钟对±5mil以内时钟必须优先保证PCIe差分对±5mil左右AC耦合电容位置也要对齐注意USB 2.0那个很多人上来就给USB线做蛇形等长其实低速/全速模式下没必要。USB 2.0差分对内部自带时钟恢复机制关键是对内尽量对称、走线短、靠近连接器全局等长意义不大。所谓“没有调查就没有发言权”先读手册再设规则不要条件反射式地所有差分对一律±5mil。2. 原理图侧先做对差分对定义与网络命名规范2.1 网络命名是差分对识别的第一道关卡AD20识别差分对第一依赖的就是网络命名规则。默认情况下它要求网络名以_P和_N结尾比如LVDS_TX0_P和LVDS_TX0_N。一对网络如果能匹配上这个规则AD20就可以在导入网表后自动建立差分对。我在实际项目中常遇到的问题是硬件工程师习惯把网络命名为LVDS_TX0和LVDS_TX0-或者干脆叫LVDS_TX0_P和LVDS_TX0_N但多了个数字后缀比如LVDS_TX0_P1。这类命名在AD20里是不会被自动识别的需要手动在差分对编辑器里指定正负网络。麻烦不说还容易漏。所以最省事的做法是在原理图绘制阶段就规范命名差分正端统一以_P结尾负端统一以_N结尾并且除了这个后缀以外其他部分完全一致。这是整个等长流程中性价比最高的一步成本为零后面省下大量手动匹配时间。2.2 在AD20中创建差分对的三种方式AD20里创建差分对的方式有几种哪种顺手用哪种但前提是知道它们各自的适用场景。第一种在原理图中放置差分对指令。快捷键操作路径是 Place → Directives → Differential Pair或者直接在工具栏里找到Differential Pair指令放到网络标签上。放置时AD20会自动识别当前连线上的网络名如果检测到_P/_N后缀它会自动配成一对。在指令属性里可以设置差分对名称和极性。这种方法的好处是PCB端导入后直接生成差分对约束不用再手动创建。第二种在PCB编辑器中打开Differential Pair Editor。路径是 Design → Differential Pair Editor。这个工具适合处理已经导入PCB的文件。在左侧Net列表里过滤出*_P和*_N结尾的网络选中一对点AddAD20会自动生成差分对。如果网络命名不标准比如LVDS_TX0这种加号结尾可以在这个编辑器里手动选择正网络和负网络缺点是容易漏选。第三种利用PCB面板选择网络后右键创建。在PCB面板过滤器里输入网络名选中一对后右键 → Differential Pair → Create。这种方式适合补充创建零散的差分对不适合大批量。我自己的习惯是原理图阶段就放好差分对指令这样差分对规则能跟着原理图一起走换机、换人、重新导入网表都不用再操心。等板子复杂到一定程度从PCB端手动建对子一定会出错。2.3 原理图阶段就要定好的差分阻抗目标原理图阶段不需要画蛇形线但差分阻抗目标值必须在原理图标注或设计文档里明确。常见差分阻抗是90欧、100欧、120欧几种。USB 2.0通常是90欧差分LVDS和千兆以太网多是100欧RS-485这类现场总线常见120欧。这个值不是拍脑袋定的它取决于芯片的驱动能力和接收端匹配要求。原理图上的差分对两侧通常会有并联端接电阻端接阻值要跟差分阻抗匹配不然会有反射。AD20本身不直接参与阻抗计算它管的是线宽和线距规则真正的阻抗验证要么靠经验公式要么靠SI仿真工具要么直接让板厂叠层计算。这里有必要提一个基础概念差分阻抗由单端阻抗、线间距和参考平面距离共同决定。一对已经确定线宽的走线间距越小耦合越强差分阻抗越低间距越大耦合越弱差分阻抗越接近两倍单端阻抗。所以“保持间距一致”和“保持线宽一致”对差分阻抗同样重要等长绕线时如果为了补长度把间距撑得乱七八糟长度是对上了阻抗却毁了。3. PCB端布线前的准备规则、层叠与扇出3.1 把差分对规则写进PCB Rules别在走线时临时手调PCB阶段最忌讳的一件事是边布线边拿ShiftW快捷键手填线宽线距。短时间调一两根没问题长时间这样操作最后规则管理器里的约束跟实际走线完全脱节DRC一跑全是错误。正确做法是先到 Design → Rules 里把差分对规则完整建立起来。关键规则在 Routing → Differential Pair Routing。这里可以针对单个差分对或差分对类别设置三个关键参数Min Width、Typical Width、Max Width以及Min Gap、Typical Gap、Max Gap。实际走线时AD20会强制使用这些规则。更需要注意的是 Uncoupled Length 的设置。这个参数约束的是差分对内部两根线分开、没有形成耦合的长度。在扇出到BGA边缘和靠近连接器引脚的短距离内两根线不得不分开一段这是正常的但如果这个非耦合长度过长差模到共模的转换就会增加。我一般把这个长度设在50到100mil以内具体还是看板内空间。对高速DDR接口我甚至会设成0逼自己在扇出阶段就把两根线并行处理。另外在High Speed → Matched Lengths规则里添加等长约束。设置目标长度Tolerance注意这里的目标长度可以是具体值也可以留空。留空的话AD20会以当前最长的那根网络为基准其他网络自动对齐到它。具体布完线后可以通过交互式等长调线工具来填补实际目标值但规则里最好先把容差写清楚。3.2 层叠与参考平面的选择等长布线的地基差分线能不能做出稳定阻抗层叠结构说了算。为什么说层叠是等长的地基因为如果参考平面不完整走线下面的返回电流路径就不稳定信号延迟和阻抗都会随之变化你在AD20里辛辛苦苦调好的长度实际生产出来却对不上就是层叠出了问题。实际工程中四层板是性价比最高的选择。差分信号优先走在靠近完整参考平面的内层比如L2参考L3平面或者L3参考L2平面。内层走线的阻抗受阻焊层影响小更稳定。表层走线虽然方便调试但阻抗受阻焊层厚度和铜厚影响较大不是不能用而是要提前跟板厂做好叠层确认。层叠设计时要特别注意参考平面的完整性。差分对正下方的平面必须是连续的不能有电源/地层分割线。如果信号从L2走到L4而L3恰好是电源层且被分割成了几个电压区返回电流就得绕路结果就是等效电感增加、延迟变大、共模辐射变大。这种情况下你在AD20里调等长调得再准实际信号也会因为参考平面断裂而失真。3.3 扇出设计过孔、反焊盘与返回路径差分线从BGA引脚扇出时最容易出问题的就是两个一是两个过孔距离太近导致孔径间距不满足制造能力二是过孔换层处参考平面被切断导致返回路径不连续。BGA扇出时一对差分信号的两个过孔尽量紧挨着放走线一出焊盘立即以差分方式并行进孔。过孔之间的间距通常取焊盘中心间距也就是BGA的引脚间距比如0.8mm或1.0mm BGA。过孔尺寸按板厂工艺能力走常规用8/16mil或10/20mil的通孔高密度板可以上激光盲孔但成本会上升。这里要特别留意过孔的反焊盘Anti-Pad。过孔内层连接焊盘与参考平面之间如果有空隙这个空隙就是反焊盘。反焊盘太大电流回流路径被撑宽过孔阻抗偏高太小寄生电容增加。常规FR4板材下反焊盘设为孔径加8到12mil左右是均衡值具体可以通过HFSS或者SIwave一类工具仿真确认。反正我自己画板时对DDR和PCIe这类高速信号会专门为过孔做一次阻抗匹配等长调线之前先把过孔模型打通。扇出阶段还有一条看不见的规则差分对从BGA引脚出来时尽量避免引脚间距变化导致两根线在扇出区域就出现长度差。如果实在避免不了就记住一个原则——后面等长绕线时绕线的位置尽量放在远离BGA和连接器的中间段不要在芯片引脚附近就急着绕那样会挤占BGA外围的布线通道给其他信号造成压力。4. 交互式差分布线与等长调线实操手法4.1 交互式差分布线的核心操作与快捷键AD20里布差分线最趁手的工具是 Interactive Differential Pair Routing快捷键 P I D。启动后点选差分对的任意一根线AD20会自动把两根线以差分方式推挤布线。布线过程中有几个关键快捷键值得刻进肌肉记忆Shift W临时切换线宽适合查看不同线宽下的布线效果但确认后要记得改回规则值Shift S切换单层显示模式布内层差分线时非常有用小数点.和逗号,在交互布线时调整差分对间距但是注意手动调整间距只对当前走线段生效退出后仍然受规则约束。这个键可以帮你快速试探出合适的间距值比打开规则管理面板填数字快得多Ctrl 滚轮缩放视图在绕线时配合使用启动差分布线后走线默认以45度角或者任意角度推进。我习惯把拐角模式设为45度走出来的蛇形线和拐角会更好看也符合大多数板厂的加工习惯。任意角度走线虽然在某些情况下能缩短路径但生产端D码和光绘处理容易出问题。布线时还要注意一点差分对的两根线一定要同时走完一段不要一根走完再走另一根。AD20的差分布线工具天然支持双线同推如果你发现自己在一根一根地画说明工具用法不对。两根线同时推挤可以保证它们在每一段都保持平行等间距这是控制差分阻抗的基础。4.2 等长绕线该绕成什么样振幅、间距与形状当差分对的主路径都布完进入等长阶段。AD20里等长调线的工具是 Interactive Differential Pair Length Tuning快捷键 U I D。启动后点击需要调等长的差分对鼠标拖动就会拉出蛇形线AD20会根据Matched Lengths规则实时显示当前长度和目标的差距并用颜色反馈绿色表示达标红色表示欠长或超长。调线时面板上几个参数要理解清楚Target Length当前差分对需要达到的目标长度。多个差分对需要组内对齐时这个值通常统一设为基准线的长度。Target Tolerance允许的偏差范围。Max Amplitude蛇形线凸起的最大幅度也就是蛇形线两翼之间的最大宽度这个参数决定了绕线时会占用多少横向空间。Gap蛇形线相邻两臂之间的距离这个值太小会导致线间串扰增加一般至少取3倍线宽。实际操作中我的手法是先设置合理的目标长度和容差然后从差分对中较长的那根线的中间位置开始绕。尽量不要把蛇形线全部堆在一头那样会导致信号在一段极度拥挤的通道里穿行串扰和阻抗不连续都会增加。分段绕线可以让整体布线更均匀也方便后续调整。蛇形线的形状也是讲究。AD20默认的绕线方式是“S形”和“Trombone形”结合也就是先在垂直方向往复摆动形成几段平行的短线。这种形状对差分线有两个好处一是平行臂之间的耦合可控二是绕线区域占用的长度方向空间可控。避开那种绕成一个方环的做法方环的内角容易造成阻抗突变而且回流电流路径变差。绕线过程中AD20还有一个很实用的特性如果目标长度设定好了绕线接近终点时会把吸住鼠标到达目标长度后会用一个圆圈或颜色变化提示你。这时候不要贪多尽量一次到位。如果绕过后发现超了先按退格键回退再重新拉蛇形线不要试图把超长的蛇形线硬往旁边推那样很容易把间距挤坏。4.3 多组差分对同时等长分组约束与虚拟差分对单对差分线的等长很简单麻烦的是多对差分线组内全都对齐比如DDR4的数据线组DQS/DQ或者LVDS总线的多对数据线。这时候要用到差分对类别Differential Pair Class。在AD20里Design → Classes可以创建Diff Pair Class把需要组内等长的所有差分对都加进去。然后在High Speed → Matched Lengths规则里选择这个Class设置统一的容差。这样整个类里的差分对都会以同一基准进行等长对比。这里有一个易用的技巧在规则里把最长的那一对设为目标基准其他对自动对齐。那么问题来了最长的不一定是最重要的。对DDR总线来说通常希望地址/控制线组以时钟线为基准数据线组以DQS为基准。所以正确做法是先画出目标基准线比如差分时钟对在Matched Lengths规则里给这个基准线设定一个精确目标长度或者利用“虚拟差分对”功能手动创建一个虚拟网络来充当基准长度。AD20支持创建虚拟差分对Virtual Differential Pair具体入口是Differential Pair Editor里的右键菜单。创建一个虚拟差分对后把它的目标长度设成实际需要的值用它来控制真实差分对的等长范围。这个方法对付那些“没有明确物理基准线”的总线特别管用比如PCB上分散在不同位置的多个LVDS接口它们的P通道不需要彼此等长但如果你希望它们都控制在某个固定长度以内就可以用虚拟差分对统一约束。我自己的经验是对于超过5对的等长组一次性把所有对都拉出来绕线鼠标会非常难控制。更稳的操作是分批处理先把所有差分对的主路径布完然后以最长的那对为基准逐个用U I D调线。每调完一对跑一次Matched Lengths检查确认误差在合理范围再继续下一对。这样看似慢实际比最后一次性重跑DRC高效得多。5. DRC验证与等长绕线区的常见陷阱5.1 如何快速验证等长结果是否达标等长绕完线第一个动作不是欢呼而是跑DRC。在AD20里执行 Tools → Design Rule Check → Run DRC然后重点关注High Speed规则里的Matched Lengths检查项。DRC报告里会列出每个差分对的实际长度、目标长度和偏差。要特别注意报告里的长度单位默认可能是mil如果你习惯用mm先在Units里切好。查看报告时我一般直接按差分对Class过滤逐个核对有没有红色报错项。还有一个快速验证办法在PCB Panel里把对象类型切到Nets找到对应差分对的两个网络查看它们的Length值。两个网络长度之差就是当前偏差。不过这种方式看不到目标长度只适合快速确认“两根线差了多少”。如果布完线后发现所有差分对都超长或欠长不要急着去手动拉蛇形线。先检查Matched Lengths规则里的目标长度是不是被设成了一个固定值导致AD20以那个值做基准而忽略了实际最长线。通常更合理的做法是目标长度留空让AD20自动把最长网络作为基准再配合容差来控制。留空的情况下所有短网络会自动对齐到最长网络这样天然把整体等长做到位。5.2 绕线区贴器件、跨分割与莫名其妙的DRC报错等长绕线最占空间的是蛇形区这个区域如果离器件太近DRC里最常见的报错是Clearance Constraint。比如在BGA外围一边是不动器件一边是蛇形线间距不够就会报错。这种情况下不要硬拉蛇形线绕开器件而是尝试减小Max Amplitude让蛇形线幅度降下来重新调整绕线区间。如果空间实在不够把差分对往远离BGA的方向挪一下再绕也就是给绕线区留足“缓冲区”。还有一种报错是差分对内部间距超出规则。很多人在调等长时为了让蛇形线走得更紧凑会把两根线的间距在局部撑大或缩小。AD20的交互式调线工具一般会保持间距约束但如果你的Min Gap和Max Gap设置得太宽工具就会允许较大的间距变化。比如你把Min Gap设为4mil、Max Gap设为15mil绕线时AD20就会自动把间距拉大到15mil来获得更大的绕线空间但这样一来差分阻抗就变了。解决方法是把Max Gap收紧一般比Typical Gap大2到3mil就够了别给工具太多自由度。还有一种非常隐蔽的坑等长绕线时绕线区正好落在一个大焊盘附近导致参考平面在这个区域开了一个大窗口信号路径下方没有完整平面层。DRC不一定报错因为这是电气问题不是几何问题。我在PCB上发现这种情况的方法是打开所有隐藏平面层手动查看蛇形线区域的参考平面是否完整。AD20里可以通过 View → Board Planning Mode 或者直接在层堆栈管理器里检查。5.3 一个排错实例等长做好之后阻抗反而变了讲一个真实案例。之前做一款ARM核心板DDR4的数据线组要组内等长我按常规流程设了差分规则——线宽5mil、间距8mil——先把所有DQ线布完然后逐个调等长。等长调完后DRC全绿长度差都控制在±10mil内心里还觉得挺稳。结果板厂说叠层计算下来100欧差分阻抗不对实际测出的TDR阻抗只有86到92欧。排查过程中发现问题出在等长绕线区为了把一根偏短的DP信号线补到组内目标长度我在一段500mil长的区域内用蛇形线绕了很长Max Amplitude设得比较大蛇形线两臂之间的Gap竟然只有5mil。窄间距导致两根线的强耦合差分阻抗被拉低。更尴尬的是蛇形线那边间距变窄了旁边的普通走线又离得太近串扰也跟着变差。后来把蛇形线的Gap调大到10milAmplitude相应调小在更长的区间内分散绕线阻抗恢复到了设计值附近。这个案例给到我的教训是差分阻抗设计不只是“设置规则里的线宽间距”那一下的事蛇形绕线的间距和形状同样会影响阻抗。调等长时视线要不停留在差分对两根线之间还要盯着蛇形线两臂之间的距离AD20在蛇形线参数面板里可以直接设置Gap不要为了追求紧凑的视觉把Gap压缩到离谱。6. 出Gerber前的阻抗与叠层核对6.1 给板厂的信息要写到什么颗粒度PCB设计在AD20里收尾不代表可以直接闭眼发板。Gerber文件出来之前有一件事必须做在制造说明里写清楚差分阻抗要求。板厂需要的不是“差分100欧”这么一句话而是叠层信息加线宽间距约束。常规做法是在制板说明里附一张表格列出层号、介质厚度、铜厚、目标阻抗、线宽/线距参考值以及阻抗公差。如果是AD20可以直接用 File → Fabrication Outputs → Gerber Files 输出光绘再单独生成一个钻孔文件。OB和Gerber X2这些格式AD20都支持推荐用X2因为它把层信息和元数据打包得更完整板厂接收后不容易搞错层顺序。还要再强调一次AD20里的线宽规则是你自己定的能不能做出目标阻抗只有板厂或者SI仿真能回答。发板前把叠层和线宽要求发给板厂让板厂确认他们的叠层条件下这个线宽能不能达到目标阻抗这是一个免费而极有效的避坑动作。6.2 表层与内层差分阻抗的差异处理很多工程师第一次做高速板时不知道表层差分线和内层差分线要做出同样的100欧线宽和间距很可能不一样。原因是表层走线一侧是空气一侧是介质有效介电常数低于完全埋在内层的走线信号传播速度也更快阻抗表现不同。所以在AD20里设置规则时至少要按层区分差分对规则。比如表层差分对用5/8mil内层差分对可能要用4.5/7mil才能达到同样的100欧。具体数值要结合叠层计算不是经验套用。我的做法是在AD20的Layer Stack Manager里输入各层厚度、介电常数、铜厚然后交给阻抗计算工具比如Polar Si9000或者板厂的计算器算算完把每种叠层组合下的目标线宽间距填进Differential Pair Routing规则。这样走到任何一层AD20都会自动用对应的规则值。表层还有一个不可忽视的因素——阻焊层。阻焊层介电常数比空气高覆盖在差分线上时会改变微带线的阻抗。线越细阻焊层的影响越明显。所以表层差分线一般要预留一点阻抗余量或者直接要求板厂使用“阻焊开窗”处理敏感区域。如果等长绕线区也暴露在空气中不要忘了整个差分对都要保持一致的覆盖条件避免前半段有阻焊、后半段开窗导致阻抗突变。6.3 叠层实测值与仿真不符时的应急调整我遇到过叠层实测和仿真差很多的场景。板厂实际压合厚度和理论厚度有偏差或者玻纤布的编织密度导致介电常数局部漂移这些都可能让实际差分阻抗偏离目标。这时候如果PCB已经做出来了改线宽已经来不及能做的就是接受现实、调整匹配。如果等长和阻抗问题共同出现最需要检查的是蛇形绕线区的实际间距和理论间距是否一致。有些时候DRC显示通过但AD20在推挤布线时偷偷把你的局部间距改了而你没有注意到。用AD20的Measure功能量一下蛇形区的实际间距对照规则里的预期值能快速发现偏差。如果实际阻抗偏差在允许范围内就不用调整直接进入批量生产。如果超差可能需要改叠层或者改线宽重开板那已经超出AD20的范畴了。所以还是那句话出Gerber之前花一小时把叠层和阻抗算清楚比板子回来之后再救火省十个小时。最后再分享一个小操作习惯。我现在每次布完差分线都会在AD20里执行一次 Reports → Differential Pair Information把差分对长度报告导出来存一份PDF归档。这份报告在调试阶段非常有用——当现场出现信号完整性问题时第一件事就是核对实际板上的走线长度与设计报告的偏差。工具再智能最终还是要落到可追溯的数据上。等长布线这门功夫说到底是把每一个长度差都管控到数据可见的范围内。