
1. 高速数字设计中的等长控制到底难在哪做高速数字板子的朋友大概率都遇到过这样的场景DDR颗粒挂在主控下面地址线、控制线、数据线加起来几十根每一根都要求等长误差窗口还卡得特别死动不动就是±2mil、±5mil。你打开Constraint Manager看到那一长串网络头都大了。更麻烦的是有些拓扑不是简单的点对点而是一驱二、一驱四甚至T型分支加菊花链混着来这时候如果还靠传统的Pin-to-Pin等长规则去卡根本卡不住。我做了十几年PCB Layout从消费电子到通信设备都摸过Allegro的规则管理器算是用得比较透的。今天想聊的是Relative Propagation Delay这个功能——很多人知道它但真正把它用透、用来解决复杂拓扑等长控制的人不多。大部分教程只告诉你“可以设相对延时”但具体怎么设、Pin-Pair怎么配、Delta怎么算、T点怎么处理讲得含糊。这篇文章我打算把这些年踩过的坑和总结出来的实操方法一次性讲清楚。这篇文章适合谁看如果你已经会用Allegro画板子知道Constraint Manager的基本操作但在面对DDR、PCIe、SerDes这类需要严格等长的总线时总觉得力不从心那这篇内容就是给你准备的。我会从原理讲到实操从Pin-Pair的创建讲到Delta的计算再讲到复杂拓扑下怎么灵活运用Relative Propagation Delay最后附上常见问题和排查技巧。尽量说人话少堆术语多讲逻辑。2. 为什么Pin-to-Pin等长在复杂拓扑下会失效2.1 传统等长规则的局限性先说说为什么需要Relative Propagation Delay。在Allegro里最常见的等长设置方式是Pin-to-Pin模式也就是在Constraint Manager里选两个引脚设定它们之间的走线长度范围。这种方式对于点对点的连接非常直观比如CPU到DDR的一根数据线起点终点明确设一个长度区间就完事了。但问题在于当拓扑变复杂时Pin-to-Pin就力不从心了。举个典型的例子一个主控驱动两颗DDR颗粒地址线是T型拓扑从主控出来先走一段公共线然后分叉到两颗颗粒。这时候你要控制的是什么是从主控到第一颗颗粒的长度和从主控到第二颗颗粒的长度之间的差值。如果用Pin-to-Pin你得分别设主控到颗粒A、主控到颗粒B的绝对长度但这两颗颗粒的物理位置可能差很远绝对长度本身就不好统一更别说还要考虑分叉点之前的公共段。再比如有些设计里同一组总线的走线经过了不同的层过孔数量不一样传播速度就不一样。Pin-to-Pin只关心物理长度不关心延时差异这时候就需要一个能考虑传播延时的规则来兜底。2.2 Relative Propagation Delay的核心逻辑Relative Propagation Delay的思路和Pin-to-Pin完全不同。它不是设定两个引脚之间的绝对长度而是设定一组网络相对于一个“基准”的延时差值。你可以把它理解成我选一根线作为参考其他线跟它比长多少、短多少控制在某个范围内就行。这个“基准”可以是某一个Pin-Pair也可以是整个总线组里最长的那根。Allegro会自动帮你算出每根线相对于基准的Delta值然后你只需要设定一个允许的偏差范围。这样一来不管你的拓扑是T型、菊花链还是星型只要你能定义清楚Pin-Pair就能用相对延时来统一管理。关键点在于Relative Propagation Delay是基于Pin-Pair来工作的。Pin-Pair是什么简单说就是一对引脚之间的连接路径。在Allegro里你可以手动创建Pin-Pair也可以让软件自动生成。每个Pin-Pair都有自己的延时值Relative Propagation Delay就是比较不同Pin-Pair之间的延时差异。2.3 什么场景下必须用它我总结了几种必须用Relative Propagation Delay的场景一驱多拓扑一个驱动端连接多个接收端需要控制各分支之间的延时差。菊花链拓扑信号依次经过多个器件需要控制相邻器件之间的延时。跨层走线同一组信号经过不同层过孔数量不同物理长度相同但延时不同。DDR地址/控制总线通常是一驱二或一驱四用Pin-to-Pin很难统一管理。多负载时钟树时钟信号需要等延时到达各个负载。如果你做的板子有以上任何一种情况Relative Propagation Delay基本是绕不开的。3. Pin-Pair的创建与管理实操3.1 Pin-Pair的自动生成与手动创建在Allegro里Pin-Pair的创建有两种方式。第一种是自动生成当你把Constraint Manager打开在Relative Propagation Delay的表格里Allegro会根据你的网络连接关系自动列出所有可能的Pin-Pair。这种方式省事但有时候生成的Pin-Pair并不是你想要的比如它可能把中间经过的过孔也算作一个节点导致Pin-Pair数量爆炸。第二种是手动创建。我一般推荐手动创建尤其是在复杂拓扑下。操作路径是打开Constraint Manager找到Relative Propagation Delay工作表在对象栏里右键选择“Create Pin-Pair”。然后你需要指定两个引脚Allegro会计算它们之间的走线延时。手动创建的好处是你可以精确控制哪些引脚对需要参与等长比较。比如在一个一驱四的拓扑里你只需要创建驱动端到每个接收端的Pin-Pair而不需要创建接收端之间的Pin-Pair。这样表格会干净很多管理起来也方便。注意手动创建Pin-Pair时确保你选的引脚确实是信号路径的起点和终点。如果选错了Allegro算出来的延时值会完全不对。3.2 Pin-Pair的命名规范与分组Pin-Pair创建之后Allegro会给它一个默认名字通常是一串引脚编号看起来很不直观。我建议你手动重命名用“驱动端-接收端”的格式比如“CPU_DDR1_DQ0”这种。命名规范的好处是后面在表格里找起来快尤其是当你有几十个Pin-Pair的时候。分组也很重要。Allegro允许你把相关的Pin-Pair放到同一个组里比如所有DDR数据线的Pin-Pair放一组地址线的放另一组。分组之后你可以对整个组设置统一的Relative Propagation Delay规则不用一个个去设。分组的操作是在Relative Propagation Delay工作表里选中多个Pin-Pair右键选择“Group”然后给组命名。组名建议用总线名称比如“DDR_DQ_GROUP”。3.3 Pin-Pair与网络的关系这里有一个容易混淆的点Pin-Pair和网络Net不是一回事。一个网络可以包含多个Pin-Pair比如一根DDR数据线从CPU到DDR颗粒中间可能经过一个串联电阻那就有两个Pin-PairCPU到电阻、电阻到DDR。这两个Pin-Pair的延时加起来才是整个网络的延时。所以在设置Relative Propagation Delay时你要明确你比较的是哪个层级的延时。如果是整个网络的延时那需要把同一网络的所有Pin-Pair延时加起来再比较。Allegro在Relative Propagation Delay工作表里有一个“Total Etch Length”列显示的就是整个网络的总延时这个值可以直接用来做相对比较。我个人的习惯是对于没有串联元件的网络直接用Pin-Pair的延时对于有串联元件的用Total Etch Length。这样比较直观也不容易出错。4. Delta值的计算逻辑与设置技巧4.1 Delta到底是什么Delta在Relative Propagation Delay里指的是“相对于基准的延时差值”。Allegro会自动选一个基准通常是组里延时最大的那个Pin-Pair然后计算其他Pin-Pair与它的差值。这个差值就是Delta。举个例子假设一个组里有三根线延时分别是1000ps、1010ps、1020ps。Allegro会把1020ps那根作为基准另外两根的Delta分别是-20ps和-10ps。然后你设定一个允许范围比如±15ps那1000ps那根就超标了因为它的Delta是-20ps超出了-15ps的下限。这里的关键是Delta是一个相对值不是绝对值。你不需要关心每根线的绝对延时是多少只需要关心它们之间的差异。4.2 如何设定合理的Delta范围设定Delta范围是整个流程里最考验经验的一步。设得太松等长控制没意义设得太紧布线根本绕不出来。我一般会按照以下步骤来确定第一步确认信号的时序要求。比如DDR4的数据线通常要求组内偏差在±5mil以内换算成延时大概是±0.8ps左右具体取决于板材的传播速度。但这个值太紧了实际布线很难做到所以通常会放宽到±10mil甚至±15mil。第二步评估布线的物理空间。如果你的板子密度很高绕线空间有限那Delta范围就得适当放宽。我一般会先设一个理论值然后在布线过程中根据实际情况调整。第三步留出余量。理论计算出来的值往往是最理想的情况实际布线中会有各种意外比如过孔、跨层、串扰等。所以我通常会在理论值的基础上留20%-30%的余量。提示Delta范围的单位可以是长度mil也可以是时间ps。我建议用时间单位因为不同层的传播速度不同用长度单位容易产生误导。4.3 Delta计算中的常见误区很多人以为Delta就是两根线的物理长度差其实不是。Allegro在计算Delta时会把过孔、跨层等因素都考虑进去算的是传播延时。所以有时候两根线物理长度一样但Delta不为零就是因为过孔数量不同。另一个误区是以为Delta是相对于最长的那根线。实际上Allegro默认是相对于组内延时最大的Pin-Pair但你可以手动指定基准。在Relative Propagation Delay工作表里有一列叫“Base”你可以勾选某一根线作为基准。这个功能在调试时特别有用比如你想让所有线都对齐到某一根特定的线就可以手动指定。还有一个坑当你修改了基准之后所有Delta值都会重新计算。如果你之前已经根据旧的Delta值调整了布线修改基准后可能需要重新调整。所以建议在布线之前就把基准确定好不要中途改。5. 复杂拓扑下的等长控制实战5.1 一驱二T型拓扑的处理方法一驱二T型拓扑是DDR设计里最常见的。主控出来一根线走到某个点分叉分别连到两颗DDR颗粒。这种拓扑的等长控制目标是从主控到两颗颗粒的延时尽可能一致。处理方法是创建两个Pin-Pair分别是主控到颗粒A、主控到颗粒B。然后把这两个Pin-Pair放到同一个组里设置Relative Propagation Delay规则。Allegro会自动比较这两个Pin-Pair的延时你只需要设定一个允许的Delta范围。但这里有个细节分叉点之前的公共段它的延时是算在哪个Pin-Pair里的答案是两个Pin-Pair都包含这段公共延时。所以如果你发现两个Pin-Pair的Delta总是很大可能是因为分叉点之后的两段线长度差异太大需要调整分叉点的位置或者绕线。我一般的做法是先把分叉点放在两颗颗粒的中间位置让两边的分支长度尽量接近。然后再用Relative Propagation Delay来微调。5.2 菊花链拓扑的等长策略菊花链拓扑在DDR3、DDR4里也很常见尤其是当颗粒数量多的时候。信号从主控出发依次经过颗粒1、颗粒2、颗粒3……每个颗粒都挂在这条链上。这种拓扑的等长控制比较复杂因为每个颗粒到主控的延时都不一样。如果你用Pin-to-Pin需要设很多条规则用Relative Propagation Delay可以简化很多。具体做法是创建主控到每个颗粒的Pin-Pair然后把这些Pin-Pair放到同一个组里。但这里要注意菊花链的延时是累积的颗粒3的延时包含了颗粒1和颗粒2的段。所以你不能简单地比较主控到颗粒1和主控到颗粒3的延时因为后者天然就大很多。正确的做法是比较相邻颗粒之间的延时差。比如主控到颗粒1的延时是T1颗粒1到颗粒2的延时是T2颗粒2到颗粒3的延时是T3。你需要控制的是T2和T3之间的差异而不是T1和T3之间的差异。在Allegro里你可以创建颗粒1到颗粒2、颗粒2到颗粒3这样的Pin-Pair然后比较这些Pin-Pair的延时。这样就能精确控制每一段的等长。5.3 跨层走线的延时补偿跨层走线是另一个让人头疼的问题。同一组信号有的走在顶层有的走在内层过孔数量不同传播速度也不同。顶层的传播速度通常比内层快因为顶层是微带线内层是带状线介电常数不同。这种情况下即使物理长度一样延时也会有差异。Relative Propagation Delay可以很好地处理这个问题因为它算的是延时不是长度。我的做法是先按照物理长度把线走完然后用Relative Propagation Delay检查Delta。如果发现某根线的Delta偏大说明它的延时偏大可能是过孔太多或者走了较慢的层。这时候可以通过增加绕线来补偿或者调整层分配。注意跨层走线时过孔的延时不可忽略。一个过孔大约相当于10-20mil的走线延时具体取决于板厚和孔径。如果一组信号里有的线过了3个孔有的只过了1个孔那延时差异可能达到20-40mil这在高速信号里是致命的。5.4 多负载时钟树的等长实现时钟树的等长控制和DDR总线类似但要求更严格。时钟信号通常要求所有负载的延时偏差在很小的范围内比如±2mil。处理方法是创建时钟源到每个负载的Pin-Pair放到同一个组里设置Relative Propagation Delay规则。基准通常选延时最大的那个Pin-Pair然后其他Pin-Pair的Delta控制在允许范围内。时钟树的一个特殊之处是有时候需要在分支点加串联电阻或者端接这会引入额外的延时。在创建Pin-Pair时要把这些元件考虑进去确保Pin-Pair的起点和终点是正确的。我做过一个通信板子的时钟树一个时钟源驱动8个负载用了Relative Propagation Delay之后所有负载的延时偏差控制在±3mil以内实测信号质量很好。6. 常见问题与排查技巧实录6.1 Delta值异常偏大的排查思路在实际操作中最常见的问题就是某个Pin-Pair的Delta值异常偏大。遇到这种情况我一般按照以下顺序排查首先检查Pin-Pair的创建是否正确。有时候手动创建Pin-Pair时选错了引脚导致Allegro算出来的延时完全不对。解决方法是在Constraint Manager里选中该Pin-Pair右键选择“Show Element”看看它实际连接的引脚是不是你想要的。其次检查是否有未连接的走线。如果某段走线没有完全连接Allegro可能算不出完整的延时导致Delta异常。解决方法是用“Display Element”或者“Tools Reports”检查网络连通性。再次检查是否有过孔或跨层导致的延时差异。如果某根线过了很多孔延时自然会大。解决方法是在Relative Propagation Delay工作表里查看“Via Count”列对比各Pin-Pair的过孔数量。最后检查基准是否选对了。如果基准选错了所有Delta值都会偏。解决方法是手动指定一个合理的基准然后重新计算。6.2 Pin-Pair无法创建或识别的情况有时候你会发现某些引脚之间无法创建Pin-Pair或者创建了但Allegro不识别。这通常是因为以下几个原因引脚之间没有电气连接。Pin-Pair的前提是两个引脚之间有实际的走线连接如果没有连接Allegro不会创建Pin-Pair。引脚属于不同的网络。Pin-Pair只能在同一个网络内创建跨网络的引脚对不能创建Pin-Pair。引脚被锁定或者被其他规则覆盖。如果引脚已经被其他规则锁定可能无法创建新的Pin-Pair。解决方法是先检查网络连接确保两个引脚在同一个网络上且有实际走线。然后检查是否有其他规则冲突必要时先删除旧规则再创建新的。6.3 规则冲突与优先级管理Allegro的规则管理器支持多层规则不同层级的规则可能有冲突。比如你在Pin-to-Pin里设了一个长度范围又在Relative Propagation Delay里设了一个Delta范围两者可能矛盾。我一般的做法是对于需要等长控制的总线只用Relative Propagation Delay不用Pin-to-Pin。这样可以避免规则冲突。如果确实需要同时使用那就要注意规则的优先级。在Constraint Manager里规则的优先级是从上到下递减的你可以通过拖拽调整顺序。提示如果发现规则不生效先检查优先级。很多时候不是规则设错了而是被更高优先级的规则覆盖了。6.4 常见问题速查表问题现象可能原因解决方法Delta值异常偏大Pin-Pair创建错误检查Pin-Pair连接的引脚Delta值异常偏大走线未完全连接检查网络连通性Delta值异常偏大过孔数量差异大查看Via Count列调整过孔Pin-Pair无法创建引脚无电气连接检查走线连接Pin-Pair无法创建引脚属于不同网络确认网络归属规则不生效规则优先级冲突调整规则优先级规则不生效规则未应用到对象检查规则的作用范围布线后Delta超标绕线不足增加绕线或调整层分配布线后Delta超标基准选择不当手动指定合理基准6.5 实操心得与避坑建议最后分享几个我这些年总结的心得第一尽早设置规则。不要等布线完了再设等长规则那时候调整成本很高。我一般是在布局完成后、布线开始前就把Relative Propagation Delay规则设好这样布线时就有目标不用反复调整。第二善用颜色标记。Allegro允许你给不同的Pin-Pair组设置不同的颜色这样在PCB上看起来一目了然。我通常会把Delta超标的线标成红色正常的标成绿色方便快速定位问题。第三定期检查Delta。不要等到布线全部完成才检查我一般每完成一组总线就检查一次发现问题及时调整避免最后积重难返。第四留足绕线空间。等长控制本质上是通过绕线来补偿延时差异所以布线时要留足够的空间。如果空间不够再怎么调规则也没用。第五记录每次调整。等长控制是一个反复迭代的过程我习惯用Excel记录每次调整的参数和结果方便回溯和对比。7. 从规则设置到实际布线的衔接规则设好了不代表布线就能自动等长。Allegro的规则管理器只是告诉你目标是什么实际怎么绕线还是得靠手动或者自动布线工具。我一般会先用自动布线工具跑一遍让Allegro自动绕线到接近目标然后再手动微调。自动绕线的时候Allegro会根据Relative Propagation Delay规则自动计算需要绕多少。但自动绕线有时候会绕得很丑或者占用太多空间。所以我的做法是先用自动绕线跑一个大概然后手动调整关键路径把绕线做得更紧凑、更美观。手动绕线时我一般会用“Delay Tune”功能。这个功能可以实时显示当前走线的延时和Delta值方便你边绕边看。操作方法是在走线状态下右键选择“Delay Tune”然后拖动鼠标就可以增加绕线。Allegro会实时显示当前的延时值你可以根据这个值来决定绕多少。还有一个技巧对于差分对Relative Propagation Delay同样适用。你可以创建差分对的Pin-Pair然后设置组内和组间的Delta规则。差分对内部的等长通常要求更严格一般控制在±5mil以内组间的等长可以适当放宽。实际布线中我最常遇到的问题是绕线空间不够。尤其是高密度板子走线通道很窄绕线很容易和其他信号冲突。这时候我的做法是优先保证关键信号的等长非关键信号可以适当放宽。如果实在绕不开可以考虑调整层分配把一些信号放到内层去走。另外过孔的影响不能忽视。我一般会尽量减少过孔数量尤其是对于等长要求严格的总线。如果必须过孔尽量让同一组信号的过孔数量一致这样延时差异会小很多。最后说一个细节Allegro的Relative Propagation Delay规则在布线完成后可以通过“Analyze Constraint Manager”来验证。如果发现有超标Allegro会高亮显示你可以直接定位到问题走线进行调整。这个功能在最终检查时特别有用建议每次布线完成后都跑一遍。等长控制这件事说到底是一个平衡的艺术。规则设得太严布线绕不出来设得太松信号质量没保障。我的经验是先根据时序要求算出理论值然后根据实际布线空间适当放宽最后通过实测来验证。多做几块板子自然就有感觉了。