
做高速板子这些年经常有人在群里问同一个问题Allegro的等长设置里Delta和Tolerance到底怎么填有人填0/25有人填0/50还有人直接把Delta当成“最长一根线的长度”结果DRC永远消不掉。这篇文章我不会贴一堆截图而是先把这两个参数背后的时序逻辑讲透再按实际操路径完整走一遍最后把我在DDR3/DDR4板上踩过的坑一起列出来。如果你正在学Allegro布线或者准备做DDR、SerDes这类高速接口的等长约束这篇文章应该能帮你省下不少试错时间。我最早接触相对等长的时候也被Delta和Tolerance搞糊涂过。明明把所有线都绕到了同一个物理长度Constraint Manager里却还有红色报错后来才明白等长的本质不是“长度相同”而是“时序偏移可控”。Delta和Tolerance就是用来量化“偏移”的两个数字理解不了它们等于没有理解Allegro等长设置的核心。1. 为什么会有Delta和Tolerance这两个参数1.1 绝对等长与相对等长的本质区别很多工程师习惯用绝对等长。所谓绝对等长就是你给每一根网络单独指定一个目标长度比如所有数据线都要求 1500 mil正负 5 mil。每条线各自独立互不参照设置起来很直观在层叠结构比较规整、走线路径差异不大的情况下完全够用。但高速系统里信号是否同时到达接收端看的不是“每根线是否一样长”而是“信号与时钟边沿之间的时序余量”。拿DDR举例地址线、控制线必须相对于时钟线CK保持一定的建立时间和保持时间这意味着它们不能只看自身长度还要看与时钟线的延迟差。这时候绝对等长就力不从心了因为你不可能每根线都去手动算一条和目标时钟相差多少的“绝对长度”。相对等长就是为了解决这个问题设计的。相对等长把某一根网络作为参考基准比如时钟线然后要求其他信号线相对这根基准线的延迟差落在某个范围内。Allegro里实现这个约束的方式就是设置Delta和Tolerance。Delta是目标延迟差值Tolerance是允许的误差范围。1.2 时序余量才是最终目的为什么相对等长比绝对等长更适合高速链路因为芯片手册给出的时序参数本质上都是“时间”不是“长度”。例如一颗DDR3芯片可能要求地址信号相对于CK的偏移不超过正负50 ps换算成FR4板材上的走线延迟大约是正负10 mil左右。这个“偏移”的物理意义刚好对应Delta和Tolerance的语义。等长绕线只是手段满足时序才是目的。如果板子的叠层发生了变化比如外层微带走线和内层带状线走线的传播速度不一样两根物理长度完全相同的线延迟也可能差出一大截。相对等长直接以延迟为目标就能自动把这些因素纳入考量因为Allegro在计算时使用的是信号在具体层叠上的实际传播速度。1.3 什么场景必须用相对等长从我接触的项目看以下场景几乎强制要求使用相对等长DDR系列总线的地址线、控制线、命令线与CK/CLK的等长约束DQS与CK之间的等长DQ与DQS之间的等长并行总线中某些源同步接口比如RGB LCD的数据线与PCLK多个差分对之间需要保持组内相位关系时在这些场景下如果你只用绝对等长后续每当叠层变更或绕线路径调整目标长度可能就要重新算一遍非常痛苦。而用相对等长你只需要选定参考网络让Allegro自动处理延迟关系。2. 把Delta和Tolerance讲透2.1 Delta到底填多少不是只能填0Delta的意思是“目标延迟差”表示该网络的传播延迟相对于参考网络传播延迟的目标差值。单位可以是长度也可以是时间取决于你在Constraint Manager的Units里选择的是什么。最常见的填法是填0表示我们希望这条网络的延迟和参考网络延迟完全一致。但Delta并不仅仅只能填0。如果某个信号需要“比参考晚到达”一段时间比如数据相对于Strobe要提前一点或者滞后一点可以在Delta里直接填入这个差值。假设参考网络是DQS某根DQ需要比DQS晚到达50 ps那么Delta就填50 ps若单位是时间如果需要早到就填负数。我还见过一种用法就是在做“伪差分”或者“错相”走线时故意把两半电路的延迟差拉开用Delta来定义这个差异。虽然这种场景不常见但至少说明Delta并不是一个只能填0的死参数它代表的是一个可控的偏置。2.2 Tolerance值的工程含义与选择依据Tolerance是Delta的允许偏差范围。如果Delta0Tolerance25 mil含义是该网络的延迟与参考网络延迟之差可以比目标值少25 mil也可以比目标值多25 mil在这个区间内都算通过。Tolerance的取值直接决定绕线难度和DRC通过率。取值越小PCB上的布线空间压力越大有时为了满足过紧的Tolerance需要把线绕成密集的发夹形反而带来串扰和阻抗不连续问题。取值过大则失去等长意义信号偏到极限时可能破坏时序。具体选多大不能凭感觉。我的习惯是先查芯片数据手册中的时序参数把skew要求换算成长度公差。FR4板材上信号在表层微带线的传播速度大约是每英寸约85 ps内层带状线每英寸约140-160 ps。如果手册要求偏移不超过正负100 ps表层走线对应的长度公差大约是正负5 mil左右但要注意这通常指的是所有信号线之间的总偏移是需要分到各个因素里的不能全给布线公差。2.3 单位是mil还是psAllegro里的单位换算机制Allegro在等长设置里允许你使用不同的物理量单位常见选项有mil、mm、ps。很多人忽略了一点你在约束管理器里看到的Delta和Tolerance数值会随着全局单位设置改变。如果你的PCB板框单位是mil那么约束默认显示为mil如果把单位切换成psAllegro会自动按当前层叠的传播速度换算。这个换算不是简单乘一个固定系数而是基于信号经过的层叠路径。所以板子层叠设置不完整或者信号参考平面不连续Allegro算出来的延迟可能存在偏差。实际项目里我通常会先在Setup菜单里把Units设置为mil和ps同时显示等长设置用ps来约束因为时序参数本来就是ps可以减少来回换算出错的可能。3. 在Constraint Manager里完成等长设置的完整流程3.1 给总线创建Net Group和Match Group在Allegro中打开Constraint Manager后找到左侧Electrical Constraint Set下面的Routing再找到Relative Propagation Delay。右边Spreadsheet里会列出所有网络。我们要做的第一件事是把需要等长的网络归成组。我的习惯是先在Net Group层面做一次分类。比如DDR地址线一组控制线一组DQ字节通道一组。创建Net Group的方法是在Constraint Manager的树形菜单中选中Net Group右键创建然后把原理图中导出的网络名拖进去。这一步不需要管等长先把逻辑分组理顺。真正做等长约束用的是Match Group。Match Group是Net Group的“等长版本”它会在组内自动建立互相对比的关系是相对等长的载体。在Net Group上右键选择Create Match Group然后设置Delta和Tolerance。此时你在主界面能够直接看到组内所有网络的约束属性。3.2 关于Pin Pair需要提前确认的细节等长约束的前提是网络存在明确的两个端点也就是Pin Pair。Allegro中默认的Pin Pair是源端到负载端但一个网络可能连接多个器件引脚此时需要手动定义Pin Pair。比如DDR3地址线从控制器出来可能先连到第一个颗粒又通过T型拓扑连到后面几个颗粒。这时候Allegro会识别出多组Pin Pair每一组都要单独设置等长。很多人忽略这个问题只在Matching Length里看到一组Pin Pair后面绕线时发现怎么绕DRC都报错打开约束管理器一看原来好几组Pin Pair只设置了一组。处理方式很简单在Relative Propagation Delay界面中展开每一根网络检查Pin Pair列表。凡是实际需要等长的拓扑分支都要单独设置Delta和Tolerance。3.3 关键操作相对延迟窗口的配置在Match Group上右键选择Setup弹出的对话框里有几列关键信息Ref参考网络这里选择组内作为基准的那根网络DDR通常会选择CK或DQSDelta目标延迟差默认0Tolerance允许误差TargetAllegro自动计算的目标延迟值通常不用手填这里有一个容易混淆的地方Reference可以选一根网络也可以选另一个Match Group。如果你有多个Match Group需要互相之间保持延迟关系可以用Group作为参考。配置完成后一定要把约束管理器保存然后回到Allegro主界面执行“Update DRC”。等长规则不会自动生效不更新DRC的话即使设置错误界面上也不会报红。3.4 局部等长与全局等长的层级关系Allegro的约束是分层的包括System-levelComponent-levelNet-level引脚对级别电气约束集 ECSET等长约束可以挂在不同的层级上。最灵活的方式是创建一个ECSet在Set里面定义好Delta和Tolerance再把这个Set应用到多个NetGroup。好处是修改参数时只改一处所有网络随之更新不容易出现改了十几根网络结果漏掉一根的情况。我一般会把不同速率的总线分别建ECSet比如DDR3_800、DDR3_1600、PCIE这些各自独立方便在调试时比较不同速率下的约束松紧程度。4. 驱动DRC的规则引擎怎样让Delta和Tolerance生效4.1 规则与约束集合的绑定逻辑在Allegro里单纯在Constraint Manager里填好Delta和Tolerance还不够你还需要确认这条约束真正“绑定”到了网络上。绑定的方式通常有两种一是直接把约束赋给Net Group二是通过ECSet间接绑定。最容易出的问题是你在一个Net Group里设置了等长但物理网络上同时存在另一个优先级更高的约束集合。Allegro的DRC在检查时会以优先级最高的规则为准。如果高优先级的规则中没有配置等长原来设好的Delta和Tolerance就会被忽略。我的建议是在设置完成后回到Constraint Manager的最上层展开全部约束层级逐级确认当前网络最终生效的约束到底来自哪里。尤其在复用模块、导入参考设计时这种规则冲突经常发生。4.2 常见规则冲突为什么我设置了却不变色等长设置后PCB上走线不变色是最常见的求助问题原因通常有这么几个没有给网络匹配到正确的NetGroup或ECSet参考网络选择错误导致相对延迟计算无法执行Pin Pair类型没选对实际检查和约束要求的Pin Pair不匹配DRC没有刷新一个排查技巧是在PCB上点击网络打开Show Element对话框在“Net”属性里找到当前绑定的约束名字。如果显示为空说明约束没有绑定成功回Constraint Manager重新拖一遍Net Group即可。还有一个隐蔽问题总线中有一些网络是没有连接的dangling线头Allegro会把它当作另一个Pin Pair自动纳入等长检查导致虚报。这时在Constraint Manager里直接禁用多余的Pin Pair或者在原理图中解决断线问题。4.3 在PCB上查看等长状态的三种方法设置好之后查看等长状态有几种常用手段第一种选中一组网络在右侧Options面板中的“Measure”里选择“Relative”并指定参考网络屏幕上会显示每条网络的长度和延迟差。这种方式适合单根查询。第二种打开Constraint Manager的“Matching Length”界面可以像表格一样同时看到每一根线当前Delay、Delta、Tolerance和偏离情况。适合批量审查。第三种使用Allegro的“Timing Vision”功能在Display菜单下打开它能以颜色渐变的形式把当前网络延迟偏差直接绘制在PCB上。红色通常代表超差绿色代表满足规则非常直观。第三种方式也是我调试DDR时最常用的一种。绕线前后各看一眼哪根线该加长、哪根线已经超过限制一目了然。5. 实测中容易踩的坑和对应的解决办法5.1 参考网络选错导致整组误报一次做DDR3板子时我把地址线的参考网络选成了DQS结果整组地址线全部报错。原因看着很简单DQS和数据线是一个字节通道地址线应该参考CK而不是DQS。这个问题如果在原理图阶段没有标记清楚到布线阶段很容易点错。解决办法也很直接在Constraint Manager里把Reference重新改成CK更新DRC后立刻恢复。这件事给我的教训是参考网络的选择必须和芯片手册里的时序关系对应不要顺手选一个离得近的网络。5.2 Tolerance过小引发的无意义绕线有一版设计我把DDR数据线的Tolerance定得特别紧正负5 mil。结果绕线密度巨大甚至影响了布线通道板子做回来测试发现时序余量反而变差了。原因在于我为了追求长度完全一致把走线绕成很多相邻Vias的锯齿形增加了过孔数量也引入了更多阻抗不连续点。后来我查阅手册发现该接口本身的输入时序要求并不苛刻正负25 mil就足够了。放松Tolerance之后绕线长度减少了将近30%SI仿真结果也没问题。所以Tolerance不是越小越好的参数它需要匹配真实的芯片需求也需要给实际制造留出合理空间。5.3 绕线完成后DRC仍然报错的处理思路绕完线DRC仍然报警最常见的原因是绕线对象和约束检查的Pin Pair不一致。打个比方你约束的是U1到U2的Pin Pair但布线时把所有长度都绕在了U1到U3的分支上U1到U2的实际延迟自然不达标。这时候可以打开约束管理器的Pin Pair列表对比一下当前布线路径与约束目标。另一种快速定位方法是在Allegro中点击等长DRC标记它会高亮显示当前违反的具体约束对象顺着那个对象检查走线路径基本都能找到问题。如果检查完Pin Pair没问题再看是不是绕线到了不同层导致延迟计算偏差。同一根网络在不同层走线传播速度不同物理长度相同不代表延迟相同。处理方式是在约束中按层设置延迟系数或尽量让同一组等长网络走在相同层。6. 绕线操作与优化技巧6.1 用Delay Tune手动绕线时的参数设置Allegro的Route菜单里有Delay Tune功能它可以针对当前网络进行交互式绕线。打开后Options面板会显示当前网络的目标延迟、当前延迟、最大最小限制。绕线时屏幕上会出现一条动态的“蛇形线”预览显示还需要绕多长才能达标。我的实操习惯是先设置好Tolerance再打开Delay Tune因为它会根据你的Tolerance自动判断是否需要停止绕线。手动绕线方式下我偏好选择“Tab”模式的绕线形状把间距设置成不小于3倍线宽这样能减少串扰也方便修线。6.2 自动Gloss修线时对等长的影响很多网友搜过“Allegro自动修线优化工具 auto gloss”但我必须提醒自动Gloss修线时有可能会破坏原本做好的等长绕线。Gloss的作用是清除冗余vias、优化拐角、缩短走线路径这些操作都会改变延迟。正确的顺序是先跑完Gloss修线优化再进行等长绕线。如果已经绕好线再跑Gloss记得绕完后重新执行DRC确认所有等长约束仍然满足。Gloss中有一些选项可以控制是否保留Delay Tune形状比如在Gloss Controller里关闭“Clean Dangling Lines”和“Tune Delay”可以降低误伤概率。6.3 从数据手册获得Delta和Tolerance的经验值如果你没有现成的仿真结果首次做DDR等长时可以参考以下经验值不过最终必须以芯片手册为准DDR3地址/命令/控制线相对CKDelta取0Tolerance通常取正负10 mil到正负20 mil约正负85-170 ps视叠层而定DDR3 DQ与DQS同一字节通道内的DQ相对DQSDelta取0Tolerance取正负5 mil到正负10 milDQS相对CKDelta取0Tolerance取正负15 mil到正负30 mil一般并行总线如果手册只给出setup/hold time需要先折算成ps再通过叠层传播速率转换成长度公差另外不同品牌FPGA的DDR接口约束差异很大有的芯片内部带Write Leveling对等长要求相对宽松有的则严格要求所有信号相对时钟边沿对齐。不要照搬经验值要把Delta和Tolerance当成一个需要反复迭代的变量。我的做法是先用相对宽松的Tolerance把线布通再逐步收紧看布线是否还能实现同时观察时序仿真结果找到最合理的平衡点。在这些参数都理清楚之后Allegro的等长设置才算真正用对。其实Delta和Tolerance并不复杂关键是要理解它们是为了“时序偏移控制”服务而不是为了追求绝对相等。只要把参考网络选对Pin Pair理清楚单位换算把握好剩下的绕线工作反而是一遍遍练习就能熟练的手感。希望这篇内容能帮你少走我当年走过的弯路。