前阵子调一块DDR3板子,地址线在PCB上量出来长度都差不多,但读时序的裕量就是不对。后来把封装内部那截路径算进去,才发现问题出在Pin Delay和过孔两条“看不见的走线”上。很多刚接触Cadence Allegro的工程师,做等长时只看etch length,等板子回来测试才发现差了几十mil。这篇文章就把Cadence走线长度计算里Pin Delay和过孔的影响机制、设置方法、以及实际怎么折算讲透。
1. 为什么总长度不能只算PCB上的铜皮
1.1 信号的真实路径:从die到die
我们常说的“走线长度”,默认是PCB上铜皮的物理长度。但高速信号的传输路径,从源端芯片内部的die开始,经过芯片封装内部走线、封装引脚/焊球,再到PCB焊盘、过孔、平面层、走线,最终到达接收端的封装引脚和die。整条路径是“die到die”的完整链路。
Cadence约束管理器里计算走线长度时,如果只约束etch length,相当于默认所有芯片的封装内部路径完全一致。板内等长做得再漂亮,封装那部分不一致,实际到达接收端die的时间仍然不一样。DDR3/DDR4这类并行总线,时序裕量本来就紧张,几十mil的封装长度差异,换算成时间大约是5到10ps,看起来不大,但叠加到整个地址/命令组的偏斜预算上,就可能吃掉不少裕量。
1.2 什么时候可以忽略Pin Delay和过孔
也不是所有板子都必须把Pin Delay和过孔算进去。2层板、低速信号、或者一个封装内所有信号引脚到die的距离接近时,忽略它们问题不大。但有以下几种情况,建议一定要算:
- 使用BGA封装,尤其焊球数量多、die偏置明显的器件,封装内部走线长度差异能到几百mil。
- 多颗粒DDR拓扑,例如4片DDR3/4挂在同一条地址总线上,每片颗粒的封装延迟不同,组内偏斜会显性化。
- 走线经过换层,过孔数量不一致。信号从表层到内层,再回到表层,这部分的Z轴路径在etch length里完全不体现。
1.3 长度计算的核心等式:Total = Etch + Pin + Via
我在Cadence里做等长时,心里始终有一个公式:
总路径等效长度 = PCB铜皮走线长度(Etch Length) + 芯片引脚延迟(Pin Delay) + 过孔等效长度(Via Equivalent)
其中Etch Length是Allegro里可以直接量到的,Pin Delay来自芯片封装手册或IBIS模型,Via Equivalent需要根据叠层自己折算。Cadence的约束管理器确实能帮你算总延迟,但它不会替你把封装数据变出来,也不会自动判断过孔怎么折算。搞懂这个等式,后面设置约束、看报告才不会发懵。
2. Pin Delay的正负号之争与数据来源
2.1 封装延迟不是“固定延迟”,是路径差
Pin Delay在Cadence里的单位一般有mil和ps两种,早期很多资料叫它“Pin Delay”,大版本更新后也叫“Device Pin Delay”或“Package Delay”。它描述的是:芯片die到某个封装引脚(ball/pin)之间的等效走线长度或传输时间。
要注意,这个值不是固定的“延迟多少秒”,而是指封装内部那截走线的长度。两个引脚如果封装内部走线长度不同,Pin Delay就不同。BGA封装里,die通常不在封装正中心,靠近die一侧的ball路径短,远离die的路径长,所以工程师会在手册里看到一组不均匀的封装长度数据。
2.2 正负号约定的两种说法,以约束目标为准
关于Pin Delay的正负,网上的讨论特别多,因为在不同软件、不同版本的约束管理器里表现不完全一致。我自己的经验是:先别纠结字面定义,用“以谁为基准”来判断。
如果你在Cadence约束管理器里设置的是一个绝对目标长度,例如整组线要求Total Delay为5000mil,那么这个组的引脚可以都填正值,含义是“这部分长度发生在封装内部,需要在总长度为5000mil里占一块”。系统计算外部走线目标时,会自动用总目标减去Pin Delay,外部etch就会短一截。
如果是在Relative Propagation Delay里相对某个基准引脚做等长,那情况更简单:基准引脚的Pin Delay设为0,其他引脚填上与基准引脚的“差值”。某个引脚封装路径比基准长50mil,就填+50mil,因为它的外部走线要比基准短50mil;如果比基准短,就填负值。
这里有个真实场景的坑:同样一个数据手册里的封装长度表,有人把它逐项填成正值,有人填成负值,最后等长结果正好相反。我建议填完之后先做一次快速仿真,或者在Constraint Manager里看Total Delay列,验证一下和预期方向是否一致。正号的物理含义是“增加总路径长度”,负号是“减少总路径长度”。
2.3 Pin Delay数据从哪里拿
Pin Delay数据通常有三个来源:
- 芯片数据手册/封装图纸:部分厂商会直接给“Package Delay”或“Ball to Die Length”表格。
- IBIS模型:IBIS文件里有[Pin]段落,包含R_pin、L_pin、C_pin等寄生参数,有些还会给出封装延迟。虽然IBIS主要是做仿真用的,但里面的封装寄生参数可以转换成延迟估算。
- 厂商官网/EDA工具库:有的芯片厂商在发布封装库时会附带一个包含Pin Delay的CSV或Excel表,Cadence的本地库也可以存这些信息。
我习惯的做法是:收到一个芯片封装时,先问FAE要封装延迟表,没有的话自己从IBIS里提取L_pin和C_pin,按经验公式估算。公式如下:
T_pin ≈ 84 × sqrt(L_pin × C_pin)
其中L_pin单位nH,C_pin单位pF,得到的T_pin单位ps。这个结果不一定精确到个位数,但作为等长补偿足够用。把数据整理成Excel表,对应到Cadence里的Refdes和Pin number,再录入约束管理器,比在界面里一格一格填要可靠得多。
3. 过孔等效长度的估算与叠层换算
3.1 过孔长度不是“孔深”那么简单的
很多人理解过孔对走线长度的影响,第一反应是“过孔多深就算多长”。这个说法只对了一半。对信号来说,它从过孔的一端进入,从另一端出去,路径长度不是孔的总深度,而是信号实际经过的Z轴距离。
举个例子,一个信号从TOP层进入过孔,在同一颗过孔的另一侧直接转到L4层走线,那它的Z轴路径大概是TOP到L4的介质厚度叠加上下焊盘厚度,而不是整个过孔从TOP到BOTTOM的全长。反过来,如果信号从TOP层进孔,直接从BOTTOM层出孔,那确实接近板厚。
还要注意,过孔不是一根理想直导线,孔径、焊盘、反焊盘、相邻过孔都会让信号的实际电气长度和物理长度不一致。工程上不可能每个过孔都做场仿真,所以需要一套快速估算方法。
3.2 一种工程化的过孔等效长度计算方法
我目前常用的折算方法,分三步:
第一步,看叠层,确定信号换层前后的两个层。比如从L1到L3,就去叠层表里查L1到L3的介质厚度,加上两个层的铜厚,得到一个物理距离H。
第二步,把物理距离H乘上一个修正系数。系数取决于过孔类型:普通信号通孔,我一般取1.2到1.5;背钻过的深孔,可以取1.1左右;如果是盲埋孔,路径短,修正系数更接近1。这个系数不是拍脑袋,它吸收的是过孔反焊盘寄生电容以及过孔自身电感带来的附加延迟。
第三步,把这个等效长度加到网络总长度里。如果过孔比较多,可以先统计网络里换层过孔的数量和类型。例如一条地址线从控制器出来,经过一个通孔换到内层,再经过一个通孔回到表层,两个过孔分别算等效长度,加起来进约束。
还有一点,如果过孔连接的是电源或地平面层的参考过孔,一般不需要计入信号走线长度,因为信号时序关心的是信号路径,不是回流路径。不过回流路径上的过孔会影响阻抗和EMI,那是另一个话题,不影响等长计算。
3.3 过孔Stub与反焊盘对时序的高频影响
低速情况下过孔Stub的影响不明显,但到了DDR3-1600以上,甚至DDR4-2400,过孔Stub就会引入谐振和额外延迟。叠层厚、信号走内层时,通孔没有经过的TOP到内层之间的那截孔壁就是Stub,它像一个开路短线,会反射部分高频能量。
反映在长度计算上,就是实际等效延迟会略大于物理Z轴距离。所以我前文说的修正系数1.2到1.5,不是随便给的,它涵盖了Stub带来的附加影响。如果你的板子DDR速率比较高,建议在过孔旁边加反焊盘优化,或者对深层信号用过孔背钻。等长计算层面,只要系数取得合理,不会出系统性偏差。
4. Allegro里Pin Delay和过孔约束的落地操作
4.1 在Constraint Manager中给Pin设置Delay
打开Cadence Allegro的Constraint Manager(约束管理器),找到需要设置Pin Delay的网络或Xnet。在Electrical Constraint Set里找到Relative Propagation Delay或Pin Delay相关的表格。
对于Allegro 16.x到17.x版本,操作路径大致如下:
- 在Constraint Manager左侧选择“Electrical Constraint Set”下的“Wiring”或“Relative Propagation Delay”。
- 右侧表格选中需要设置的网络/组,右键选择“Properties”或直接在表格里找到Pin Delay列。
- 进入后可以按引脚填写延迟值。单位在约束管理器右上角或Setup里设置,常见是mil或ps。
- 如果网络是Xnet,要特别注意,Xnet的Pin Delay是加在分立器件引脚上的,比如电阻两端。如果错误地把Pin Delay加在Xnet中间的被动器件两端,可能造成长度计算重复。
这里补充一个经验:在Allegro里,“Pin Delay”可以针对物理引脚设置,也可以是属性形式。如果你用Cadence Capture原理图导入网表,可以在原理图里预先给器件添加PINDELAY属性,例如“0.5mm”或“100mil”,等网表导入后会自动带到PCB约束管理器中。流程化的团队一般都在原理图阶段就把Pin Delay作为属性统一维护。
4.2 不要漏掉这个开关
很多工程师在约束管理器里填完了Pin Delay,但布线时发现Allegro左下角或者Delay Tune面板里显示的长度根本没变化。问题多数出在“显示/计算是否包含Pin Delay”这个开关上。
在Allegro中,查看网络长度时,有几个地方都要确认开启了Pin Delay计入:
- Route -> Interactive Delay Tune(延迟调节)的选项菜单里,需要勾选包含Pin Delay。
- 约束管理器里相对延迟列的显示方式,有的版本默认显示“Etch Length”,要切换成“Delay”或“Total Delay”。
- 如果使用“Show Measure”或者“Reports”里的长度报告,需要看清楚报告列是Etch Length还是包含Pin Delay。
这个开关不会影响PCB物理走线,只影响你怎么判断长度有没有等好。漏掉它的结果就是,你辛辛苦苦把板内长度调成完全一致,实际上总长度差异还在。
4.3 怎么把过孔长度折算进约束管理器
Cadence官方并没有一个叫“Via Delay”的栏目直接把过孔等效长度输进去,所以过孔的折算必须自己处理。我见过几种做法:
第一种,直接修改等长目标值。比如地址组目标Total Length本来设定为5000mil,所有网络平均有2个换层过孔,每个过孔等效按30mil算,那把这60mil加到目标值或从目标值中扣除,后续全部网络按新目标执行。这种做法适合过孔数量一致的简单拓扑。
第二种,用CAD文件里的Group/Class做额外长度补偿。把过孔等效长度以额外走线长度的形式,通过在约束里给某个网络单独加Match Group差值实现。本质是手工给每个网络加偏移量。
第三种,真正一劳永逸的做法:在Allegro中把过孔也建模成有长度的走线段。做法是给过孔设置一个特殊的Dummy走线长度,或者使用第三方脚本统计过孔后自动在矩阵表中生成补偿值。我目前最推荐的做法是,先把约束管理器里的“Match Group”目标设成一个初始值,布线完成后用脚本统计各网络的过孔数量,然后统一调整组内各网络的Target Delay。
不管用哪种,一定要建立文档记录过孔折算的公式和系数来源,方便团队复核。
5. DDR3地址组等长:一个完整计算实例
5.1 叠层与器件Pin Delay数据
看一个具体的简化案例。6层板,叠层为L1信号、L2地、L3内层信号、L4内层信号、L5电源、L6信号。DDR3地址线走线主要在L1和L3之间切换。控制器使用BGA封装,DDR3颗粒也是BGA封装。
从控制器数据手册查到的地址线Pin Delay数据如下表(示意值):
| 网络 | 控制器Pin Delay (mil) | DDR颗粒Pin Delay (mil) |
|---|---|---|
| A0 | 180 | 120 |
| A1 | 195 | 135 |
| A2 | 210 | 125 |
| A3 | 175 | 130 |
这里的数值代表die到BGA焊球的封装内部等效长度。控制器是一个大BGA,地址引脚分布在不同位置,所以Pin Delay有散差;DDR颗粒引脚相对集中,散差小一些。
信号从控制器BGA焊球出线,表层走一段后,通过一个通孔换到L3,再走一段到DDR颗粒下方的过孔,换回表层进入DDR颗粒。每个网络都有两个换层通孔,类型相同。
5.2 基准选择与组内差值计算
地址线组需要以CK(时钟)或控制器内部的目标延迟为基准做等长。这里我们简化,以控制器A0引脚的路径为基准,组内其他网络都向A0对齐。
先计算过孔等效长度。L1到L3的介质厚度加铜厚约为8mil,考虑通孔修正系数1.3,单个过孔等效长度就是8 × 1.3 = 10.4mil。每个网络2个过孔,过孔总贡献20.8mil。
然后计算每个网络的总路径长度(不含受控端到DDR颗粒die之间的那段,因为大家目标相同可以抵销):
Total_A0 = 控制器A0 Pin Delay 180 + 过孔20.8 + 板内走线长度
Total_A1 = 控制器A1 Pin Delay 195 + 过孔20.8 + 板内走线长度
要让Total_A0 = Total_A1,则A1的板内走线应该比A0少15mil。同理A2比A0少30mil,A3比A0多5mil。在Constraint Manager中,如果以A0为基准并设Pin Delay为0,那A1应填+15mil(表示A1封装路径更长,外部需少走15mil),A2填+30mil,A3填-5mil(A3封装路径更短,外部需多走5mil)。
5.3 CM录入、布线与报告验证
打开Constraint Manager,在Relative Propagation Delay里新建一个Match Group,把A0到A3、以及CK等网络放进去。选中基准网络A0,设置为基准Target,然后按上一步计算出来的差值填写各网络引脚的Pin Delay。
设置完成后,Allegro布线时可以用Delay Tune交互调线。调完以后,回到约束管理器看Delay列,确认每个网络相对基准的延迟差都在容差范围内,比如±10mil以内。
报告验证时要注意,Constraints Manager里的相对延迟差值显示的是Total Delay差值,不是etch length差值。如果你用菜单Reports -> Etch Length by Layer and Net Report去核对,看到的只是铜皮长度,需要自行把Pin Delay和过孔折算再加回去,否则会误以为“明明约束管理器显示差10mil,报告里却是差的更多”。
5.4 实测裕量情况
这个案例里,把Pin Delay和过孔修正加进去之后,板内地址线长度看似“长短不一”,但DDR3读时序裕量比之前好了不少。原因是原来外部走线完全对齐,内部Pin Delay差异直接暴露成组内偏斜;现在外部走线主动补偿,真正的die到die路径对齐了,接收窗口自然好了。
这让我更确定一点:等长的本质是等“总路径”,不是等“可见路径”。Cadence只是工具,最终要算的是整个信号链路。
6. 实操中踩过的坑与对应解法
6.1 单位混用:ps和mil到底按哪个算
Cadence约束管理器里,Pin Delay单位可以在Setup里切换,但切换只影响显示和输入解析。有的工程师从IBIS里拿到的是ps,从封装图纸里拿到的是mil,录入时不做换算直接填,结果整组约束全部偏掉。
常规FR4板材上,信号传播速度大约是5.5到6mil/ps,也就是每英寸约170ps左右。如果手头是ps值,想转成mil,按5.9mil/ps估算比较通用。换算完要统一单位再录入,并在记录文档里注明原始数据和换算系数。
6.2 属性设了不生效:检查Class/Subclass和网络别名
有一次我给别人看一个Pin Delay设置,明明约束管理器的表格里已经填了值,但布线调线工具就是不按照这个值计算。查了半天,发现这个网络的物理引脚在原理图里用的是“A0”这样的别名,而约束管理器里按封装引脚名(比如BGA球号)关联。两者没对应上,导致设置只作用在错误的引脚上。
遇到Pin Delay设置不生效,优先检查三处:网络是不是Xnet、引脚名和Refdes是否匹配、同一个网络是否有多个属性定义冲突。Allegro里如果一个网络既有网络级属性又有引脚级属性,有时高优先级会覆盖掉引脚级的Pin Delay设置。
6.3 过孔长度重复计算或完全漏算
过孔长度最常见的坑是重复计算。特别是信号从L1到L3再到L1,有些人会把L1到L3算一次,L3到L1再算一次,同一个过孔的Z轴路径被算了两遍。正确做法是看信号换层动作的次数,而不是过孔数量。一个过孔完成一次有效换层,只算一次Z轴路径。
还有一种情况是漏算,当信号在表层走了很长时间才换层,换层后在内层走了很短距离又换回表层,这时过孔路径虽短但仍存在。尤其注意靠近BGA扇出区域的过孔,因为距离短、看起来无关紧要,实际寄生的附加延迟会影响高频时序。
6.4 报告长度与CM显示不一致
Allegro不同版本、不同报告工具对“Length”的定义不完全一致。Quick Reports里的Etch Length是物理铜皮长度;Constraint Manager里有些列显示的是包含Pin Delay后的总延迟;而第三方的DFM软件导出的长度又可能是按连接线段统计的。
遇到不一致时,不要急着怀疑软件出错,先确认每一列的定义。我的习惯是:以Constraint Manager中Relative Propagation Delay的Delay列为最终核对标准,其他报告只作为参考。导出生产文件前,再用Valor或CAM工具做一次物理长度检查,确保物理等长也没有异常,这样双重校验最稳妥。
做这份工作久了,我的体会是,Cadence里所有长度约束都只是把“物理连接”翻译成“时间关系”的手段。Pin Delay和过孔之所以容易被忽略,是因为它们在图上“看不见”。建议设计一开始就建立一个总路径长度跟踪表,把每颗芯片的Pin Delay、过孔折算方式和走线长度分开列,等到仿真或测试出问题时,这张表就是排查问题的地图。先想清楚要算什么,再动手打开Cadence,比上来就画板要靠谱得多。