ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

DDR等长设计中的隐形长度:Pin Delay与过孔补偿实战解析

DDR等长设计中的隐形长度:Pin Delay与过孔补偿实战解析 入行做高速板这几年被问得最多的一句话就是“师兄我这DDR等长不是做得好好的吗物理长度全都卡在±5mil以内怎么上板一测时序还是不对”这个问题基本都能绕到同一个根上你把“走线长度”理解成“铜箔路径长度”了。在Cadence Allegro里做等长设计真正需要关心的是信号从驱动端die到接收端die的总时延而这条路径上除了你画在PCB表面的那一段段铜线还有两块东西经常被忽略——芯片封装内部的Pin Delay以及几乎不被人为折算的过孔长度。这两块如果没算清楚你在Constraint Manager里辛辛苦苦拉的等长很可能只是“看起来等长”。这篇文章我就把自己实际调试中踩过的坑、算过的账和最终沉淀下来的方法摊开讲。内容偏实操适合正在画DDR、板级时钟等高速线路的工程师也适合刚接触Allegro、想搞明白“长度计算到底在算什么”的朋友。阅读过程中不需要太多理论知识但最好手边有一块正在做的板子边看边对照体会会深很多。1. 走线长度计算到底在算什么时延匹配而不是“物理相等”先说一个大多数人容易钻进去的误区等长设计的本质不是让两条线画出来一样长而是让两个信号从源头到达目的地的时间尽量一致。PCB上所谓的“长度”只是我们用来代理“时间”的一个物理量。之所以能用长度代理时间是因为在特定介质和特定叠层条件下信号传播速度基本固定长度和时延呈线性关系。但这个线性关系有一个前提所有比较的信号必须在同一种传播环境下走。实际板子里信号层分两种表层微带线和内层带状线。两者的传播速度差异很大原因在于有效介电常数不一样。表层微带线一部分电场在空气中一部分在板材里空气介电常数约等于1FR4板材的介电常数一般在4.2到4.5之间所以表层微带线的等效介电常数通常在2.2到3.0之间内层带状线被介质完全包裹等效介电常数基本就是板材本身的值。传播速度可以用一个很简单的公式估算速度 ≈ 11.8 ÷ √εr_eff单位inch/ns按照这个公式算常见叠层下走线类型有效介电常数工程近似传播速度每1000mil走线时延表层微带线2.5约7.5 inch/ns约133ps内层带状线4.3约5.7 inch/ns约175ps同样走1000mil内层比表层慢了大概40ps。这是什么概念DDR3-1600的一个UI单位间隔是1250ps40ps大约占3.2%到了DDR4-3200UI缩到625ps40ps就占了6.4%。要是两组信号一组走在表层、一组走在内层哪怕物理长度完全一致时延偏差也已经到了不可忽略的程度。所以在Cadence里做长度计算第一件事是把“物理相等”的执念放下来改成“时延匹配”的思维。在这个前提下再去看Pin Delay和过孔就会清晰很多它们是额外加在走线时延之上的两段“隐形长度”前者藏在芯片封装里后者藏在PCB的Z方向厚度里。2. 藏在芯片内部的长度Pin Delay的前世今生2.1 Pin Delay从哪里来单位是什么Pin Delay通俗点说是信号在芯片封装内部从die引脚到封装焊球或者从封装焊球到die所花费的时间。芯片不是把die裸片直接贴在PCB上的die和PCB之间隔着引线框架、键合线、基板走线、BGA焊球这些内部结构每一段都有电阻、电容和寄生电感信号经过它们需要时间。这个时间以皮秒ps或纳秒ns为单位一般由芯片厂商在封装模型定义时给出。规模大一点的芯片不同引脚之间的Pin Delay差异可能达到几十皮秒甚至上百皮秒。尤其是DDR控制器的DQS和DQ因为封装内部的布线长度不一样Pin Delay天然存在差异。如果设计里完全忽略这个差异做出来的等长就会带着“先天误差”。这里要特别提醒一个概念混淆Pin Delay不是Pin Length也不是芯片封装体尺寸。封装体尺寸大不代表Pin Delay大关键是内部走线结构。有些工程师试图用“芯片封装宽度除以传播速度”去估算Pin Delay这完全不靠谱。靠谱的来源有两个芯片数据手册里给出的封装时延表或者IBIS模型中直接带出来的Pin Delay参数。2.2 在Cadence里怎么查看、导入和手动设置Pin DelayAllegro处理Pin Delay的入口比较隐蔽很多人画了好几年板子都没注意过。在Constraint Manager里展开对应的Net或者XNet在电气约束集中可以看到Pin Delay相关列。如果你用的是自带模型或者从厂商拿到的完整设计数据包这些值可能已经被关联进来了如果看不到值大概率是模型没有正确映射。一种常见情况是原理图符号里没有关联到对应的封装信号完整性模型。这种情况下Constraint Manager里看到的Pin Delay就是0。但这不代表芯片真的没有Pin Delay只是工具不知道而已。手动设置的方式也不复杂。在PCB Editor中选中某个器件打开Edit - Properties给对应的pin添加PIN_DELAY属性填入时间和单位。填完之后回到Constraint Manager刷新一下就能看到。这里我建议维护一个习惯拿到新芯片的第一时间把手册里的Pin Delay表整理好按器件把值填进库里的封装属性中。一次做对后面所有项目都能复用比每次画完板子再去补偿省心得多。2.3 实战案例某种封装中DQS与DQ的Pin Delay差异如何吃掉时序余量说一个我实际处理过的案例。某颗DDR3控制器芯片BGA封装DQS0和DQ0到DQ7这组引脚厂商手册里给的Pin Delay数据如下示意数据非真实芯片信号Pin DelaypsDQS085DQ062DQ194DQ271DQ388DQ455DQ5102DQ668DQ779这组数据最大值和最小值差了47ps。如果设计要求DQS和DQ的时延差在±10ps以内而你在PCB上把物理长度完全对齐那么从die往外看DQS和DQ7之间的时延差就已经有17ps102-85直接超标。这种情况下PCB等长不仅不该追求物理等长反而要设计成“有计划的物理不等长”让Pin Delay大的信号在PCB上走短一点Pin Delay小的信号走长一点把差异补回来。具体操作时我会先把所有相关引脚的Pin Delay导出算出差值然后把差值除以当前层的传播速度得到一个长度补偿量再把这个补偿量放进约束管理器的Target Length里。比如47ps差值如果信号走内层带状线175ps/1000mil那么物理长度差大约应该做268mil左右的预补偿。这个量级在DDR等长里相当可观不做的话时序余量很容易被吃掉一大块。3. 过孔三维空间里的“隐藏走线”3.1 Allegro为什么默认不算过孔长度这是很多人在Cadence里做长度计算时最困惑的一点。我最初也以为Total Etch Length会把过孔长度算进去后来一次偶然的对比才发现Allegro在统计网络长度时累加的是走线线段在XY平面上的长度过孔本身在Z方向的那段物理长度默认是不计入Total Etch Length的。工具这样设计有它的合理性过孔的长度取决于板厚和叠层而叠层在布局布线阶段往往还在调整如果每个过孔的Z向长度都动态参与计算会给长度统计引入很大波动。所以Cadence干脆默认忽略Z向长度让设计者自己决定怎么补偿。但在实际高速设计中过孔的长度不能忽略。一个1.6mm板厚的通孔物理长度大约63mil。这个长度看起来不大但对比一下如果那63mil是走内层带状线时延大约11ps是走表层微带线时延大约8.4ps。单个过孔看着不起眼可是DDR数据组里每条网络三四个过孔很常见十几个过孔就是一百多皮秒的差异已经完全覆盖掉了你的等长精度。3.2 过孔时延的工程估算方法从物理长度到等效走线长度工程上我们不单独去算每个过孔的精确RC寄生时延那个太复杂也没必要。更实用的方法是把过孔当成一段“Z方向的走线”用物理长度除以所在介质中的传播速度来估算基础时延。由于过孔周围的介质主要是FR4介电常数取4.3附近速度约5.7 inch/ns。这样算下来1.6mm板厚的单个通孔基础时延约11ps。折算成表层微带线长度大约82mil折算成内层带状线长度大约63mil。所以就有了业内常说的“一个过孔等效于80到100mil表层走线”的经验值。这里必须说明这是一个粗略的工程近似。因为过孔还有寄生电容和寄生电感会带来额外的阻抗不连续效应实际时延和纯物理长度计算会有一点点偏差。但作为等长预补偿的依据这个精度足够了。板厚通孔物理长度估算时延等效表层走线长度1.0mm约39mil约7ps约50mil1.2mm约47mil约8ps约60mil1.6mm约63mil约11ps约82mil2.0mm约79mil约14ps约105mil实际操作中我会在布线阶段先统计关键网络组的过孔数量每一项网络把“过孔数量 × 等效表层走线长度”作为预补偿量直接加到匹配组的目标长度里。比如一个DQS网络有4个过孔DQ网络有2个过孔板厚1.6mm那么DQS网络的目标长度就要比DQ网络多预加约164mil2个过孔差。这样绕完线后实际物理长度看起来可能是不齐的但总时延反而是齐的。3.3 不只是时延过孔stub和阻抗不连续对高速信号的影响过孔对信号的影响并不只是时延。当一个高速信号从表层走线换到内层再从内层回到表层时过孔下面没有被使用的部分会形成一个“stub”。stub就是一根一端悬空的短传输线信号经过它的时候会产生反射反射回来的能量会和主信号叠加造成眼图质量恶化。stub越长影响越严重尤其是在信号速率提升到DDR4 2400以上时非常明显。估算stub谐振频率有个粗略的经验公式f_resonant ≈ c ÷ (4 × L_stub × √εr)c取11.8 inch/nsεr取4.3。一个300mil的stub谐振频率约4.4GHz左右虽然离DDR4基频还有距离但它的二次、三次谐波已经能覆盖高速信号的频谱范围照样会污染眼图。背钻技术就是把多余的stub钻掉只保留有用的过孔段这对DDR4及更高速率的设计几乎是标配。除了stub过孔本身的阻抗也和走线不同。常规50Ω走线过孔阻抗可能只有40到60Ω这个突变点会带来额外的反射。长度计算时沿用的是理想传输线模型反射带来的等效时延变化没有算进去所以越高速率越不能只依赖静态长度计算必须配合仿真做闭环验证。3.4 减少过孔影响的叠层与设计手法既然过孔这么麻烦最直接的办法就是少用过孔。在高速信号布线时我给自己定的规矩是关键数据组尽量不超过2次换层选定的换层位置集中在一起避免信号在表层、内层之间来回穿越。同组信号换层时尽量在同一个位置集中打孔这样过孔带来的时延变化对整组信号是“共模”的可以在匹配设计时互相抵消掉一部分。叠层规划阶段如果预判到某些关键网络必须跨层可以考虑用盲埋孔替代通孔。盲埋孔只连接相邻的层Z向长度短stub也短对高速信号友好得多。当然成本会上升需要和项目预算做权衡。另一个容易被忽略的点是过孔的“反焊盘”设计。反焊盘直径大一点过孔的寄生电容就小一点阻抗突变也小一点。这个参数一般在叠层设计中由SI工程师给出建议值Layout工程师拿到叠层表后照着设置就行。虽然这不是直接影响长度计算的因素但它会影响高速信号的实际时延一致性做等长设计时心里要有数。4. Cadence实操把Pin Delay和过孔算进等长设计4.1 在Constraint Manager中启用Include Pin DelayAllegro的Constraint Manager在电气约束规则里提供了Pin Delay参与计算的选项。位置通常在Electrical Constraint Set下面对具体的Net或Match Group设置时可以找到类似“Include Pin Delay”的开关选项。不同版本位置略有差异如果找不到最直接的验证方式是给某个pin手动设一个很大的Pin Delay比如1000ps然后观察Constraint Manager里这个网络的Total Delay或者时序窗口数字有没有变化。有变化说明已经生效没变化说明开关没打开或者根本没引入这个参数。这里踩过一个大坑有些工程师在Constraint Manager里看到了Pin Delay列也填了值但最后做DRC检查时发现工具根本没有把这个值参与计算。原因就是漏了这个Include开关。只有当你确认计算结果里包含了Pin Delay后面做的所有匹配才是有意义的。打开Include Pin Delay之后建议把所有关键网络都检查一遍确认每个pin的Pin Delay值确实来自芯片模型而不是默认的0。如果设计里用了XNet比如串联电阻把网络分成两段更要小心Pin Delay要通过XNet整体传递查XNet的总体时延比看单段Net可靠。4.2 过孔补偿的落地方法从统计过孔数到预置补偿长度既然Allegro不自动算过孔长度那就在约束里预置补偿。以DDR3数据组为例假设设计要求DQS与DQ匹配目标时延差在±10ps内。按照内层带状线175ps/1000mil计算大概就是±57mil的物理长度窗口。布线完成后我用Cadence自带报表功能导出每条网络的过孔数量做出下面的统计表信号过孔数量过孔补偿等效长度1.6mm板厚约82mil/个DQS04328milDQ04328milDQ13246milDQ25410mil.........然后把过孔数量最少的那条网络作为基准或者直接把0补偿作为基准其他网络在Target Length里加上差值。比如上面DQ1只有3个过孔比DQS0少1个那么DQ1的目标长度要比DQS0长82mil左右。这样软件绕线时就会自动让DQ1多绕一点补足过孔数量的差异。这个过程看起来很土但是非常有效。很多大公司的高速PCB设计规范里就是这么要求设计者手动做过孔补偿的。不同点是他们可能用了更精确的叠层参数比如根据具体层间距离算过孔Z向长度而不只是用板厚估。算法逻辑完全一样。4.3 一步一步DDR数据组等长设置的全流程我把一套相对成熟的流程整理出来供参考。这套流程适用于DDR3/DDR4以及类似的源同步总线。第一步建立拓扑。在原理图中把需要匹配的信号全部放进同一个Match Group我习惯在Capture里就把DQS/DQ/Mask这类网络打好组导入PCB后约束关系直接带过来。第二步设置电气约束。打开Constraint Manager在Relative Propagation Delay里填入允许的偏差窗口。具体窗口大小看芯片手册DDR3时代我常用±10mil到±20milDDR4的一些设计会用±5ps甚至±2ps这个不要拍脑袋严格按手册来。第三步引入Pin Delay。确认Include Pin Delay已经打开然后逐个网络检查Pin Delay值是否有误。遇到没有自动带入的手动从手册填入。第四步统计过孔并计算补偿值。先布完线导出过孔统计表算出每条网络需要的过孔补偿长度修改Target Length或Relative Delay目标值。第五步手动绕线。用Delay Tune命令绕等长时观察的是“总长度等于Target Length”。因为你在第四步已经把过孔补偿和Pin Delay都折算进去了这里绕出来的物理长度就是“带补偿的物理长度”不是各个网络都一样长而是各自带着预期的偏差绕完。第六步检查。执行DRC确认没有长度超限的violation。再用Report功能导出一份总时延清单人工核对一遍DQS和DQ的实际时延差。这套流程最大的价值就是把“隐藏因素”显式化。绕线时不用再凭感觉“大概差不多”每一步都有数据支撑。4.4 用报表和DRC验证补偿结果Cadence的DRC只能告诉你约束有没有满足不能告诉你约束本身设得对不对。所以在最终验证阶段我会把PMGRLPhysical Match Group Length报表或者ECset的汇总表导出来专门做一次“物理长度 Pin Delay 过孔补偿”的加总核对。这里推荐一个土办法在Excel里建一张表把每条网络的Report总长度、过孔数、Pin Delay总和放进去计算出“实际等效时延 走线长度×当前层传播时延 过孔数×单孔时延 Pin Delay总和”然后自己把DQS和DQ的等效时延差拉出来看一眼。这个手工核算看起来笨却经常能发现软件配置层面没有暴露的问题。比如某条网络因为跨层次数多走线层改变导致传播速度变化软件按单一速度估算实际时延偏差就出来了。如果是更复杂的拓扑建议用SigXplorer或者HyperLynx做一遍快速时域仿真直接看眼图和时序裕量。长度计算是基础仿真才是最终裁决。两者的关系是长度计算帮你把设计拉进及格线仿真是确认你不需要再花力气优化。5. 实际项目中的常见坑与排查经验在这么多项目里摸爬滚打下来总结出几个高频问题做成速查表方便大家对照排查。现象常见原因排查方法物理等长做得很漂亮上板后时序测试还是不过Pin Delay未参与计算或过孔差异没补偿在CM里开启Include Pin Delay统计过孔并折算补偿CM里看不到Pin Delay值原理图符号和SI模型没有正确关联检查器件的IBIS模型映射确认pin Delay从模型导入绕等长时发现目标长度怎么调都绕不平把Pin Delay和过孔补偿重复加在了目标长度里只保留一处补偿源最好让CM计算总时延Target Length里只放物理长度DRC显示长度超限但实际量又差不多叠层信息错误导致速度估算偏差核对叠层表中的εr和层间距重新计算速度同组信号有的走表层有的走内层匹配很难控制换层次数太多造成速度差异叠加优化扇出方案尽量让同组信号在同一层完成主要布线排查看上去很杂但核心思路只有一条把影响时延的所有变量列出来逐个核对而不是一头扎进“长度”这个单一指标里。长度是结果时延是目标中间隔着的就是Pin Delay、过孔和走线层速度差异这三座大山。另外有个实战小技巧如果项目周期紧没法逐一做详细计算至少保证同组信号过孔数量一致、走线层一致然后把Pin Delay差值最大的信号对找出来手动做一次补偿。大部分问题都出在差异最大的那对信号上把最大的坑填掉系统余量通常就够用了。最后分享一个我个人的经验做任何高速等长设计之前花半天时间把芯片手册里的Pin Delay表、板厂提供的叠层参数、约束管理器的单位设置这三样东西对齐比后面反反复复试错省下一个星期。长度计算这件事功夫在画板之前。
返回列表