
1. 高速等长绕线的核心痛点拆解做高速数字设计的朋友尤其是碰过DDR、PCIe、SATA这类并行或源同步总线的大概率都经历过这样的场景明明在Allegro里把一组数据线的走线长度绕得整整齐齐误差控制在5mil以内结果板子打回来一测时序余量还是不够眼图塌得没法看。问题出在哪很多时候不是绕线本身没绕好而是你算的“长度”和芯片实际看到的“长度”根本不是一回事。这就是Pin Delay和过孔长度这两个东西在作祟。标题里提到的“Pin Delay与过孔长度对高速走线等长的影响分析”说白了就是要把这两个隐藏变量从幕后揪到台前。Pin Delay是芯片封装内部从die到引脚的那段走线延迟过孔长度是信号从表层换层到内层时在孔壁里爬的那段垂直距离。这两段在Allegro的走线长度统计里默认是不算进去的但信号跑起来的时候它们实实在在消耗时间。我见过太多项目等长规则里只填了走线长度Pin Delay没补过孔长度没扣最后时序怎么调都差一口气。这篇文章就是要把这套逻辑讲透从原理到Allegro里的具体操作再到实际项目中的参数计算和避坑经验全部摊开来说。不管你是刚接触高速等长的新手还是已经绕过几轮线想搞清楚底层逻辑的老手下面这些内容应该都能帮你省下不少调试时间。2. 为什么走线长度不等于信号传播时间2.1 等长的本质是等延迟而非等距离很多人入门的时候会有一个思维定式等长就是让几根线的物理长度一样。这个理解在低速时代没问题比如几十兆的并行总线走线长度差个几十mil信号到达时间差也就几个皮秒根本不影响采样。但到了DDR3-1600、DDR4-3200这个级别信号在PCB上的传播速度大约是每英寸140到180皮秒具体取决于板材的介电常数。你算一下100mil的长度差对应的时间差就是14到18皮秒。对于周期只有625皮秒的DDR4-3200来说这个偏差已经能吃掉相当一部分时序余量了。更关键的是芯片封装内部的Pin Delay和过孔带来的垂直延迟它们和走线延迟一样都是时间量。如果你只匹配了走线长度而忽略了这两段那就相当于在算总账的时候漏掉了两笔支出。等长的终极目标是让信号从发送端die到接收端die的总传播延迟一致而不是让PCB上的走线长度一致。2.2 Pin Delay的物理来源与影响量级Pin Delay是怎么来的芯片封装里面die上的焊盘通过键合线或者倒装焊凸点到封装的引脚这段路径不是理想导线它有电感、电容信号跑过去需要时间。不同封装的Pin Delay差异很大。举个例子普通的QFP封装引脚在四周键合线可能长一点Pin Delay能到几百皮秒而倒装焊的BGA封装路径短Pin Delay可能只有几十皮秒。同一颗芯片内部不同引脚的Pin Delay也不一样因为die上的位置不同到封装引脚的路径长度不同。这个数据从哪来芯片厂商的Datasheet或者IBIS模型里通常会给出。有些厂商会直接给一个Pin Delay表格单位是皮秒有些给的是封装走线长度你需要自己换算。最坑的是有些厂商什么都不给只给一个典型值这时候你就得留足余量或者找FAE要具体数据。我个人的经验是对于DDR这类对时序敏感的总线Pin Delay的差异如果不补等长绕得再漂亮也是白搭因为不同bit之间的Pin Delay差个几十皮秒太常见了。2.3 过孔长度为什么不能忽略过孔长度的影响更容易被忽视因为它在PCB上是一个垂直的物理存在Allegro的走线长度统计默认只算水平走线过孔那一段是不计入的。但信号经过过孔的时候确实要沿着孔壁从表层爬到内层这段距离就是过孔的长度。一个标准的通孔板厚1.6mm过孔长度就是1.6mm换算成延迟大约是9到10皮秒。如果是背钻过的过孔长度会短一些但依然存在。有人会说10皮秒而已能有多大影响单独看确实不大但你要想一组DDR数据线有8根如果其中几根换层了另外几根没换层那换层的线就比不换层的线多了过孔延迟。假设换层过孔长度是60mil延迟大约8皮秒8根线里如果有4根换层4根没换那这4根之间就凭空多了8皮秒的偏差。再加上Pin Delay的差异累积起来可能就超过时序预算了。所以过孔长度必须纳入等长计算尤其是当一组等长线里换层次数不一致的时候。3. Allegro中Pin Delay与过孔长度的处理机制3.1 Allegro的默认长度统计逻辑Allegro在Constraint Manager里看走线长度的时候默认显示的是Etch Length也就是PCB上的水平走线长度。它不会自动把Pin Delay加进去也不会把过孔长度算进去。这个设计本身没问题因为Pin Delay是芯片的属性过孔长度是叠层的属性Allegro把它们分开管理让你自己决定怎么组合。但问题就在于很多人不知道要去组合或者知道要组合但不知道怎么在Allegro里正确设置。Allegro其实提供了几个长度相关的参数Etch Length是纯走线长度Pin Delay是芯片引脚延迟Via Length是过孔长度Total Length是这几项的总和。你可以在Constraint Manager的Analyze菜单里选择显示哪些列。默认情况下Total Length可能没有打开你需要手动勾选。另外Pin Delay需要你手动输入到规则里Allegro不会自动从芯片模型里读除非你用了IBIS或者封装模型做了仿真提取。3.2 Pin Delay在Allegro中的录入方法录入Pin Delay有几种方式。最简单的是在Constraint Manager的Pin Delay选项卡里针对每个网络或者每个引脚手动输入数值。这种方式适合引脚数量少的情况比如一个DDR控制器只有几十个数据引脚手动输还能接受。但如果引脚上百个手动输就容易出错而且效率低。更高效的方式是用CSV文件导入。你可以从芯片Datasheet里整理出一个表格包含引脚编号和对应的Pin Delay值然后通过Allegro的Import功能批量导入。具体操作是在Constraint Manager里选择File Import Pin Delay然后选择你的CSV文件。注意CSV的格式要符合Allegro的要求一般是引脚编号、网络名、延迟值三列。导入之后Allegro会自动把这些值关联到对应的网络上。还有一种方式是通过IBIS模型提取。如果你有芯片的IBIS模型可以用Allegro的IBIS Editor或者Sigrity工具提取封装参数然后生成Pin Delay报告。这种方式最准确但前提是你能拿到高质量的IBIS模型而且模型里包含了封装信息。很多厂商的IBIS模型只包含die的缓冲器特性封装参数是单独给的这时候还是得回到手动或CSV导入的路子。3.3 过孔长度的计算与设置过孔长度在Allegro里不是自动算的因为Allegro不知道你的叠层结构里过孔具体跨了哪几层。你需要自己根据叠层来计算。比如一个8层板顶层到第三层的过孔长度就是顶层铜厚加介质厚度加第三层铜厚。这个计算需要你清楚每一层的厚度。通常PCB厂商会提供叠层报告里面有机介质厚度和铜厚。你把过孔跨越的几层厚度加起来就是过孔长度。在Allegro里设置过孔长度有两种思路。一种是在Constraint Manager里针对每个过孔手动输入长度值但这种方式很繁琐因为一个网络可能经过多个过孔每个过孔的长度可能不同。另一种思路是在规则里设置一个过孔长度的补偿值比如统一按最长过孔来补或者按平均过孔长度来补。更精细的做法是用Allegro的Via Length功能它可以根据叠层自动计算每个过孔的长度但前提是你的叠层设置要准确。我个人的习惯是对于DDR这类等长要求高的总线尽量让同一组线走同一层减少换层次数。如果必须换层尽量让同一组线换层的过孔长度一致这样即使不精确补偿组内偏差也小。如果做不到那就老老实实把每个过孔的延迟算出来加到等长规则里。4. 实际项目中的参数计算与等长规则配置4.1 从Datasheet提取Pin Delay数据拿到一颗DDR颗粒的Datasheet翻到封装信息那一章通常会有一个表格列出每个引脚的Pin Delay。单位可能是皮秒也可能是英寸或毫米。如果是长度单位你需要换算成时间。换算公式是时间 长度 / 传播速度。PCB上信号的传播速度大约是6英寸每纳秒也就是每英寸166皮秒。但封装内部的传播速度可能不同因为封装材料的介电常数和PCB不一样。如果Datasheet给的是长度最好确认一下它对应的传播速度或者直接找FAE要时间值。整理数据的时候要注意有些Datasheet只给了数据引脚的Pin Delay地址和控制引脚没给。这时候你需要判断地址和控制线是否也需要等长。对于DDR3和DDR4地址和控制线通常是以时钟为参考做等长它们之间的相对偏差要求比数据线宽松一些但Pin Delay的影响依然存在。如果实在拿不到数据可以按封装类型估一个典型值比如倒装焊BGA按50皮秒估键合线BGA按200皮秒估然后在时序预算里留够余量。4.2 过孔长度的精确计算方法过孔长度的计算需要叠层信息。假设你的板子是8层叠层如下顶层铜厚1oz介质厚4mil第二层铜厚1oz介质厚8mil第三层铜厚1oz。一个从顶层到第三层的过孔长度就是顶层铜厚加第一段介质厚加第二层铜厚加第二段介质厚加第三层铜厚。铜厚1oz大约是1.4mil所以总长度是1.4 4 1.4 8 1.4 16.2mil。换算成延迟16.2mil乘以每mil的延迟。每mil的延迟大约是0.166皮秒按6英寸每纳秒算所以16.2mil大约是2.7皮秒。这个计算看起来简单但实际叠层里介质厚度可能不是整数铜厚也可能有变化。更准确的做法是让PCB厂商提供阻抗计算报告里面会有每层的实际厚度。另外过孔在孔壁上的实际路径不是直线而是螺旋上升的但通常按垂直距离算就够用了误差在可接受范围内。4.3 在Constraint Manager中配置等长规则打开Allegro的Constraint Manager找到Relative Propagation Delay规则。这个规则是用来设置一组网络之间的等长关系的。你需要先创建一个Match Group把需要等长的网络加进去。然后设置目标长度通常是组内最长的那根线的长度或者你指定的一个基准长度。关键的一步是在规则里启用Pin Delay和Via Length的补偿。在Relative Propagation Delay的规则设置里有一个选项叫“Include Pin Delay”或者“Include Via Length”不同版本的Allegro叫法可能略有不同。勾选之后Allegro在计算总长度的时候会把这两项加进去。但前提是你已经在Pin Delay选项卡里录入了数据并且Via Length已经正确设置。还有一个细节是Delta Tolerance的设置。这个公差决定了组内线长允许的偏差范围。对于DDR4-3200数据线的等长公差通常要求在5mil以内换算成时间大约是0.8皮秒。这个要求非常紧所以Pin Delay和过孔长度的补偿必须精确到皮秒级别。如果补偿不准公差再紧也没用。5. 实操案例DDR4数据线等长绕线全流程5.1 项目背景与叠层设计假设我们有一个DDR4-3200的项目控制器和颗粒都是BGA封装板子是8层叠层从顶层到底层依次是信号层、地平面、信号层、电源平面、信号层、地平面、信号层、底层。数据线从控制器出来经过一个过孔换到第三层走一段之后再经过一个过孔换到第五层最后到达颗粒。颗粒的Pin Delay从Datasheet查到数据引脚D0到D7的Pin Delay分别是D045psD148psD242psD350psD446psD544psD649psD743ps。控制器的Pin Delay假设都是40ps。过孔长度方面顶层到第三层的过孔长度是16.2mil第三层到第五层的过孔长度是14.8mil。换算成延迟分别是2.7ps和2.5ps。注意如果一根线经过了两个过孔总过孔延迟就是5.2ps如果只经过一个过孔就是2.7ps或2.5ps。5.2 计算每根线的目标总延迟等长的目标是让每根线从控制器die到颗粒die的总延迟一致。总延迟 控制器Pin Delay PCB走线延迟 过孔延迟 颗粒Pin Delay。假设我们以D3为基准它的总延迟是50ps颗粒 40ps控制器 走线延迟 过孔延迟。其他线要匹配这个总延迟。先算D3的过孔延迟假设D3经过了两个过孔总过孔延迟5.2ps。那么D3的走线延迟 目标总延迟 - 50 - 40 - 5.2。但我们还不知道目标总延迟是多少因为走线长度还没定。实际上等长绕线是在布线过程中动态调整的你先布完一根线算出它的总延迟然后其他线向它看齐。更实际的做法是先布完所有线然后在Allegro里查看每根线的Etch Length、Pin Delay和Via Length算出总延迟。找出总延迟最大的那根线把其他线绕到和它一样。如果某根线的Pin Delay小那它的走线就可以长一点如果过孔延迟大走线就要短一点。5.3 在Allegro中查看和调整总长度布完线之后打开Constraint Manager在Relative Propagation Delay里查看每根线的Total Length。如果Total Length列没有显示右键点击列标题勾选Total Length。然后你会看到每根线的总长度这个总长度已经包含了Pin Delay和Via Length前提是你已经启用了补偿。如果发现某根线的总长度偏短你需要绕线增加它的Etch Length。绕线的时候要注意Allegro会实时更新Total Length你可以边绕边看。绕线的形状建议用蛇形线但要注意蛇形线的间距和幅度避免产生过大的串扰。通常蛇形线的间距至少是线宽的3倍幅度不要太大否则会引入额外的寄生参数。调整到所有线的Total Length都在公差范围内之后等长就算完成了。但别忘了这只是长度上的等长实际信号质量还要看阻抗匹配和串扰。等长绕线可能会让某些线的阻抗不均匀尤其是蛇形线密集的地方。所以绕完之后最好做一次SI仿真确认眼图没问题。6. 常见问题与避坑经验实录6.1 Pin Delay数据缺失怎么办这是最常见的问题。很多芯片的Datasheet里根本不提Pin Delay或者只给一个典型值。遇到这种情况我的建议是第一找FAE要通常原厂有详细的封装参数只是没放在公开Datasheet里第二如果实在要不到按封装类型估一个值倒装焊BGA按50ps估键合线BGA按200ps估然后在时序预算里留20%的余量第三对于DDR这种对时序敏感的总线如果Pin Delay差异大可以考虑用Fly-by拓扑让控制器到每颗颗粒的走线长度递增来补偿Pin Delay的差异。6.2 过孔长度补偿的精度问题过孔长度的计算依赖叠层厚度但实际板厂的叠层厚度和设计值可能有偏差。比如你按介质厚4mil算实际可能是4.2mil。这个偏差会导致过孔延迟算不准。我的经验是对于过孔长度补偿不要追求绝对精确而是追求组内一致。也就是说如果一组线都经过相同层数的过孔那过孔延迟的绝对值误差对组内等长影响不大因为大家都有同样的误差。真正要小心的是组内换层次数不一致的情况这时候过孔延迟的差异必须算准。6.3 等长绕线后的信号质量问题等长绕线绕得不好会引入串扰和阻抗不连续。我见过一个案例DDR4数据线为了等长绕了非常密集的蛇形线结果眼图几乎闭合。后来把蛇形线的间距从2倍线宽加大到4倍线宽眼图立刻改善。所以绕线的时候蛇形线的间距尽量大幅度尽量小绕线区域尽量远离其他敏感信号。另外如果绕线层有参考平面不完整的情况阻抗会突变这时候宁可换层绕线也不要在参考平面不完整的地方绕。6.4 常见问题速查表问题现象可能原因排查方法解决措施等长绕线后时序仍不满足Pin Delay未补偿检查Constraint Manager中Pin Delay是否录入并启用录入Pin Delay数据启用补偿组内线长一致但眼图差异大过孔长度未补偿检查Via Length是否计入Total Length计算过孔延迟启用Via Length补偿绕线后串扰增大蛇形线间距过小查看绕线区域的线间距加大蛇形线间距至3倍线宽以上Pin Delay导入后不生效CSV格式错误检查CSV列名和单位按Allegro模板重新整理CSV过孔延迟计算偏差大叠层厚度不准对比设计叠层和板厂实际叠层向板厂索要实际叠层报告7. 高速等长设计的进阶思路7.1 从等长度到等延迟的思维转变做了几年高速设计之后我越来越觉得等长这个词本身就有误导性。它让人以为只要长度一样就行但实际上我们追求的是延迟一样。延迟和长度之间差着介电常数、Pin Delay、过孔长度这些变量。所以我现在做等长的时候脑子里想的是“等延迟”而不是“等长度”。这个思维转变很重要它让你在设置规则的时候会主动去考虑那些隐藏的延迟来源而不是只盯着走线长度。7.2 利用仿真提前验证等长方案Allegro自带的Constraint Manager只能做长度层面的等长检查它不知道信号完整性怎么样。所以对于高速总线我建议在等长绕线之前先做一次预布局仿真用Sigrity或者HyperLynx提取拓扑看看在理想等长的情况下眼图能到什么水平。如果预仿真发现余量本来就不够那等长绕得再好也没用得从拓扑或者端接上想办法。预仿真还能帮你确定等长公差比如仿真显示公差可以放到10mil那你就不用费劲绕到5mil省时省力。7.3 与PCB厂商的协作要点过孔长度的准确性依赖叠层而叠层是PCB厂商做的。所以做高速板的时候一定要和板厂保持沟通。把你的叠层设计发给他们让他们确认是否可制造同时索要他们的实际叠层报告。有些板厂会主动提供过孔延迟的建议值这些数据比你自己算的更靠谱。另外如果板厂有背钻能力对于过孔长度敏感的信号可以考虑背钻来缩短过孔长度减少延迟。背钻虽然增加成本但对于DDR4-3200以上的速率有时候是值得的。7.4 不同总线类型的等长策略差异DDR、PCIe、SATA这些总线的等长策略不一样。DDR是并行总线组内等长要求高Pin Delay和过孔长度必须补偿。PCIe是差分总线它更关注差分对内的等长和差分对之间的等长Pin Delay的影响相对小一些因为差分信号对共模干扰不敏感。SATA类似。所以做等长的时候要先搞清楚总线的类型和时序要求再决定Pin Delay和过孔长度补偿的精度。对于DDR我通常会把Pin Delay和过孔长度都精确补偿对于PCIe差分对内等长做好就行Pin Delay可以忽略。我在实际项目里踩过最大的一个坑就是早期做DDR3的时候不知道Pin Delay这回事等长绕得完美结果时序怎么都调不通。后来找原厂要了Pin Delay数据重新算了一遍发现不同bit之间的Pin Delay差了将近80皮秒相当于走线长度差了快500mil。这个教训让我后来养成了一个习惯拿到任何一颗高速芯片第一件事就是找Pin Delay数据找不到就不敢开始布线。这个习惯帮我省了很多调试时间也希望对你有用。