上个月调试一块DDR3的板子,遇到一个挺典型的迷惑场景:地址组里两根网络的Routed Length几乎一样,误差只有2mil。按照不少同事的习惯,这个值已经满足等长要求了,肯定是稳的。但我习惯性地切到Signal Length看了一眼,好家伙,两根线直接差了130多mil。问题就出在其中一个网络多换了一次层、多打了两个过孔。
对于刚接触AD软件的工程师来说,Signal Length和Routed Length这两个名称很容易被当成同一个东西的两种叫法。实际上它们代表的是两套完全不同的度量体系,一个管“铜箔画了多少”,一个管“信号实际走了多远”。这篇文章我会用实际板卡例子,把两者的定义、AD里的查看方式、等长匹配里的选型逻辑,以及一些常见的踩坑点一次性说清楚。内容适合正在做DDR、高速接口的Layout工程师,也适合刚入行的硬件新人用来建立正确的长度观。
1. 两种“长度”背后是同一根线,却分别代表铜箔量和传播时间
1.1 Routed Length:把所有铜箔走线段累加起来
Routed Length,中文里叫布线长度,指的是网络上所有走线段(Track)在二维平面上的物理长度总和。你在PCB编辑器里选中一段走线,Properties面板显示的Length,就是这段走线的坐标几何长度。把网络上所有走线段累加,就得到这个网络的Routed Length。
这个长度有个很关键的特点:它只看铜箔在XY平面的展开量,完全不关心信号怎么流动。也就是说,它对过孔、焊盘、封装引脚的长度贡献一概不统计。你在顶层走了50mil,打一个过孔,再到底层走50mil,Routed Length就是100mil,过孔在Z轴穿过的板厚段不会被算进去。
所以,把Routed Length理解成“画了多少铜线”,比理解成“信号走了多远”更准确。它最大的价值在于,能反映布局布线的工作量、铜箔面积,也可以用来粗略评估物理走线是否过长。在低速电路、功率电路或者普通信号完整性要求不高的设计里,拿它做长度判断基本够用。
但问题是,一旦信号速率上去,决定时序的并不是铜箔的平面长度,而是信号从驱动端抵达负载端所花费的时间。影响这个时间的要素,比单纯的Track长度多得多。
1.2 Signal Length:把过孔、焊盘、引脚折算成电长度
Signal Length,信号长度,是AD基于网络拓扑计算出来的“信号传播路径长度”。它不再只是把所有走线段简单相加,而是按照实际信号路径,把路径上的走线长度、过孔长度、焊盘与封装引脚的贡献都折算进去,最终得出一个更接近电气长度的值。
为什么要把过孔算进去?因为信号在PCB里传播时,碰到过孔就必须沿Z轴穿过整个板层厚度。FR4板材常用板厚1.6mm,大约等于63mil,一个过孔对信号而言,等效于多走约63mil的电气距离,两个过孔就是126mil。这个数字在高速总线的等长预算里绝对算得上大头。如果只盯着Routed Length,这些Z轴距离会被完全忽略。
焊盘和封装引脚也是同样的道理。SMD焊盘虽然贡献不大,但直插器件、连接器的引脚在封装里有一段较长的金属,高速信号经过这段金属同样会产生延迟。AD在计算Signal Length时,会把这部分按封装模型折算进来。所以你会看到,同一网络的Signal Length在绝大多数情况下都会大于Routed Length,而且两者差值越大,往往意味着这个网络的过孔数量、器件引脚长度或者拓扑复杂度越高。
这里补充一个数据传输阶段很有用的参考:在FR4板材上,表层微带线的信号传播速度大约是6mil/ps左右,内层带状线略慢一点。也就是说,Signal Length每差100mil,延迟大约就差16到17ps。DDR3-1600的时序预算里,一个时钟周期是625ps,算上建立保持时间后,留给等长偏差的预算往往只有几十皮秒。所以100mil的电气长度偏差,足以影响一块板子的稳定性。
1.3 一个含过孔网络的数值对比,看清差值的来源
用一组最简单的数值来加深印象。假设板厚1.6mm即63mil,有两个地址网络:
- 网络A:顶层走线长度1000mil,中间换了两次层,也就是经过了2个过孔。Signal Length约为1000 + 2 × 63 = 1126mil。
- 网络B:顶层走线长度1080mil,全程不换层。Signal Length就是1080mil。
从Routed Length来看,A比B短了80mil,给人的直觉是A“还缺长度”,后续调整时会优先给A加绕线。但从Signal Length来看,A比B反而长了46mil,已经超出了等长目标。
如果设计的等长目标值是1100mil ± 25mil,那么A的实际Signal Length是1126mil,已经超出上限,B则需要再加长20mil左右。这时候如果按Routed Length去调整,给A绕线、给B减短,方向和正确做法完全相反,DRC跑完依然报错,甚至越调越乱。
这就是为什么我在做等长设计时,第一步永远先确认AD里显示到底哪个长度。
2. 在AD中分别调出这两种长度的操作路径
2.1 看Routed Length:选中走线后Properties面板即可
查看Routed Length是AD软件最直接的操作之一。用鼠标选中任意一条走线,右侧Properties面板里的Length字段就会显示这条Track的几何长度。如果一次框选多条走线,Length显示的就是这些走线段的累加值。
需要注意,这个累加不会自动区分信号方向。只要走线属于同一个网络,哪怕它是从分支点甩出去的一段短Stub,也会被算进Routed Length。这也是后面“两值背离”的一个隐藏推手,稍后会展开讲。
如果想查看某个网络整体的Routed Length,可以在PCB编辑界面用查找相似对象(Shift+F)把同一网络的走线全部选中,然后在Properties面板查看总长度。更快的办法是,先单独点选一条走线,在Properties里找到网络名,再利用Selection Filter扩大选择到整个网络,最后看累加长度。
2.2 看Signal Length:PCB面板Nets视图的关键字段
Signal Length的查看入口和Routed Length不太一样。右侧面板区域点击Panels -> PCB,在PCB面板顶部的下拉列表里选择Nets视图。左侧列表会按网络分类,点击任意网络,中间区域会显示出这个网络下的所有元素,而右侧上方的信息区里,就会清晰列出Routed Length和Signal Length两个字段。
如果你的面板里没有显示Signal Length,多半是版本或面板配置问题。可以在该视图上方的列标题区域右键,打开Column对话框,把Signal Length等字段勾选出来。不同AD版本的叫法会有细微差别,但核心就是找Nets视图下的长度列。
这个方法在需要快速比对多个网络时非常实用。比如我想看DDR地址线一组的Signal Length是否接近,直接在Nets视图点选不同网络,右上角字段实时刷新,比逐个打开Properties快得多。AD新版本还会在同一个信息区显示Propagation Delay,也就是传播延迟,本质上是由Signal Length和层叠结构换算出来的时间值,做时序分析时可以直接参考。
2.3 整板长度数据报表的两种导出思路
当网络数量很多,一个个点击就不现实了。我常用的办法是:在PCB面板的Nets列表中,按住Ctrl多选要分析的全部网络,然后在Reports菜单下生成网络长度报告。这类报告一般会包含当前选中网络的名称、Routed Length、Signal Length等信息,生成后复制到表格工具里按列排序,谁长谁短一目了然。
另一种思路是在Nets视图信息区里,复制当前网络的长度信息,配合公司内部的脚本或壳层工具批量提取。如果你会写一点DelphiScript或者Python,也可以直接遍历PCB对象,把全部网络名称、Routed Length、Signal Length、Propagation Delay导出成CSV,再做排序和偏差分析。
我自己做等长数据复盘时,基本是“报表导出加排序”:先按Signal Length降序排列,找到偏差最大的网络,再倒查它的过孔数量和路径,定位效率会高很多。
3. DDR3地址组等长实战:为什么按Routed Length调线会调反方向
3.1 全流程:设置Matched Lengths规则与DRC
继续用DDR3地址组做实战演示。新建或打开一个PCB工程后,进入菜单Design -> Rules,在High Speed分类下找到Matched Lengths规则。双击规则进入设置页,先在Where The Object Matches区域选择应用对象。这里建议提前把地址组网络加入一个Net Class,然后在规则里指定这个Net Class,避免挨个手动勾选网络。
设置目标长度和容差时,要明确这个目标值指的是Signal Length还是Routed Length。AD的Matched Lengths规则在DRC检查时评估的是电气路径,也就是Signal Length,而不是简单加总所有Track。这一点在规则说明里并不起眼,但却是判断等长是否达标的依据。
设好规则后,回到PCB编辑器,菜单Tools -> Design Rule Check,把Matched Lengths检查项勾上并运行。如果某个网络不满足等长约束,DRC会直接在Message面板报出该网络当前的Signal Length与目标值的偏差。
3.2 数据对比:Routed Length接近但Signal Length差了130mil
这块板子里,地址组目标长度是1500mil,误差±25mil。跑完DRC后有两根网络报了错,我测量了它们的Routed Length,发现一个是1482mil,一个是1490mil,差值只有8mil。只看这个值,谁都不会觉得等长有大问题。
但看Signal Length,数据就很说明问题了:一个还在1493mil附近,另一个直接变成1623mil,差了130mil,超过误差上限接近100mil。查了一下,后者多打了两个过孔,并且有一个过孔附近甩出一小段12mil的Stub。过孔按63mil一个折算,两个就是126mil,基本解释了全部差值。
这里顺带说一个很多人忽略的点:Routed Length会统计那段12mil的Stub,而在Signal Length的DRC计算中,Stub并不属于从驱动端到负载端的主路径,所以不会计入等长偏差。恰恰是这个细微差别,让两个Length的背离看起来特别吓人。
3.3 用交互式长度调整修正Signal Length
确定问题是换层过多导致电气长度超标后,正确做法不是简单减短走线,而是重新规划拓扑,看看能不能减少过孔数量。但在已经完成大部分布线的情况下,更稳妥的处理方式是通过交互式长度调整,把过长网络的Signal Length拉回窗口内。
选中过长的网络走线,在菜单Route -> Interactive Length Tuning(不同AD版本入口略有差异)进入长度调整模式。鼠标点击需要绕线的走线位置,软件会沿当前路径生成锯齿状的绕线区段。此时打开Properties面板或注意状态栏,软件会实时显示当前Signal Length、目标长度以及剩余偏差。
调整的目标不是让某个数值看起来好看,而是要让所有同组网络的Signal Length最终落在同一个等长窗口里。如果只有一个网络过长,调整方向是压缩绕线或改变拓扑;只有当它过短时,才需要增加绕线。这就是为什么我先讲数值对比:搞反了方向,越绕越乱。
3.4 绕线时的间距与寄生参数提醒
用交互式长度调整增加绕线时,还有几个工程细节要留意。锯齿波形的振幅和间距不是越大越好,太大的振幅会浪费布线面积,太小的间距会引入相邻平行段的串扰。业界经验是绕线相邻边沿间距至少满足3W,也就是三倍线宽,保守设计可以做到5W。
绕线位置也要尽量避开放置在过孔正下方或焊盘根部,那种地方阻抗变化已经很剧烈,再加一段绕线只会雪上加霜。选在走线中段、周围净空较大的区域绕线,是更合理的方案。绕完之后再跑一次DRC,观察阻抗、间距等相关规则是否被破坏。
4. 不同信号类型该选哪个长度指标
4.1 高速时钟与差分对:必须看Signal Length
时钟信号的时序要求通常是最严格的。它的翻转时刻直接决定整个系统的同步,所以任何额外延迟都要算进预算。对于高速时钟,Routed Length最多只能作为走线物理占比的参考,真正纳入时序分析的是Signal Length。差分对也是一样,对内P和N的等长匹配,本质是保证差分信号的正负沿同时到达接收端,必须看Signal Length。
差分对走线还有个特殊之处:两条线一般处于同一层并紧耦合,物理长度本身比较接近。但一旦换层位置不对称,或者某一端的过孔数量不一致,Signal Length就会立刻拉开差距。因此布线阶段就要尽量让差分对的两个网络对称换层,不要为了绕开个别障碍让其中一端的P、N过孔数量产生差异。
4.2 DDR等并行总线:以Signal Length组内匹配为基准
并行总线,比如DDR3/DDR4的地址、控制、数据线,等长的核心是让一组信号在同一个时钟边沿窗口内稳定到达。地址线通常是从控制器到多颗内存颗粒,属于多点负载拓扑,路径复杂,所以更依赖Signal Length。DRC的Matched Lengths规则也按照Signal Length来评估。
数据线组内会区分DQS和DQ,要求更细:DQS与DQ之间不仅要比长度,有时还要做相对的偏斜控制。这个时候Signal Length比Routed Length能更真实地反映延迟差。结合过孔数量、层叠结构一起看,才不容易遗漏隐藏延迟。
如果你是做DDR4甚至更高频率的设计,我的建议是:在SI仿真之前,先用Signal Length做一轮粗筛,把明显偏离等长窗口的网络挑出来,再针对性地做仿真验证。这要比拿着Routed Length做一堆无效仿真高效得多。
| 信号类型 | 首选长度指标 | 原因 |
|---|---|---|
| 高速时钟 | Signal Length | 时序预算紧张,需计入过孔与引脚延迟 |
| 差分对 | Signal Length | P/N两侧需对称换层,避免电气长度偏差 |
| DDR地址/控制线 | Signal Length | 多负载拓扑,Routed Length含Stub干扰 |
| DDR数据线/DQS | Signal Length | 组内相对偏斜控制要求精确 |
| 低速控制信号 | Routed Length可初判 | 时序裕量大,关注物理走线是否冗余 |
| 电源与地网络 | Routed Length | 主要关注铜箔电阻和载流能力 |
4.3 低速控制信号:Routed Length能用但也有前提
低速控制信号比如复位、片选、I2C等,时序裕量常常很大,走线长度差个几百mil也不会产生功能问题。这种情况下,用Routed Length做粗略判断完全可行,而且快速方便。我的习惯是:只要信号速率低于几十兆赫兹、负载单一、时序预算宽松,就不必纠结Signal Length。
但前提条件是,这根线的路径不能存在过大的过孔数量差异,也不能有严重的拓扑分支。因为即便整体时序裕量大,如果一根复位线上打了七八个过孔,导致上升沿被过孔寄生电容拖慢,也可能在极端温度下触发问题。低速不等于可以完全放弃电气直觉。
4.4 多分支拓扑与Stub处理
当网络带多个负载,比如一串DDR颗粒挂在同一条地址线上,AD计算Signal Length时关注的是驱动端到各个负载的路径长度。Routed Length会把所有分支的残端长度全加进去,这在等长判断上是一个严重的干扰项。
处理思路是:先看拓扑结构,确认驱动端和负载端在原理图上的引脚方向被正确设置为Input/Output。AD只有根据正确的器件引脚方向,才能自动识别信号路径。然后单独查看每个分支的Signal Length,而不是看整网的Routed Length。这样分析出来的数据才有实际意义。
如果设计规范允许,优先采用菊花链或Fly-by拓扑,让信号按顺序到达每个负载,而不是在某个节点分出多个长Stub。拓扑一旦定下来,Signal Length的提取就会稳定,等长调整也会变得可控。
5. 两个Length严重背离时的五步排查法
5.1 查过孔层对设置是否正确
Signal Length中过孔长度按层对间距计算,如果Layer Stack Manager中的层对定义错误,比如把两个物理距离很远的层归为相邻层,AD会按错误的间距折算过孔长度。这种情况下,Signal Length会和实际电气长度偏差很大。
排查时打开Design -> Layer Stack Manager,检查每个过孔类型对应的层对。顶层到底层的过孔,间距应该约等于整板厚度;一到三层的盲埋孔,间距应等于第一层到第三层的介质厚度。如果层对里混入了错误的对称层信息,过孔长度就会被高估或低估,Signal Length自然不准。
5.2 查网络拓扑和信号方向定义
第二个高频原因是原理图里器件的引脚方向定义不对。AD需要知道哪个引脚是输出(源)、哪些是输入(负载),才能自动提取信号路径。如果驱动器引脚被错误设置成Passive,或者负载引脚被误设为Output,拓扑路径就会乱套,Signal Length会按错误路径计算。
检查方法是在原理图中选中器件,在Properties里查看Pin的Electrical Type。修正方向类型后更新PCB,重新提取拓扑,Signal Length值一般会立即恢复合理范围。这个问题在复用外部参考设计时特别常见,因为别人画的原理图里引脚属性未必规范。
5.3 查封装焊盘与3D模型引起的长度偏差
某些特殊器件,比如DDR内存条插槽、板对板连接器、RJ45等,封装引脚本身带有较长的金属段。AD在计算Signal Length时会把引脚长度按封装模型加入。如果发现某个网络的Signal Length比Routed Length大得离谱,而且过孔数量又不多,优先怀疑封装引脚的长度设置。
这时打开PCB封装库编辑器,查看Pin的长度属性是否和实际器件一致。如果器件是客户提供的Step模型,还要确认机械引脚长度和电气焊盘之间的对应关系,避免3D尺寸和电气长度互相误导。我遇到过因为封装里Pin长度被误设为100mil,导致一整组连接器的Signal Length全部偏大的情况。
5.4 查DRC规则选型是否匹配
Design Rules里长度相关的规则有好几个:Min Length、Max Length、Matched Lengths、Differential Pair Matched Lengths。它们各自检查的对象不同。有时工程师在规则里配的是Min/Max Length,但实际要做的是组内等长匹配,DRC报告会显得“明明改了长度却不更新”。
我在实践中会同时检查:等长组是否都加入了Matched Lengths规则,有没有网络漏加;目标值设置在了Min/Max Length字段还是Matched Lengths字段。规则设置混乱时,长度值本身没问题,DRC也会给出让人误解的报错,这时候先冷静看一下规则类型再动手。
5.5 查残端走线与孤岛铜皮
最后一种背离场景相对隐蔽:网络里存在未连接到过孔或焊盘的残端走线、孤岛铜皮。Routed Length会把它们全部加起来,而Signal Length只走真实信号路径,不统计这些“死线段”。这在手工布线后清理不彻底时非常常见。
全局排查时可以打开DRC的Un-Routed和Un-Connected检查项,或者用查找相似对象筛选同一网络中连接对象数量为0的Track。这些残端删除后,两个Length的差值通常会明显收窄。如果差值依然存在,再用前面几步继续倒查。
最后分享一个我的习惯:看一个网络的长度前,先问自己一句“接下来要拿它做什么”。如果是评估走线占板面积、评估铜箔量,看Routed Length;如果是做时序等长、判断信号延迟,看Signal Length。把这两个值的差别吃透了,DDR、差分线、时钟总线的等长处理都能少走很多弯路。
另外一个很实用的技巧是,每完成一版布线,就把PCB面板Nets视图里的Signal Length导出来,按差值从大到小排序,优先处理背离最大的那几根。大多数时候,它们都会和过孔数量、拓扑结构、残端走线这几个因素强相关。用这种方法做自查,比反复跑DRC更早发现问题。