很多人觉得等长布线就是把线绕成几圈蛇形、长度一凑就完事了,但真正上过高速板卡的人都知道,等长绕线是排在“规则设置”之后的动作——前面CM约束管理器里差一个参数,后面绕线就会差出一堆DRC,甚至绕完线才发现目标长度基准就是错的。这几天我刚调完一块八层DDR3板卡,又跟Allegro的等长布线较了近一周劲,干脆把从规则设置到蛇形绕线的完整流程、参数原理和实战踩坑点一次性写清楚。这篇东西适合刚接触Allegro做PCB设计的新手,也适合已经在用但没仔细抠过“Delay Tune参数到底怎么配”的朋友。我会直接从约束管理器讲起,再到蛇形绕线的四种实现方式,然后解释绕线参数背后的信号完整性逻辑,最后回到真实项目中DDR、USB、SerDes等场景的差异。内容有点长,但都是能用上的东西。
1. 等长约束的“为什么”:先算清楚这笔时间账
1.1 时序余量决定等长精度
等长布线的本质不是“把所有线画得一样长”,而是让一组信号到达接收端的时间差控制在一个可接受的范围内。很多新手有个误区,觉得等长就是长度相等,其实Allegro里Length和Propagation Delay是两套体系,前者只看物理走线长度,后者才看信号飞行时间。实际板卡上,表层微带线和内层带状线的信号传播速度不一样,因为两者所处的介质不同:微带线一部分暴露在空气中,等效介电常数更低,信号跑得更快;带状线被介质完全包裹,等效介电常数更高,信号跑得更慢。这个差异在低速时无所谓,到了DDR3-1600、DDR4-2400这个量级就不容忽视了。
FR4板材上有个经验值很好用:信号传播速度大约是6 mil/ps,换算过来就是1000 mil(1 inch)的走线长度对应大约166 ps的延迟。如果你给DDR3数据线组设定±50 mil的等长容差,对应的时间偏差就是约±8.3 ps。DDR3-1600的数据有效窗口本身也就几百ps,留给版图走线的预算本来就不宽裕,所以±8 ps的偏差不是小事。这也是为什么我在做高速项目时,习惯先把器件手册里的时序参数换算成时间,再转成Allegro里的mil值,心里有笔时间账,设置等长阈值时才不会拍脑袋。
1.2 哪些信号需要等长,组内怎么划分
在Allegro里做等长前,第一步不是打开CM,而是先打开芯片手册,列清楚几组关键总线。
- DDR系列里,每一组DQ数据线要相对对应的DQS差分对做等长,比如DQ0到DQ7这一组,统一以DQS0为基准;地址线、控制线、命令线则相对CLK做等长,因为DDR3的地址/命令信号是采用fly-by拓扑的,时序预算相对宽松,等长容差可以放宽到±100 mil甚至更大。
- 差分信号对内,比如USB的D+/D-、SerDes的TX/RX差分对,一般要求对内P/N等长控制在5 mil以内;差分对之间是否要等长,取决于协议和接口芯片的要求。
- 并行低速总线,比如I2C、SPI、普通的GPIO控制信号,只要不是高速模式,通常不需要做等长。但如果板子尺寸很大、走线跨了半块板,我仍然会把同一组总线信号的走线路径尽量摆在一起,避免“同组信号从板子两端各飞各的”。
划分好组之后,进入Allegro约束管理器的思路就清晰了:不是把几根线拉到一起就完事,而是要明确“谁是基准、谁匹配谁”。这也是Allegro里Match Group和Net Group经常把人绕晕的地方。
2. 约束管理器实操:把时间预算转成板上物理规则
2.1 从创建Net Group到Relative Propagation Delay
打开约束管理器的方式很固定:菜单栏Setup > Constraints > Constraint Manager,或者直接敲快捷键CM。启动后默认是Physical和Spacing两个页面,等长规则属于Electrical页面。
我的操作顺序是这样的:
- 在Electrical页面左侧的项目树里找到Net Routing,展开后能看到Relative Propagation Delay(缩写为RPD)这一项。右键这个表格区域,选择Create > Net Group,把所有需要统一等长的网络选进去。比如DDR3的DQ0到DQ7和DQS0,先放进一个Net Group。
- 右键这个Net Group,选择Create > Match Group。这里要留意:Allegro里真正承载“等长匹配”关系的是Match Group,Net Group更像是一个逻辑集合。如果你只在Net Group里设了RPD但没建Match Group,约束可能不会按你预期的方式作用。是Net Group和Match Group两组搭配使用的,不是二选一。
- 在Match Group里指定Target。Target可以是一个网络、一个Pin Pair或另一组对象。比如DQ组里以DQS0为基准线,就把DQS0设成Target,DQ0-DQ7的匹配目标都指向它。
另外,网络有分支、有多个负载时,建议在Pin Pair层面定义等长关系。举个例子,一块DIMM条上多个颗粒,一颗DQS要从控制器走到中间颗粒,再到端接电阻,这中间会有很长的分支。如果只用Net层面的等长,Allegro只能拿整个网络的总长度来算,绕线时很容易绕出“局部长、整体短”的假象。我在实际项目中会针对源端到每个负载定义关键Pin Pair,把真正的时序路径管住。
2.2 delta:limit 的填写逻辑
Relative Propagation Delay表里每一行有两个关键字段:Delta和Tolerance,显示格式是“delta : limit”,limit就是Tolerance。很多人不知道这两个值怎么填,我展开说。
- Delta表示你希望这根线比Target多多少或少多少。填0表示“与Target对齐”,填正数表示“比Target长”,填负数表示“比Target短”。单位可以在CM右键里切换,默认常用mil,也可以切成ps。
- Tolerance表示允许的误差范围。比如Delta填0、Tolerance填50,意思是以Target为基准,这根线允许在±50 mil范围内波动。
举个例子,DDR3的DQ组相对DQS,如果手册要求总容差±50 mil,我就在DQ0-DQ7这几行的Delta填0,Tolerance填50。而DQS0作为Target本身没有Delta,它的延迟值就是整组的基准。
实践中还有一个更稳的写法:先把基准线(Target)设成一个固定目标,比如规定DQS0从源端到接收端的长度不能超过2000 mil,然后DQ线以DQS0为参考写“0:50mil”。这样做的好处是,当你用Delay Tune拉线时,Allegro会明确知道目标线长是多少,而不是在组内几根线之间反复横跳。
2.3 等长规则不是越多越好
很多板卡上的等长DRC越修越多,不是绕线技术问题,而是约束设置里埋了雷。最常见的情况是同一个网络被多个Constraint Set重复覆盖。Allegro里约束是有优先级的,但当你把一个网络手动加进好几个Net Group,同时又处在某个自动创建的Spacing CSet下时,系统会选择最严格的那条约束,但绕线器在处理时却不一定能聪明地按最严格那条来,最后就是DRC一会报错、一会不报,人看得头大。
我的习惯是:每建一条等长规则前,先查一遍该网络的约束归属。方法是在CM里选中网络,看右侧属性面板中当前激活的CSet列表。如果发现一个网络既属于“地址线组”又属于“全局DDR组”,赶紧删掉冗余的归属,只留最合理的一层。一个网络最好只对应一条等长规则,这是减少无效DRC的最有效手段。
还有一个坑:不要把所有网络都塞进同一个Match Group做“全局等长”,尤其是跨时钟域的信号。不同时钟域的信号本来就该各自为政,强行放在一起等长,只会让绕线面积暴增,同时还可能引入不必要的串扰。
3. 蛇形绕线的四种做法:从Delay Tune到手调
3.1 Delay Tune:自动绕线的基础逻辑
等长规则设置完毕后,真正的绕线才有意义。Allegro里最常用的自动绕线命令是Route > Delay Tune。在16.6里就是这个名称,到了17.x之后改叫Interactive Delay Tune,功能没变。这个命令的运作逻辑很简单:选中一根已经布好的走线,Allegro根据当前长度和CM里设定好的目标长度,计算差值,然后自动在走线上生成蛇形绕线段来补偿长度差。
命令激活后,Options面板会实时显示Current Length和目标长度,下面还有Delta的真实数值。我拉线时习惯一直盯着Delta看,看到它从“-120 mil”慢慢涨到“+20 mil”,手感上就清楚下一段该绕多大波峰、几个波了。
Delay Tune适合解决“整段线长度差得比较多、空间相对宽松”的情况。点一下走线,Allegro自动生成波浪形,速度快,效果好。但它也有很讨厌的一面:遇到走线附近的过孔、元件焊盘或者Shape时,自动生成的波峰会“卡住”,此时Allegro只会绕到障碍物边缘就停了下来,剩下的长度差不会自动补,需要你手动把这段线调开,或者临时关掉一些障碍层再绕。
3.2 手动绕线的参数面板:Wave Height / Spacing / Miter
如果你已经打开了Delay Tune命令但不想全自动,可以把Options面板里的Interactive改成Manual,这时候就可以手动控制蛇形线的每个波峰。手动绕线时最核心的四个参数是:
- Wave Type:蛇形线的拐角类型,常见的有1-2-1、2-3-2等。数字代表波峰路径中走线的排数,这个选择影响阻抗连续性和绕线密度。高速场合我一般用1-2-1或Miter斜角,避免直角带来的阻抗突变。
- Max Amplitude / Wave Height:波峰高度,决定单段蛇形线能补偿多少长度。Amplitude越大,单个波峰增加的长度越多,但占用的空间也越大,而且过高会让相邻绕线段之间的耦合变强。
- Wave Spacing:相邻两个波峰之间的中心距。这个值直接决定蛇形线相邻走线的间距,如果设小了,绕线间距DRC直接爆炸。
- Line Width:绕线时的线宽,一般情况下应该和原走线线宽一致,不要随意改窄。
参数设置逻辑我放在4.2节详细讲,这里先给一个可以直接抄作业的初始值:线宽5 mil、常规BGA区域,Amplitude设15 mil,Wave Spacing设15 mil。这个组合在大多数DDR3板卡上都能跑,后续根据剩余空间微调。
手动拖拽蛇形线时,鼠标先点一下走线进入绕线状态,然后沿着走线方向推,Allegro会按照Options面板里的参数实时生成波峰。想结束绕线,按下鼠标右键选择Done即可。如果绕过头了,不要直接用Delete删线段,那样会把整根走线拆断;应该右键选择Oops撤销上一段,或者用Slide命令把多余的波峰推回去。
3.3 遇到DRC时先调什么
绕线过程中DRC报错是最常见的,但搞清楚错误类型再动手非常重要,不要一看到DRC就拆线重来。
- Spacing Same Net DRC:同一网络内的蛇形线相邻铜皮距离太近。这种问题几乎都是Wave Spacing设小了。解决方法是重设Wave Spacing,把相邻波峰距离拉开,而不是手动把某个波峰拨开一点——你手动挪一下,旁边几个波峰又可能遇到新障碍。
- Length Violation DRC:等长关系不满足。先打开CM看Delta,确认当前偏差方向。如果只差30 mil,可以微调一段波峰高度补上;如果差得很多,说明刚才绕线在障碍处卡住了,需要整理障碍区域重新绕。
- Stub DRC:过孔到焊盘之间的残桩过长。这个不是绕线直接产生的,但高速布线里如果蛇形线绕到离过孔太近的位置,DRC就会被触发。这种时候不要硬绕,应该先调整过孔位置或换层绕线,保证stub最小化。
- Min Width DRC:绕线段的线宽小于设计最小值。通常发生在Neck Down模式下,Allegro为了穿过窄通道自动把线宽改细了。除非是BGA扇出实在没空间,否则我不建议用Neck Down来绕等长,线宽突变对阻抗的影响比等长本身还麻烦。
4. 绕线参数背后的信号完整性逻辑:间距为什么必须大于3W
4.1 蛇形线不是形而上学,是串扰博弈
蛇形绕线的本质是把走线折叠,以空间换时间。但“折叠”这件事本身会带来负面效应:相邻的两段走线方向上不完全一致,一段是正向走,下一段是反向走,信号在进行电平翻转时,相邻段之间会产生耦合。耦合太强时,蛇形线会等效改变这一段的阻抗,导致信号反射,甚至让绕线补偿的延迟打了折扣。这就是为什么绕线参数不能乱设,背后有一笔信号完整性的账要算。
行业里最通用的经验是“3W原则”,即蛇形线相邻段之间的间距至少要达到3倍线宽。比如线宽5 mil,间距就要15 mil以上。为什么是3倍?因为在常规板材和叠层下,间距达到3W时,相邻走线之间的耦合系数会降到很低的水平,串扰对时序的影响可以接受。1W到2W之间耦合很强,信号的过冲和振铃会明显超出预期。如果板卡空间实在紧张,至少也要保证2W,并且需要在仿真里确认SI结果。
4.2 Amplitude与Wave Spacing在使用中的配合
绕线参数不是孤立的,Amplitude和Wave Spacing需要配合起来看。我见过很多同事调蛇形线时只关心“能不能绕下”,忽略了一个很实际的问题:波峰过高且间距过小时,蛇形线从俯视看就是一大片铜皮,不仅相邻线耦合严重,还给后面的返修和检查带来麻烦。
我给一个可复用的调参方法:
- 先确认当前走线的线宽W。
- Wave Spacing先设成3W到5W之间。5 mil线宽就设15 mil到25 mil。
- Amplitude设为3W到5W。同样5 mil线宽,Amplitude取15 mil起步。
- 算一下单个波峰能补多少长度,再根据剩余长度差决定需要几个波峰。
- 如果需要的波峰数量太多导致区域拥挤,优先增加Amplitude而不是缩小Spacing,因为缩小Spacing会立刻增加耦合风险。
单个波峰能补的长度,可以粗略按“2×Amplitude + 部分过渡长度”来估算。比如Amplitude=15 mil、Wave Spacing=15 mil时,一个典型波峰大概补30到45 mil。所以当你看到Delta还差200 mil时,心理预期是至少需要5个以上波峰,这样就不会绕到一半发现空间不够。
4.3 绕完线之后的检查方法
绕完线别急着生成光绘,先做几项检查,这几步能省掉后面生产阶段的不少麻烦。
- 在CM的RPD表格里,切换到Match Group视图,按Delta列排序。所有网络的Delta值应该位于Tolerance范围内,超差的网络一眼就能标红。
- 用Display > Element命令,选中任意一段蛇形线,可以查看它的精确长度和所在的层。检查时重点看同一组里是否有的线走在表层、有的走在内层,因为两者的实际延迟有差异,如果物理长度一样但延迟差很多,就要回去检查CM中是否把规则切成了ps单位。
- 执行Route > Analysis > Check? 不需要,直接跑Batch DRC Update All即可。DRC结果里看Spacing类错误是否集中出现在蛇形线区域,如果是,优先怀疑Wave Spacing。
- 有条件的话,把绕线完成后的板卡导入HyperLynx或SigXplorer做一次快速仿真,重点看绕线区域的阻抗连续性和串扰。这一步对DDR3以上频率的总线几乎不能省。
5. 回到真实板卡:DDR3/DDR4、USB、SerDes的等长差异
5.1 DDR系列:组内匹配、组间隔离
DDR3/DDR4布线的核心难点在于,等长的要求是有层级的,不是把所有DDR信号一锅端匹配。
数据线组DQ0-DQ7要相对DQS0等长。这是因为DDR读取时,数据信号是跟DQS同步的,DQ上的每一个bit都要在DQS的边沿处被采样,如果DQ和DQS到达的时间差超出容忍范围,采样就会出错。数据组等长容差一般在±20 mil到±50 mil之间,具体看主控芯片手册。地址线、控制线、命令线相对CLK的等长可以放宽到±100 mil甚至更宽,因为这些信号的建立保持时间预算比数据线充足。
DDR布线里还有一个坑是fly-by拓扑。地址/控制线采用fly-by串联结构时,信号要经过一颗颗颗粒依次到达,每经过一个颗粒都会产生一定的负载延迟。Allegro里如果用Net层面的等长规则,很难准确描述这种“逐级延迟”路径。我的做法是用XNet配合Pin Pair,把源端到每个颗粒的路径分别建出来,再做RPD,这样等长计算才贴近真实时序。
DDR还有一点要特别注意:不同层走线的延迟差异。表层微带线比内层带状线快大约5%到8%,如果一组DQ线里,有4根走在表层、4根走在内层,即使物理长度完全一致,实际到达时间也会差不少。等长规则带宽时,遇到这种跨层情况,不要把Tolerance设得太紧,否则绕线过程中永远有一两根线在DRC边缘反复横跳。
5.2 USB与SerDes差分等长
USB2.0的D+/D-差分对长度差最好控制在5 mil以内,DP/DM尽量在同一层、走同样的过孔数量。USB3.0的TX差分对和RX差分对之间一般不需要严格等长,因为接收端有CDR(时钟数据恢复)机制,可以对一定范围内的相位差进行补偿。但这里有个前提是差分对内部P/N必须尽量等长,否则会引入共模噪声,导致信号质量变差。
SerDes高速差分对的等长逻辑又不一样。PCIe、SATA这类总线依赖CDR恢复时钟,接收端能容忍几百ps的时间偏移,所以差分对之间通常不做严格的长度匹配。可是“对内等长”依然要做,一般要求在3 mil到5 mil以内。因为P和N的走线只要不对称,差分信号就会在转折处产生不必要的共模分量,这分量会通过参考平面耦合到别的信号上,反而制造EMI问题。
用Allegro给差分对绕等长时,有个很实用的操作:把Delay Tune命令的Options里Differential选项打开,这时Allegro会同时调整P和N两根线,自动保持两者长度差,不需要你分别绕。像我以前手动绕差分对,这边拉了5 mil,那边再去补5 mil,绕到最后两条线的蛇形波峰位置全错开了,看起来乱,信号也更差。
5.3 低速信号到底要不要等长
很多人一听到“等长”就觉得所有信号都要做,这其实是被培训资料带偏了。低速信号主要看建立保持时间是否满足,只要信号周期足够长、走线延迟占比小,物理长度差个几百mil根本不影响功能。
但我有一条个人经验:板子尺寸较大、走线超过3000 mil时,即使低速总线,我也会让同组信号的走线路径尽量一致。理由不是为了时序,而是为了减少“跨区域”带来的干扰差异——一组信号如果一半贴着晶振走、另一半贴着电源电感走,抗干扰能力就会有明显差异,系统在EMC测试时往往就会暴雷。这种情况下的“等长”更多是路径一致性,而不是真实时延匹配。
还有一个好习惯:在Layout阶段提前做“等长预规划”。也就是在布局完成、还没开始走线时,先在CM里把等长组建好,并且预估每根线的路径长度范围。比如DQS0基准线走在内层、距离约1800 mil,那DQ0-DQ7的绕线空间就要留足额外200 mil的蛇形区域。如果布局阶段不留这个空间,后面绕线时只能挤在狭小通道里,绕线质量一定好不到哪去。
6. 一次完整的等长布线自查清单
6.1 从规则设置到绕线完成的推荐流程
我在项目里把等长布线拆成了九个步骤,每个步骤卡住就停下排查,不硬往下走:
- 阅读器件手册,提取每组信号的等长容差要求(时间单位先记录好)。
- 打开CM,在Electrical页面创建Net Group和Match Group,指定Target。
- 确认Delta:Tolerance单位,优先使用ps表达,再换成mil做空间规划。
- 剔除重复的CSet归属,确保一个网络只受一组等长规则约束。
- 布局阶段预判每根线的走线长度和绕线空间,预留至少一个波峰的位置。
- 布线基本完成后,Review RPD表,找出超差的网络。
- 使用Delay Tune或手动绕线补齐长度差,边绕边看Delta。
- 跑Batch DRC,处理Spacing、Length、Neck等报错。
- 导出等长报告归档,并做一次仿真验证(高速信号必须做)。
这套流程看起来繁琐,但能大幅降低后期返工概率。我在多个项目里验证过,凡是跳过“第2步建Match Group”直接去绕线的,后面基本都要回过头补规则,绕了也白绕。
6.2 常见DRC错误与排查思路
最后把Allegro等长布线里最常见的几种DRC和排查思路列一下,这里面好几个坑都是我实际踩过的:
| DRC错误类型 | 报错含义 | 首选排查方向 |
|---|---|---|
| Relative Propagation Delay Violation | 等长关系不满足 | 打开CM的RPD表,按Delta排序,看具体偏差值 |
| Spacing Same Net Violation | 蛇形线相邻段间距不足 | 检查Wave Spacing是否小于3W,调整后重绕该段 |
| Etch Length by Order Violation | 按Pin Pair顺序的长度约束超限 | 检查Pin Pair创建是否正确,分支网络是否被错误合并 |
| Neck Width Violation | 绕线区域线宽被Neck Down改细 | 尽量取消Neck Down,保持整段走线线宽一致 |
| Stub Violation | 过孔到焊盘残桩超长 | 移动过孔或换层绕线,避免蛇形线贴近过孔区域 |
另外提一个排查技巧:DRC报告里如果同一根线反复报Spacing Violation,可以先执行一次Database Check(DBDoctor),确认不是数据文件异常导致的假报错。Allegro布板时间久了,数据库偶尔会有点小毛病,DBDoctor跑一遍能过滤掉不少假错,尤其是那些“明明看着间距够,DRC就是消不掉”的情况。
等长布线做到最后,我最大的体会是:规则占了四成,绕线技巧占四成,剩下两成是检查和复查流程。别小看这两成,跳过一遍Batch DRC,后面的光绘、贴片和硬件调试阶段可能会以十倍的时间还回来。尤其是从CM建立Match Group到Delay Tune绕线的整个链路,每一步都值得慢一点,落稳了再走下一步。