1. 等长线到底在解决什么问题
做PCB设计的人,早晚都会碰到“等长”这个词。尤其是跑DDR、USB、HDMI、PCIe、以太网这类高速接口的时候,布线阶段最绕不开的一项工作就是拉等长。我在AD里做等长线设置前前后后也有七八年了,从早期手工数着格点绕蛇形线,到后来熟练用AD的交互式等长布线和规则管理,中间踩过不少坑,也总结了不少能直接用的方法。
先说清楚一个基本问题:为什么PCB里的等长线这么重要,为什么不直接保证每根线尽量短就行?
等长的本质是“时序对齐”。信号在PCB走线里传输是有速度的,大约6mil/ps左右(FR4板材、内层走线大约按5.6~6.5mil/ps估算)。如果一组并行信号线长度差异太大,信号到达接收端的时间就不一致。对于并行总线,接收端靠时钟沿来采样数据,数据线必须先于时钟有效沿到达并稳定一段时间,这就是建立时间;时钟有效沿之后,数据还要保持一段时间,这就是保持时间。只要某一根信号线比时钟线短一大截或者长一大截,就会导致建立时间或保持时间裕量不足,跑到一定频率后就随机出错,表现就是系统不稳定、偶发死机、数据错乱,非常难查。
所以等长线不是“为了好看”,而是为了保证同组信号在同一个时间窗口内被可靠采样。AD的等长线设置,本质就是通过软件规则把“允许的长度差范围”限定住,然后借助交互式布线工具把蛇形线、波浪线绕出来,把物理长度修到目标范围里。
这里有一个很容易被忽略的点:等长并不等于“越短越好”,而是“该等长的必须等长,该短的不要硬拉”。比如DDR3/DDR4里,地址线、控制线以CLK为基准等长,数据线DQ以对应的DQS为基准等长,时钟线本身还要做差分对内等长。这三类等长的基准不同,目标长度也不同。如果无脑把所有线拉成一个长度,反而会把时钟和数据的时序关系打乱。
提示:在做AD等长设置前,先搞清楚你的设计里有几组需要等长的网络,每组以哪个网络为基准,允许的误差是多少。这个不搞清楚,后面所有规则和布线都白做。
从AD操作本身来说,等长线设置涉及三大块:网络分类(Class)、布线规则(MatchedLength或Relative Delay)、交互式等长布线(Interactive Length Tuning)。这三块互相配合,少哪环都不顺手。接下来我把整个流程拆开讲。
2. 等长之前的准备工作:网络分类与XSignals
很多人一上来就打开Rule里找“等长”选项,其实这是顺序反了。AD里做等长,第一步应该是把需要等长的网络归好类,否则规则对象都没法选清楚。
2.1 为什么必须建Class而不是一根根去选
AD的规则里,MatchedLength的适用范围(Where The Object Matches)虽然可以直接选网络,也可以写表达式,但一组DDR数据线有16根甚至20根,地址线十几根,如果每个规则都去勾选网络列表,后续改起来极其痛苦。等长不是一次性的工作,DRC验证、改板、调整拓扑时都会反复用到规则,网络分类清晰,后面一切操作都能直接引用类名。
我通常在原理图导入PCB后,先把网络分成几个类:
- DDR_DATA0到DDR_DATA15、DQS0/DQS0#、DQM0等归为“DDR_DQ0”组
- 地址线、控制线归为“DDR_ADD”组
- 时钟对CLK0/CLK0#归为“DDR_CLK”组
- 如果是多片DDR颗粒,每个片子的数据线还要单独一组,同时注意DQS和DQ的关系
AD里打开PCB面板(快捷键PCB),在面板顶部的下拉框里选择“Nets”,然后选中一组网络,右键选择“Create Class from Selected Nets”,AD会自动生成一个网络类。也可以直接在Design -> Classes打开类管理器去新建。
这里我推荐在类管理器里手动建,因为可以写注释、设置颜色,后续在PCB视图里高亮显示特定类别的网络非常方便。类管理器的快捷键是按DC。
2.2 XSignals:DDR等长的正确打开方式
如果你只建Class就开始拉等长,会遇到一个很现实的麻烦:DDR颗粒的地址线通常有分支,一根地址线从控制器到颗粒A再到颗粒B,或者经过排阻上拉,最后形成多段网络。AD默认的等长计算是按整个网络的物理总长度来算的,但DDR的等长要求往往不是“整根总长度”,而是“控制器到每个颗粒的走线长度”匹配。
这就引出了AD里一个非常核心的概念:XSignals。XSignals允许你把一个带分支的信号通路定义成一个对象,AD会按照你指定的信号路径(Signal Path)来计算长度,甚至可以生成XNet(包含源端、中间器件、终端的完整路径)。
在AD20及以后版本,做DDR等长强烈建议用XSignals。操作方法不算复杂:
- 在原理图或PCB里选中需要定义的信号,比如一个地址网络A0,它从CPU出发经过电阻R1到DDR颗粒U1和U2。
- 在PCB界面下,点击Design -> XSignals -> Create XSignals,AD会提示你选择源端和终端器件。
- 选定后,AD自动生成这个信号通路,同时会生成对应的XNet。
创建好XSignals后,类管理器里会出现XSignals分类,你可以把相关的XSignal再归类,比如所有的地址XSignal组成“X_DDR_ADD”。这样在等长规则里,你直接选这个XSignal类,AD计算长度时就会按信号完整路径计算,而不是按物理网络长度的总和(后者会把分支重复计入,非常误导)。
注意:XSignals不是所有设计都必须要建。如果只是普通的两片芯片之间的并行总线,没有复杂的中间器件和分支,直接按网络类做等长就够了。但DDR这类多点(多颗粒)拓扑,建XSignals能省下大量排查分支长度的时间。
2.3 设置颜色与高亮,拉线时不迷路
等长布线时一大痛点就是肉眼不好分辨哪些线属于同一组。我自己习惯在类管理器里给每个Class设置一个独特的颜色,然后在布线时按快捷键Shift+S切换单层显示,再配合[]键或Ctrl+左键点击高亮网络,就能很直观地看到哪根线短了、哪根线已经达标。
这个设置看起来不起眼,实际效率提升巨大。尤其当你面对12根甚至32根并行线的时候,靠网络名一个个去配对根本不现实,颜色分组能让你一眼看清“这片线是一个组”。
3. 等长规则怎么建:MatchedLength还是Relative Delay
准备工作做完,接下来就是规则的核心部分。AD里跟等长相关的规则主要有两个:MatchedLength(绝对长度匹配)和Relative Delay(相对延迟匹配)。它们解决的问题略有不同,适用场景也不一样。
3.1 MatchedLength规则的设置方法
MatchedLength的意思是“给一组网络规定一个相同的长度范围”,也就是所有网络的实际走线长度都在一个最小值和最大值之间。这个规则最适合“同一组线都以某个共同目标长度为基准”的场景,比如地址线组要求全部在1000mil到1100mil之间,不管哪根线短了还是长了,都得修到这个区间里。
设置路径:Design -> Rules -> High Speed -> MatchedLength,右键新建规则。在Where The Object Matches里选到之前建好的网络类,然后设置三个关键参数:
- Tolerance:容差范围,比如±50mil或±25mil,这决定了DRC允许的长度差上限
- Min / Max:整体长度的上下限,如果不填Max,AD会以组内最长网络为准,或者以约束里的基准长度为准
- Matched Length:目标长度,可选填
实际使用中,我通常只设置Tolerance,然后在交互式等长布线时用目标长度来同步调整。比如数据线DQS的参考长度是1200mil,那我就在规则里把Tolerance设为±20mil,然后逐根拉线,拉到接近1200mil就算达标。DRC会实时显示每根线相对目标的偏差,绿色是达标,红色就是违规。
这里有个坑要提一下:MatchedLength的Tolerance只是“组内最大最小长度差”,并不是“每根线与目标长度的差”。如果你不填Matched Length,AD会以组内最长或最短的线作为隐含基准。我见过有人设置Tolerance为20mil,但有一根线特别长,其他线都没问题,结果DRC不报错,原因是组内最长的线被当成了基准。所以稳妥起见,在规则里显式填入目标长度,或者等长时勾选“目标长度”来自动设定,别让基准被某根异常线绑架。
3.2 Relative Delay规则与差分对等长
Relative Delay适用于“长度要跟随另一组网络”的情况,典型场景就是DDR中的DQ与DQS、地址线与CLK,或者差分对内P和N的等长。它不设定绝对长度,而是设一个“相对偏移值”,比如这个网络相对基准网络可以短50mil或长50mil。
设置路径:Design -> Rules -> High Speed -> Relative Delay。这个方法在差分对内应用最普遍。差分走线要求P和N长度尽量一致,但实际绕线过程中会有过孔、弯折、引脚出入线的差异,所以需要以其中一根为基准,另一根去跟随。
差分对等长的一个细节值得单独说。AD里差分对布线时,如果开启“Tune差分对”功能,工具会自动让P和N的长度匹配,同时保持间距恒定。如果你在差分对规则里已经设置了Max Uncoupled Length(最大非耦合长度),等长设置时还要注意:蛇形绕线只允许在耦合区域内进行,不要让P和N在蛇形线里分开绕,否则会破坏差分阻抗。
经验:差分对内等长优先用Mitered(夹角)绕线,而不是圆弧绕线。AD的差分等长模式里可以选Style为Mitered with Corners,这样绕出来的蛇形线转角是45度,比圆弧线更适合差分信号的阻抗连续性。
3.3 目标长度怎么算:从时序到物理长度
等长规则里最让人头疼的就是“目标长度到底设多少”。这个不能拍脑袋,要从时序要求反推。
高频接口的时序裕量怎么换算成物理长度,我一般用这个经验公式:信号在PCB走线中的传播延迟约85ps/inch(FR4外层)到100ps/inch(内层),也就是大约6mil/ps。如果数据手册要求DQS到DQ的偏斜不超过50ps,那换算成走线长度就是不超过300mil的差距。当然,这只是线延迟的差异,实际还要考虑封装延迟、时钟抖动等因素,但PCB设计阶段按这个比例做长度预算基本够用。
举一个具体例子。DDR3-1600的时钟频率800MHz,一个时钟周期是1250ps。数据突发传输中,DQS的边沿对齐到数据的中心,时序上要求DQS与DQ之间的偏斜控制在约0.25个时钟周期以内,也就是约312ps。按照6mil/ps换算,DQS与DQ的走线长度差应控制在约1870mil以内。但这是极限值,实际工程中要留裕量,所以一般会做到500mil以内,甚至更低。
如果你设计的是更高速的接口,比如PCIe或USB3.0,差分对内偏斜要求通常在5~15mil以内,差分对之间的偏斜要求相对宽松一点,但也要结合具体协议规范来定。我通常的流程是:
- 翻手册,找出接口的时序参数(Setup/Hold Time、Skew要求)
- 计算允许的长度偏差
- 折算成AD规则里的Tolerance或Relative Delay参数
- 再按50%~70%的裕量收紧,避免工艺误差、板材差异导致最终超出规格
没有时序参数的,就参考同类成熟设计的常用值。比如DDR2地址线对CLK的等长,经验值控制在±250mil以内;DDR3控制线对CLK通常±250mil;数据线对DQS则做到±50mil以内。这些值不是标准答案,但作为起步值足够了。
4. 交互式等长布线实操:从拉线到收尾
规则建好只是第一步,真正费时间的是把线一根根拉到位。AD的交互式等长布线工具用好了,效率能差好几倍。这一节我把从进入拉线模式到最终优化的完整过程拆开讲。
4.1 进入交互式等长布线
在PCB界面下,用交互式布线(快捷键Ctrl+W或P-> Interactive Routing)先走完基础连接,不必一次到位。基础线走完后,再选择需要做等长的网络,点击菜单Route -> Interactive Length Tuning(也可以直接按快捷键Shift+R切换,或者用工具栏里的“绕线”图标)。
进入等长布线模式后,你会看到光标附近出现一个可调节的“蛇形线”预览框。这时候不需要直接拖拽,而是先按Tab键打开属性面板,把绕线参数设置好。
面板里的关键参数如下:
- Target Length:目标长度,可以勾选“From Rules”,就是直接从规则里读取
- Tolerance:容差,跟随规则
- Style:绕线样式,有Mitered(折角)、Mitered with Corners(圆角折线)、Arc(圆弧)、Arc with corners(含圆角的圆弧)等
- Amplitude:蛇形幅度,也就是蛇形的宽度
- Gap:蛇形线之间的间距,这个必须满足最小间距规则,一般设为线宽的2~3倍
- Max Amplitude:最大蛇形幅度
这里最大的坑就是Gap和Amplitude两个参数。Gap如果太小,串扰会明显增大;Amplitude如果太大,蛇形部分会占据大量板面,而且相位偏移可能过大。我给一个起步值:线宽5mil的走线,做等长时蛇形Gap设10~15mil,Amplitude设15~25mil。DDR3/DDR4数据线的等长绕线,幅度不建议超过40mil,太大反而会引入额外的共模转换和EMI问题。
4.2 动手绕线:三种风格怎么选
AD里最常用的绕线风格有三种,我分别说下适用场景。
第一种是Mitered(折线型)。这种风格绕出来的蛇形线是45度折角,转弯半径最小,也是我最常用的。它适合普通并行总线的等长,比如地址线、数据线。优点是计算精确,占用的空间相对规则,缺点是高频信号在折角处阻抗变化略大,但等长线本来就是低速/中速信号为主,所以问题不大。
第二种是Arc(圆弧型)。纯圆弧会让信号路径更平滑,阻抗连续性更好,适合对信号质量要求更高的接口。缺点是同等长度修正量下占用面积更大,而且AD在圆弧模式下布局密集度不高,很多板子空间不够,就只能用折线。
第三种是Mitered with Corners(圆角折线),它在折角处加了一个小圆角过渡,算是前面两种的折中方案。我一般用在差分对等长里,既不会太占面积,又比纯折线的信号质量稍好一点。对于差分对内等长,AD还有一种以“长度”而不是“时间”为单位的模式,注意单位要一致,不要混。
实际操作中,鼠标从走线中间开始拖动蛇形线,AD实时显示当前长度与目标长度的偏差,比如短了56mil,就会显示-56mil。你一边拖一边看数值,直到绿色达标标记出现。若发现幅度不够,继续往外拉;幅度太大,往回缩或按快捷键改成多个波峰。AD支持等长线多次绕线:在一条线上绕两段甚至更多段,每段蛇形线各自独立,这样可以分散长度偏差,避免在一块区域集中绕出巨大的蛇形。
操作细节:绕线时按住
Shift键可以正交/45度切换;按住空格键可以旋转绕线方向;X或Y键可以在蛇形线上下开口方向之间切换。这些快捷键在大量绕线时非常省操作,建议提前练熟。
4.3 多根线快速对齐的思路
拉多根等长线的效率提升,关键思路是“基准线法”。选定一组信号中现在最长的那根作为基准(或者规则指定的参考网络),先把基准线尽可能直、尽可能短地布完,然后其他线都以“超出基准线多少”来做调整,而不是每根线都从零开始对目标长度。
实际步骤是这样:
- 把组内最长的那根线布好,作为基准长度
- 在目标长度里把基准长度填进去,比如2300mil
- 其他线逐个进入等长布线模式,目标长度自动设为2300mil
- 短的线补蛇形,长的那根保持不变
- 全部完成后跑一遍DRC,检查MatchedLength规则是否全部通过
这个方法的好处是每次只关注一根线的增量,绕线的量基本都是“补差”,不容易出现绕多了又得回退的情况。对新手来说,记住一个原则:先布长线,再补短线。如果先把短线都布成一样短,再拿长线去绕,往往会遇到空间不够、绕线窜位的问题。
4.4 空间不够时怎么压缩绕线
板子空间永远不够用,这是PCB设计界的铁律。等长绕线过程中最常见的窘境是:线短了,但周围全是走线,蛇形幅度一大就撞到旁边的网络。
我的处理顺序是:
第一,缩小蛇形Gap。只要Gap满足最小间距规则(线间距规则在Clearance里设置),可以把Gap压到略大于线宽,比如5~8mil。这能让同样长度的修正量占用的宽度更小。
第二,增加蛇形波峰数量。在Control面板里可以把单段蛇形拆成两段、三段,多段小振幅的蛇形比单段大振幅的更容易塞进狭窄空间。
第三,局部调整走线路径。如果蛇形无论如何都塞不进去,说明这个区域的布线密度已经不健康了,我会把附近的走线重新规划,让等长线有一段相对空旷的通道,而不是硬挤。硬挤出来的绕线往往间距不够,DRC甚至会报跟其他网络的间距冲突,反而增加后续返工量。
第四,把蛇形线放进内层。外层空间紧张时,可以考虑打两个过孔把线走到内层绕,内层通道通常更干净。但要注意:换层会增加过孔损耗和信号反射,所以这个方法仅在必要时用,且过孔附近要留回流地过孔。
4.5 用PCB面板和列表快速核对长度
绕完线以后,逐个目测检查不现实,我都是直接通过数据来核。AD有两种快速核对方式。
第一种是PCB面板的Net列表,Dual显示时能看到网络的物理长度值(Physical Length)和延迟值(Delay)。选中一组Class后,面板下方会列出每个网络的长度,我习惯在这里扫一遍,看是否都在目标范围内。
第二种是用“Length Tuning”的交互结果。AD的等长布线完成后,布线拐点会保留“修改记录”,选中某一根蛇形线后按Tab可以再次调整。我经常用的是PCB列表(PCB List)配合过滤器,筛选出所有带绕线的Track,查看它们的长度属性,快速定位偏差过大的网络。
还有一个值得一提的功能:AD20及以上版本支持“PCB Filter”面板,可以直接用算式筛选网络,比如InNetClass('DDR_DQ0') and Length < 2200mil,所有长度不够的线瞬间高亮。这个方法之前我很少用,后来发现排查“到底哪根线还没拉到数”时效率极高。
5. 常见问题与排查技巧实录
关于等长线设置,大部分问题其实都有规律可循。下面这些是我在项目里反复遇到过的情况,整理成速查形式,方便大家对照。
| 问题现象 | 根本原因 | 解决办法 |
|---|---|---|
| DRC一直报MatchedLength违规,但每根线看起来都一样长 | 规则里没有显式填目标长度,导致隐含基准漂移 | 在规则里填上明确的Matched Length,让所有线对齐同一个基准 |
| 绕线时蛇形线撞到旁边网络,Gap已经调到很小仍然报警 | 蛇形线起始和结束位置的转弯点太靠近相邻走线 | 把蛇形线的起始点往空旷位置移动;或调整Amplitude,让整个蛇形整体偏移 |
| 差分对内等长绕线后,DRC报Uncoupled Length违规 | 在非耦合区域内做了绕线,P/N在蛇形段分开了 | 改用差分对等长模式;设置Max Uncoupled Length规则,并让蛇形线保持在耦合区 |
| 拉好的等长线在重新铺铜后被DRC报错 | 铺铜改变了网络的参考路径,或蛇形线间距被铺铜挤压 | 铺铜前先锁定等长线(Locked),再设置铺铜与走线的间距规则;铺铜后重新DRC |
| AD不识别某组网络的等长关系 | 网络不属于同一个Class,或XSignal路径定义错误 | 检查Class包含了所有需要等长的网络,必要时重建XSignals |
| 蛇形线太多,板面EMI变差 | 绕线幅度过大、过密,形成大的环路天线 | 缩短蛇形幅度,用多段小蛇形代替单段大蛇形;尽量保持相邻蛇形间距均匀 |
| 等长绕线时线宽突然变化 | 在Rules里设置了Neck Down(颈部收紧)规则,绕线时AD自动启用窄线宽 | 等长线所在网络不要设置NeckDown,或者把NeckDown的适用条件排除等长网络 |
| 完成后DRC通过,但实际贴片后信号不稳定 | 只做了静态等长,没有考虑串扰、回流路径和参考平面连续性 | 等长不是唯一指标,检查走线参考平面是否连续、地过孔是否足够、蛇形区与旁路网络的间距是否足够 |
5.1 为什么DRC通过但实际时序仍然有问题
等长只是PCB时序可靠性的一个维度,它管的是“线长度”,管不了“信号质量”。我见过很多人觉得等长做到位了,板子时序就一定OK,这是一个误解。
信号质量层面的问题,比如反射、振铃、串扰,往往比长度偏差更容易造成系统跑飞。等长线中蛇形绕线集中的区域,相邻蛇形段之间的耦合非常强,如果Gap太小,这里的串扰甚至会抵消掉你辛辛苦苦拉等长带来的时序收益。走线跨分割参考平面,也会让回路电感剧增,导致信号边沿变缓,实际时序裕量进一步缩小。
所以真正到位的做法是:等长做到规则值之后,还要回头看这几点:
- 这组高速线是否全程有连续参考平面,没有跨分割
- 蛇形线的Gap是否足够,至少是线宽的2倍
- 换层过孔附近有没有成对的地过孔
- 走线离板边、其他高速线、晶振/电感等干扰源是否足够远
5.2 等长绕线后线的阻抗会不会变
这也是个高频疑问。很多人担心蛇形线部分线间距变近,导致阻抗变化。这个担心有一定道理,蛇形线相邻段之间的耦合会改变局部的有效阻抗。但幅度通常并不大,因为蛇形段的间距一般远大于线宽,耦合系数不高。
真正要注意的是蛇形线起点和终点附近的“急转弯”,转弯半径过小会造成局部阻抗异常。我的经验是,AD的Mitered模式中,折角处如果出现明显的阻抗突变,可以通过增大折角处的圆弧半径来缓解。成本上没有任何额外损耗,只是绕线好看一点,但对信号反射确实有正面影响。
5.3 多层板里的等长与过孔延迟
这里补充一个容易被新手忽略的问题:过孔本身也有延迟。当你把所有走线都做到了等长,但有一根线多打了两个过孔,它的实际延迟就偏大了。一个过孔的等效传输延迟大约在10~30ps,换算成长度大概是60~180mil。在高频设计中,如果等长容差非常严格,过孔数量不同会导致实际时序差异超规格。
AD在计算网络长度时,可以通过规则里的“Include Pad/Via Length”选项把过孔长度折算进去。我通常在DDR设计中会勾选此项,同时在拓扑规划阶段尽量让同组信号的过孔数量一致。如果你的板子层数很多、走线换层频繁,这一点尤其关键。
6. 关于等长设置的几个进阶经验
当你已经能熟练操作AD的等长线设置之后,有几个更深入的点,是我自己在实际项目中慢慢总结出来的,写出来供大家参考。
第一,等长规则不要只建一个大的。有人把整片DDR所有信号都放进一个MatchLength规则,这是不对的。数据线组、地址线组、控制线组相互之间的等长基准不一样,规则也应该分开。同一个规则里网络越多,目标基准越容易混淆,排查时效率也越低。建议按功能分组,每组单独一个规则。
第二,绕线时考虑“蛇形线的方向”。蛇形线在板上的摆放方向会影响串扰和EMI。相邻的蛇形线如果平行摆放,且波形重叠,相互耦合会比较严重。我一般在同一区域内做多组蛇形线时,会让相邻组的蛇形错开半个周期,视觉效果上也更整齐,电气上耦合也小一些。
第三,自动绕线不是万能的。AD有自动完成等长的功能,在Interactive Length Tuning的属性面板里可以设置“Balance”相关参数,让它自动搜索合适的绕线路径。但对复杂板子,自动绕线往往绕得比较密集,而且它会优先占用大面积空间,容易把布局打乱。我通常只用半自动:手工控制蛇形的大致幅度和位置,靠AD微调长度,而不是让它全自动飞线。
第四,等长也不是越“平均”越好。曾经调试一块板子时遇到过一个现象——所有数据线都对DQS等长到±20mil了,但跑DDR3测试还是一直有偶发位错误。后来排查发现,DQS本身到时钟CLK的等长约束不满足,导致读操作时DQS与CLK的相位关系漂了。这说明等长是一个整体系统:DQ对DQS、DQS对CLK、CLK对地址控制线,每一层都要对好,只做好某一层关系是不够的。
第五,DRC不是终点,仿真校验更稳。AD的DRC只能验证“长度/延迟”是否在规则范围内,验证不了信号实际到达接收端的时序。如果项目级别比较重要,我会把等长后的PCB网络用HyperLynx或Sigrity做一次快速时序仿真,至少确认建立/保持时间裕量是正值。对于中小项目,用经验和规则值做保守控制,一般也够了。
最后:AD等长线的设置,本质上是一个把时序约束翻译成物理约束,再用软件工具和布线技巧去落实的过程。工具操作不难,难的是理解哪些线要对齐、对齐到什么程度、在空间和信号质量之间怎么妥协。希望大家在看这篇实操分享之后,能少走一些我当年走过的弯路。