ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

高速PCB设计中的Pin Delay与过孔长度:Allegro等长设计实战

高速PCB设计中的Pin Delay与过孔长度:Allegro等长设计实战 做高速PCB设计这些年Cadence Allegro一直是我主力工具群里也天天有人问DDR、PCIe接口等长怎么绕、过孔怎么打才不影响信号。说实话很多问题的根子最后都能落到一个特别容易被忽略的参数上就是Pin Delay以及它的“好兄弟”——过孔长度。这两个东西单独看都不难理解但它们叠加起来对高速信号完整性的影响绝对是决定一块板子能不能跑稳的关键。这篇文章我想把自己在实际项目中用Allegro分析Pin Delay和过孔长度影响的经验完整梳理一遍。适合正在做DDR3/DDR4、PCIe、SerDes这类高速接口的硬件工程师、PCB Layout工程师以及刚入门SI分析、想搞明白约束管理器里那一堆等长规则到底怎么回事的朋友。我会从概念原理讲到Allegro里的具体操作再结合一个完整的等长计算案例和几个我调试过的真实问题场景把这里面的门道一次说透。1. 内容整体设计与思路拆解1.1 从一次DDR3跑不稳说起先讲个我自己的经历。之前做一块ARM嵌入式主板DDR3跑800MHz眼图张得也不错但就是温度一上来就开始随机报错概率还不低。查了半天电源纹波没问题参考平面完整阻抗也连续最后把矛头指向了等长关系。当时按照常规做法只约束了“外走线等长”也就是把这些地址线、控制线在PCB外层实际走出来的那部分长度对齐误差控制在20mil以内看起来没毛病。可问题恰恰出在芯片封装内部的Pin Delay上——BGA封装焊盘到die内部走线长度并不一致有的引脚相差几十个mil甚至上百个mil。这个差异如果不处理哪怕外层走线做得再完美实际到达接收端的总延迟依然是参差不齐的。后来我把芯片的Pin Delay数据从IBIS模型里导出来灌进Allegro约束管理器里重新算了一遍内外总长度再按这个总长度去绕线问题立刻消失了。这个案例让我意识到一个核心要点等长设计不是“看走线长度”而是“看总延迟”。Pin Delay就是那个补齐“芯片内部看不见的长度”的关键角色。1.2 Pin Delay是什么它为什么会影响时序Pin Delay翻译过来叫引脚延迟指的是信号从芯片die内部出发经过bonding wire绑定线、lead frame引线框架最后到封装引脚也就是焊盘之间这段路径产生的传输延迟。你可能会想这段路径总共才几毫米能差多少还真能差不少。不同引脚在封装内部走线长度完全不同。比如BGA封装核心区域的引脚和边缘区域的引脚在封装基板上的走线长度差异可以达到几十毫米。对于FR4材质信号传播速度大约是6mil/ps也就是1英寸的信号要走大约167ps。如果一个封装的Pin Delay最大值和最小值相差200ps那它对应的等效走线长度差就是1.2英寸。这是什么概念DDR3-1600的地址线建立时间余量也就一百多ps这一个Pin Delay差异就足以把时序预算吃得干干净净。所以Allegro里做等长设计正确思路是“总长度 外部走线长度 Pin Delay等效长度”。这也是为什么约束管理器里会有个专门概念叫Total Etch Length它就是把Pin Delay叠加上去以后的总长度。1.3 过孔长度为什么也算“隐性长度”过孔对信号的影响很多人只关注阻抗不连续和寄生电容容易忽略一个问题就是过孔本身也是一段传输线它有实际的物理长度有延迟还有可能产生谐振。打个比方过孔就像高速公路上的一个桥洞。车信号从路面开到桥洞里再开出来这个洞本身无论多短车总要花时间去穿越。过孔的物理长度就是桥洞的长度信号穿越它的时间就是过孔延迟。更麻烦的是过孔还分via stub过孔残桩也就是信号在某个内层换层时过孔从换层位置到板底这段没被使用的部分。这段残桩表面看是“多余的”但在高速信号眼里它是一段一端接地的传输线会反射信号在特定频率上产生谐振。我用Sigrity跑过仿真一个10Gbps信号穿过一个12mil厚的板子如果via stub长20mil谐振频率大概在6GHz附近正好落在信号的谐波频段上那眼图会变得惨不忍睹。所以在2.5Gbps以上的设计中via stub控制得越短越好能背钻就背钻。1.4 两个因素叠加才是完整的高速链路看到这里你应该明白了高速信号跑在一整条链路上从发送端die出发穿过封装、焊盘、外层走线、过孔、内层走线再穿过接收端封装到达接收端die。链路中的每一个环节都有延迟Pin Delay管的是封装那两段过孔管的是换层那几段。Allegro里做时序收敛必须把这两部分一起算进总长度约束。我见过很多工程师总长度设置很严格但就是忘记把Pin Delay导进去结果绕线绕得累死实际上时序还是不对。也见过有人把过孔统一加了固定延迟值但没有考虑不同过孔的位置、层数结果同样出问题。正确的做法是在约束管理器里把Pin Delay灌进去然后用Total Etch Length做等长。同时对于过孔要么在叠层设计上统一各个信号的出线层要么用背钻去除stub确保过孔产生的延迟一致性。2. 核心细节解析与实操要点2.1 Allegro约束管理器里怎么看Pin DelayAllegro里处理Pin Delay主要是靠约束管理器Constraint Manager和IBIS模型配合。第一步从芯片厂商网站下载对应器件的IBIS模型里面通常含有封装RLC参数和Pin Delay信息。有的芯片手册里也会直接给出各引脚的封装延迟表一般是Excel或PDF格式。第二步打开Allegro约束管理器在Physical约束里找到Pin Delay的配置入口。如果是16.6及以上版本可以直接通过菜单Setup - Constraints - Constraint Manager在Modes里启用Pin Delay相关规则然后手动录入各个引脚的Pin Delay值。第三步如果你的设计规模大引脚多手动录入显然不现实。这时推荐用Allegro的Signal Integrity工具或直接写Skill脚本批量导入。我自己的习惯是先把芯片手册里的Pin Delay数据整理成CSV然后用Cadence自带的Model Integrity导入IBIS封装信息让Pin Delay自动匹配到器件上。这里说个关键技巧Allegro中查看单个PIN的Pin Delay可以用菜单Display - Element然后选中引脚在弹出的信息框里查看DELAY属性。或者在约束管理器里右键选择“Show Delay”把延迟值直接显示在PCB界面上这样绕线的时候能实时看到这个引脚还有多少余量特别实用。2.2 过孔结构参数如何影响信号延迟和谐振过孔的长度和它带来的延迟跟几个关键参数直接相关。第一个是过孔贯穿的叠层厚度这个越长信号穿越时间越长。第二个是过孔stub长度这是影响最大的因为它会在过孔和走线连接处形成一个阻抗不连续点信号经过时一部分被反射一部分继续前进反射信号在stub末端又反射回来来回震荡几次就会叠加到原始信号上。过孔stub谐振频率有一个经典估算公式F_resonance c / (4 × L_stub × sqrt(ε_r_eff))其中c是光速L_stub是残桩长度ε_r_eff是过孔周围介质的等效介电常数。我算一个实际案例给你看。8层板板厚1.6mm介电常数4.2如果信号在第6层走线过孔从第1层到第6层的stub长度大概就是第6层到第14层焊盘的距离。假设层间距0.2mm那一共是1.6mm。套进公式谐振频率约等于c / (4 × 1.6mm × sqrt(4.2)) ≈ 23GHz。对于10Gbps信号主要能量集中在5GHz的奇次谐波上这个谐振频率不算致命但如果stub更长比如板厚3.2mm那谐振频率降到11.5GHz正好卡在信号的高次谐波上影响就非常明显了。另一个需要注意的问题是过孔孔径和反焊盘尺寸。孔径大了寄生电容大反焊盘小了阻抗偏低。Allegro里可以在Padstack Editor里定义一个过孔的阻抗配合叠层信息计算。一般建议高速信号过孔的反焊盘直径做到孔径的2.5倍以上这样阻抗更接近走线阻抗。2.3 等长设计时过孔长度是加还是不加这个问题我见过很多讨论结论是等长设计时过孔的物理长度和它在信号路径中贡献的延迟应当计入总延迟。但这里有个容易混淆的点Allegro的Etch Length计算的是走线长度不包含过孔长度。所以你在约束管理器里看到的走线长度实际不等于信号真正的传输路径长度。当你的设计里有大量换层时走线长度一样但实际延迟差很多的“幻觉”就会出现。举个例子A信号全程走表层B信号走到一半换个层再继续走。两者的平面走线长度做成一样但因为B信号多穿了一次过孔过孔的延迟等效于大约20-30mil的走线长度取决于板厚所以B信号实际会更慢。严格的做法是在约束管理器里设置Total Etch Length时把所有过孔统一折算成等效走线长度加进去。Allegro的CSV导入功能支持你手动加一个过孔补偿值也可以在规则设置里利用Vias的Delay参数给每种过孔设定一个延迟值系统自动计算总延迟。不过在实际工程中更常用的做法是因为一块板子上所有信号换层情况基本一致所以过孔延迟差异比较小Pin Delay反而是主要矛盾。这种情况下很多团队直接忽略过孔间的差异把重点放在Pin Delay上。但如果你的设计里有信号走线层选择策略不同比如DDR地址线走内层数据线走外层那过孔贡献的差异就不能忽视了。2.4 高速设计中Pin Delay和过孔长度必须一起查的4个场景不是所有设计都必须要关注Pin Delay和过孔长度但下面这四个场景里如果你不关注就等着调试时崩溃吧。第一个是DDR系列接口尤其是DDR3及以上。DDR的地址/控制线是单端信号时序余量本来就紧而且这些信号用的驱动器是ODT本身的摆率也有限。Pin Delay稍有偏差直接吃掉建立时间或保持时间余量。第二个是PCIe、SATA这类高速串行接口的发送端和接收端的参考时钟。串行信号本身有CDR恢复时钟理论上不需要做等长但参考时钟如果因为封装延迟和过孔延迟导致抖动超标CDR也会跟着罢工。这种情况下Pin Delay主要影响的是时钟到数据的时序关系而不是数据线之间的等长。第三个是SerDes接口的RX/TX差分对内部。差分对内两条线的Pin Delay差异会造成共模噪声增加表现为EMI变差、眼高下降。在Allegro约束管理器里这对应的是Differential Pair的Mismatch规则Pin Delay差异也会被算进去。第四个是芯片之间距离很近、走线很短但频率很高的场景比如FPGA到DDR颗粒距离只有几百mil。很多人觉得走线这么短等长随便绕一下就行殊不知芯片本身的Pin Delay差异可能比走线长度还大这时候不查Pin Delay等于白干。3. 实操过程与核心环节实现3.1 准备IBIS模型和Pin Delay数据我先说数据怎么来再说怎么进Allegro。如果你用的是主流芯片比如Xilinx、Altera/Intel、TI、MicronIBIS模型基本都能在官网找到搜索“芯片型号 IBIS Model”就行。下载下来是一个.ibs文件用文本编辑器打开找到[Pin]段里面会列出每个引脚名字、封装RLC参数。但注意IBIS模型里有的引脚延迟表是另一套格式叫[Pin Mapping]没有延迟信息。真正包含延迟的是封装描述段比如这些关键行[Pin] signal_name model_name R_pin L_pin C_pin A1 DATA0 DQ 0.5 2.1nH 0.8pF要把L_pin引脚电感、C_pin引脚电容准确还原成Pin Delay可以通过公式估算Pin Delay ≈ L_pin / (2 × Z0) C_pin × Z0 / 2。不过这个算出来的是近似值精度要求高的项目建议用厂商提供的封装延迟Excel表格那些通常是经过仿真和实测校准过的直接读数更靠谱。拿到数据之后整理成这样的CSV格式第一列RefDes器件位号第二列Pin Number第三列Pin Delay值单位可以是ps或mil等效走线长度。Allegro里更习惯用mil来当单位因为等长规则都是用mil控制的。3.2 在Allegro中导入Pin Delay并匹配器件导入这个动作Allegro没有提供特别直观的菜单但可以通过两种方式实现。第一种是手工录入。在约束管理器的Physical - Pin Delay里找到对应器件右键选择“Pin Delay”然后逐个引脚输入延迟值。适合那种器件只有几十个引脚、且只关心特定信号的场景。第二种是批量导入效率高得多。先进入Allegro PCB Editor菜单File - Import - Pin Delay选择CSV文件。注意CSV里的器件位号和引脚名称必须与原理图网表完全匹配否则匹配不上。如果导入后想验证是否正确可以再用Display - Element选取一个引脚查看它的Pin Delay属性值。这里要特别提醒一个坑很多工程师不知道Pin Delay的单位是可以配置的。约束管理器右下角的Units设置把延迟单位从ps改成milAllegro会自动按当前叠层传播速度折算。如果你是从CSV里导入ps数据但当前单位设置是mil它不会自动换算会在数值层面直接载入一定要确认好单位一致再导入否则结果差好几倍。导入完成后进入约束管理器的Electrical - Total Etch Length就会看到每个网络的Total Length Etch Length Pin Delay Length。这时候你看那些Pin Delay比较大的网络Total Length和Etch Length会有明显差异这就是下一步等长绕线的依据。3.3 在约束管理器里设置Pin Delay等长规则具体设置步骤我按Allegro 17.4版本操作来写16.6也差不多就是菜单路径稍有变化。打开约束管理器在Electrical面板里找到Total Etch Length规则。右键新建一个规则命名比如叫DDR3_ADDR_LEN。点击Rule设置输入最小长度和最大长度比如DDR3地址线在400MHz下要求总长度差控制在±25mil以内就可以填Min 1000milMax 2000mil具体范围看你板子的物理尺寸。设置完成后回到PCB Editor界面用约束管理器工具栏里的“Show”按钮选择Total Etch Length把每个网络的当前总长度显示在PCB上。这时候你会看到有的网络总长度值比走线长度大很多那就是Pin Delay在起作用。然后进行等长绕线。绕线时Allegro的Timing Vision功能特别有用它能实时显示当前网络和基准网络之间的长度差距还能显示Pin Delay带来的差异。绕线状态栏里会有“Current”和“Target”两个值Current是当前Total LengthTarget是你要对齐的目标值。用这个功能绕DDR总线效率比我早年纯靠肉眼和报表快了非常多。3.4 过孔长度对总延迟的量化评估操作前面说了理论这里说怎么在Allegro里量化过孔长度对延迟的影响。第一种方法是用Cadence的PowerSI或Sigrity工具直接做全链路仿真。在仿真模型里画好过孔结构填上叠层参数软件会自动把过孔延迟算出来。这个方法精度最高但对大多数人来说学习成本高而且前期建模耗时。第二种方法是用经验公式手算。我这几年做设计时常用的近似算法是过孔延迟 ≈ 板厚 / (6 × 光速) 因为过孔内信号传播速度大约是空气的0.5倍考虑FR4介质所以一段1.6mm的过孔大约对应11ps延迟等效走线长度约66mil按6mil/ps算。实际操作时在Allegro里量一个过孔贯穿的总长度很简单显示层面叠加用测量工具点到过孔顶端焊盘、再点到底端焊盘得到的就是过孔的物理长度。然后按上面的换算关系把这个长度折算成等效mil再和走线总长相加。我建议你在做等长规则之前先统一看一眼设计里所有高速信号换层情况。如果大部分信号都换同样数量的层那过孔贡献基本一致可以放一放。如果某些信号走线层特别浅、某些特别深这时的过孔延迟差异就要在规则里补偿进去。3.5 用实际DDR3案例演示等长计算全流程我拿一个具体项目来做演示。板子是8层DDR3颗粒用的是Micron MT41J256M8主控是某国产FPGA工作频率800MHz数据率1600MT/s。第一步从Micron官网下载该DDR3颗粒的IBIS模型导出各DQ、DQS、ADDR引脚的封装延迟。数据大概是这样的用类似值示意DQ0Pin Delay 180psDQ1Pin Delay 210psDQS0Pin Delay 225psADDR0Pin Delay 120psADDR1Pin Delay 95ps你会看到DQ和DQS的Pin Delay差距可能达到45ps这等价于270mil的外走线差异。如果按“外走线等长”思路去做误差一下就到270mil量级DDR3铁定跑不稳。第二步将这些数据整理成CSV。其中一列是网络名对应FPGA引脚名另一列是Pin Delay值单位用mil180ps × 6 1080mil。导入Allegro约束管理器的Pin Delay设置里。第三步设置Total Etch Length规则。找到D0和DQS0两个网络目标总长度设成2000mil公差±15mil。然后打开PCB Editor做等长绕线。我记得当时有个细节特别值得提有一个地址信号A10它的Pin Delay特别小只有70ps420mil导致总长度比其它地址线短一大截。如果只看外走线A10的走线长度其实比别的地址线长了不少绕线的人一直以为它没问题。等导入了Pin Delay一看总长度A10差了其他地址线将近300mil当时心里咯噔一下还好及时发现并做了补偿绕线。所以等长设计的正确顺序是这样的先定好Pin Delay导入规则再按Total Length做等长最后再看单独net的外走线是否还有调整空间。顺序反了大概率白折腾。4. 常见问题与排查技巧实录4.1 Pin Delay导入后总长度没变化怎么办这个问题我遇到过好几次一度以为是软件bug后来发现基本都是设置问题。先在约束管理器里查看这个网络的Total Length值看它和Etch Length是否一致。如果完全一致说明Pin Delay数据没有生效。原因通常是下面三种第一Pin Delay没有成功匹配到器件上——检查CSV里的RefDes和Pin Name是否和原理图网表一致尤其注意位号大小写和是否有空格像U1A和U1_A这种表达差异就可能导致匹配失败。第二约束管理器里Total Etch Length规则没有选择包含Pin Delay的电气规则集可以在Electrical Rule Set设置里把Pin Delay选项勾上。第三视图显示问题需要在约束管理器菜单栏里选择View - Filters勾选Total Length让总长度值显示出来。4.2 过孔残桩导致信号反射怎么查我在调试一块PCIe 3.0板卡时眼图测试总是不过测量点正好在过孔旁边反射特别明显。用TDR排查发现阻抗在过孔处降到了约75Ω而走线阻抗控制是85Ω差分整整下降了10Ω以上。这种问题的排查路径是先用TDR或仿真看阻抗曲线确定反射点位置然后看那个位置的过孔结构。那次问题出在反焊盘太小只有0.35mm过孔孔径0.25mm几乎没什么空间做阻抗补偿。我把反焊盘改成0.55mm之后阻抗曲线立刻平滑了很多。如果stub问题无解比如板厚和走线层已经固定那最直接的办法就是背钻。Allegro里设置背钻很简单在Manufacturing菜单里选择NC-Drill添加一个Backdrill设置指定背钻深度一般深入到信号换层位置上方10mil左右然后重新出背钻钻孔文件。注意背钻深度设计要留够安全余量别把信号层钻破了。4.3 等长绕线时总长度来回跳是什么原因有的人绕线时发现明明没动这个网络但其Total Length值时不时变一下甚至往反方向跳。这个情况通常是Pin Delay显示设置问题。Allegro里Pin Delay值有两种显示方式一种是“Pin Delay只显示在引脚上”这时候网络总长度变化正常另一种是“Net Delay Cascade”这个模式下网络延迟会沿着路径累计显示容易让人误判。建议在约束管理器工具栏里找到Delay Display模式切回Pin Delay模式再来看总长度。还有一个容易忽略的点如果你开了Allegro的实时阻抗计算功能比如Clarity或Sigrity XtractIM嵌入版在一些老版本17.2上自动更新会有延迟导致总长度刷新不准。这种情况重启一下约束管理器或重新加载规则数值就稳定了。4.4 同一过孔两侧信号延迟不对称的踩坑记录最后分享一个最有价值的踩坑经历。有次做8Gbps SerDes通道仿真差分走线用同轴过孔换层结构是对称的但仿真结果显示差分对内P和N两条路径的延迟差异有12ps直接导致产生共模分量。检查了半天原因非常隐蔽这两个过孔对应两个结构完全相同的padstack但其中一个过孔因为旁边恰好有个接地过孔布局不对称导致回流路径差异等效延迟不同。这个问题的启发是对于高速差分信号过孔延迟模型不能只看过孔本身还要看周围的地过孔分布和回流路径。在Allegro里如果严格做等长可以把每个换层区域的过孔加上一个人工补偿值但这需要非常精细的处理。大多数情况下保证差分对两侧过孔周围地的分布对称比任何补偿都管用。所以我现在的习惯是跑高速信号之前先整体看一眼所有差分对换层位置附近的地过孔密度尽量保证P和N两侧各有一个近距参考地过孔位置对称。这样比后期在等长规则里反复调补偿值要省心得多。4.5 常见问题速查表问题现象可能原因排查方法Pin Delay导入后总长度无变化器件位号或引脚名不匹配核对CSV格式确认RefDes与网表一致Total Length值比Etch Length小单位设置错误导致数值被缩放检查单位是ps还是mil确认导入时单位一致等长绕线完成后仍有时序问题过孔延迟差异没有计入用经验公式评估过孔等效长度必要时在规则里加补偿TDR阻抗曲线在过孔处凹陷反焊盘过小或stub过长加大反焊盘直径或启用背钻去stub差分对P/N延迟不对称过孔周围地过孔分布不对称调整地过孔位置保证回流路径对称绕线时Total Length异常跳变界面显示模式设置不对切换Delay Display为Pin Delay模式结语我做高速PCB这几年越来越觉得Cadence Allegro这些工具本身并不难学真正拉开水平差距的是对信号完整性的理解深度。Pin Delay和过孔长度看起来是两个很小的细节但它们恰恰是高速设计中“失之毫厘、谬以千里”的典型代表。个人建议养成一个好习惯任何新的高速器件画板之前先把它的IBIS模型下载下来看一眼封装延迟分布做到心里有数。再根据器件的实际情况决定等长规则到底是只做外走线等长还是要把Pin Delay和过孔都折算进去。这个决策做对了后面的layout和调试都会顺畅很多。另外一个经验就是在约束管理器里把所有的高速规则建好模板不同项目之间直接复用可以省掉大量重复配置时间。我自己电脑里存了一套DDR3、一套DDR4、一套PCIe的规则模板每次新项目导入后按器件参数微调一下就能用极少因为规则设置不对返工。希望这篇把Pin Delay和过孔长度那些坑讲明白的文章能让你在下一块高速板子的设计中少走一些弯路。如果你在操作Allegro时遇到了相关的具体问题也欢迎多交流这个领域里很多经验就是靠一次次调试攒出来的。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进