做高速 PCB 设计的人,几乎早晚都会遇到同一个场景:板卡上所有等长都拉好了,约束管理器也一片绿色,可一上仿真,时序预算就是不对。最初你会怀疑模型没给对、怀疑叠层参数有问题,直到把链路一段一段拆开,才发现问题往往出在两个特别容易被忽略的环节——Cadence 生态里的 Pin Delay(封装引脚延迟)和过孔长度。这两个东西在单板上看起来都不大,但在高速信号完整性分析里,它们是能改写结论的变量。
我写这篇文章,就是想把 Allegro 环境中 Pin Delay 的设置机制、过孔长度对高速信号的实际影响,以及这两者在实际工程里怎么算、怎么落地,完整地梳理一遍。内容不限于理论推导,更偏重可操作的经验:哪些坑我踩过、哪些参数必须在约束管理器里填、哪些问题看似等长实则是残桩在作祟。如果你正在做 DDR、高速 SerDes 或者任何对时序敏感的设计,这篇内容值得你耐心看完。
1. 高速信号的时序预算:Pin Delay 和过孔到底是干嘛的
1.1 从“走线做等长”这个习惯说起
很多工程师对高速设计的理解,是从“等长”两个字开始的。DDR3 数据线要对齐 DQS,地址线要对齐时钟,SerDes 差分对内要走线长度一致。于是大家就在 Allegro 里拼命拉蛇形线,把 Delay Tune 用到极致,看着约束管理器里的数值变成绿色就觉得万事大吉。
但这个习惯里藏着一个先天缺陷:等长比较的对象,通常只是 PCB 上铜箔走线的长度,或者说是 X-Y 平面上的投影路径。而一个信号从驱动器的硅片出发,到接收器的硅片结束,中间经过的物理路径远不止 PCB 表面这一段。它要先经过芯片封装内部的 bond wire、RDL 层、bump 或者 lead frame,再通过焊球和 PCB 焊盘进入走线,走线中途还可能穿过几个过孔换到别的层,最后再经过接收端的封装内部路径到达硅片。
这就是 Pin Delay 和过孔长度登场的背景。它们一个是“封装内部”的延迟,一个是“PCB 厚度方向”的延迟,都属于等长匹配里容易被漏掉的非水平路径。漏掉它们,哪怕你在 Allegro 里把走线长度调到一根头发丝那么准,真实信号的到达时间依然是偏的。
1.2 一条信号链路的时间组成
如果把一条高速信号的完整传播路径拆开,大致可以写成这样:
- 源端硅片到源端封装引脚的时间,这个就是源端 Pin Delay,通常由封装设计与键合工艺决定;
- 源端焊球、焊盘到 PCB 走线的过渡时间,这一小段往往已经包含在封装模型里,但在 PCB 端容易被重复计算或者漏算;
- PCB 走线的传播时间,这是大多数人最熟悉的铜箔路径;
- 走线换层时过孔贡献的时间,包括过孔圆柱体沿板厚方向的传播延迟,以及残桩带来的反射延迟;
- 接收端焊盘、封装引脚到接收端硅片的时间,也就是接收端 Pin Delay。
写成公式就是:
[ T_{total} = T_{pinDelay_source} + T_{trace} + T_{via} + T_{pinDelay_sink} ]
在 Allegro 的约束管理器里,我们常说的 Relative Propagation Delay(相对传播延迟等长),本质上就是在对齐这个链路的整体时间。只不过它默认把 Pin Delay 当成一个可以配置的起偏量,而把走线长度当成主变量来调。如果你完全不管 Pin Delay,那么等长匹配的实际含义就变成了“只对齐了 PCB 走线的耗时”,封装延迟差异则原封不动地残留下来,成为时序预算里的误差项。
1.3 一个等长误差的真实案例
我接过一块八层 DDR3 板子,地址线组等长做得非常漂亮,所有走线长度误差控制在 5 mil 以内,可实际跑起来读写不稳定。后来把封装资料调出来一对比,发现地址组里有两根信号的控制器封装 Pin Delay 差了将近 120 ps。按 FR4 中大约 160 ps/mm 的信号速度折算,这 120 ps 相当于约 0.75 mm 的走线长度差。也就是说,PCB 走线虽然等长,但真实链路的时间差已经远远超出 DDR3 地址信号的时序容限。
类似的问题在过孔上也出现过。一块板子上的数据线大部分走在表层,只有两根因为 BGA 逃逸孔限制走了内层,它们各自多穿了两个过孔,额外增加了大约 0.4 mm 的 Z 向路径。如果没有把这些过孔长度折算回走线约束里,这两根线就会悄悄带上约 65 ps 的额外延迟。等到仿真阶段才发现,返工成本就高了。
2. Allegro 中 Pin Delay 机制完全拆解
2.1 Pin Delay 的来源与定义
Pin Delay 这个术语容易让人产生两种误解。一种是认为它指的是 PCB 上引脚到引脚之间的延迟,另一种是把它和过孔延迟混为一谈。在 Cadence Allegro 的高速约束体系里,Pin Delay 专门指器件封装内部的固有延迟,也就是信号从 die 上的 pad 出发,经过封装基板、键合线或凸点,最终到达器件引脚(比如 BGA 焊球)所需的时间。
这个值通常由芯片厂商在封装设计阶段确定,并随 IBIS 模型、封装资料或 BSDL 文件一起释放给下游设计者。它不是一个可以随意填写的数字,而是代表一个客观存在的物理延迟。在真实的高速设计中,有的芯片 Pin Delay 可以做到几十皮秒,有的封装复杂的大芯片可以达到几百皮秒甚至更多。不同类型信号之间的 Pin Delay 差异,恰恰是等长匹配中必须补偿的部分。
在 Allegro 里,Pin Delay 的数值单位通常用两种方式表达:一种是时间单位,比如 ps;另一种是等效长度单位,比如 mil 或者 mm。这两种表达方式本质上是一回事,只要知道信号在封装内部的有效传播速度,就可以互相换算。问题在于,不同来源的资料可能给你不同单位,而 Allegro 在约束管理器里希望你填的是它内部约定的那一种,这个细节最容易引发错误。
2.2 怎么把 Pin Delay 带进 Allegro
Pin Delay 进入 Allegro 的途径主要有三条。
第一种,在原理图阶段给引脚添加属性。在 OrCAD Capture 或者 Allegro 的 Design Entry HDL 里,你可以为器件的某个引脚添加名为 PIN_DELAY 的自定义属性,值填上该引脚的封装延迟时间或等效长度。当原理图通过网络表传到 Allegro PCB Editor 后,这些属性会跟着器件和引脚一起保留下来,约束管理器读取时就能直接看到。
第二种,在封装库里定义。如果你是自己建封装,可以在 Allegro Package Editor 中打开 .dra 文件,选中某个 pin,在属性编辑器中添加 PIN_DELAY 属性。这种方法适合封装资料非常明确的器件,因为属性直接绑定在引脚上,原理图端不需要额外操作。
第三种,也是最常用的兜底手段:直接在 PCB 阶段的约束管理器里手动填写。Allegro Constraint Manager 的 Electrical 约束中,有专门显示和编辑 Pin Delay 的入口。你不需要回到原理图或者封装库,只要网络已经存在,就可以针对网络上的每一个引脚填入对应的 Pin Delay 值。
提示:不管用哪种方式导入,最终判断依据都以约束管理器里的显示为准。有时候原理图里属性写对了,但因为单位不匹配,约束管理器里读出来的数值会差一个数量级,必须仔细核对。
2.3 Constraint Manager 里怎么配置和查看
我用 Allegro 17.2 的界面举个例子。打开 Constraint Manager 后,切到 Electrical 视图,在左边的目录树里依次展开 Net -> Routing -> Wiring。右侧工作表会列出设计中的所有网络,以及对应的 Min Propagation Delay、Max Propagation Delay、Relative Propagation Delay 等列。
要用 Pin Delay,需要先选中有等长需求的网络,然后在 Relative Propagation Delay 列上右键,调出 Pin Delay 编辑窗口。这个窗口会列出所选网络包含的所有引脚,每一行对应一个器件引脚,你可以直接双击数值栏,输入该引脚的封装延迟。如果网络数量比较多,也可以在窗口里复制 Excel 表格数据批量粘贴,效率会高很多。
填好 Pin Delay 之后,Allegro 会在计算 Relative Propagation Delay 的等长匹配时,自动把封装延迟差异折算进目标长度里。具体表现就是:同一个等长组里,不同网络的目标走线长度会不再相同,有的网络要求你多走一点,有的网络要求你少走一点,目的就是补偿封装延迟的差异。很多人第一次看到“等长组目标长度不一样”会发懵,其实这正是 Pin Delay 生效的正常表现。
2.4 Pin Delay 设置的常见误区
误区一:只填了源端或者只填了接收端。正确的做法是把源端和接收端的 Pin Delay 都考虑进去,因为等长匹配算的是相对差值,只填一端等于人为制造了偏差。
误区二:符号正负搞反。Allegro 里 Pin Delay 的符号会参与加减运算,有些版本里方向约定是“接收端减源端”,有些资料里则相反。如果你拿到的芯片资料给出了正负延迟定义,必须先和 Allegro 的规则核对一遍,否则原本要补偿的延迟反而变成了额外误差。
误区三:用 Pin Delay 字段去填过孔延迟。这是完全错误的。过孔延迟属于 PCB 上的 Z 向路径,而 Pin Delay 属于封装内部路径,两者物理位置不同,约束管理器里的处理逻辑也不同。把过孔延迟塞进 Pin Delay 表,不仅无法正确补偿过孔的影响,还会让等长计算结果偏离真实链路。
3. 过孔长度:从寄生效应到时序贡献
3.1 过孔是立体的传输结构
很多工程师习惯把过孔理解为“一根短导线”,在计算长度时甚至直接忽略它。但在高速信号完整性分析里,过孔是一个典型的三维结构:它有圆柱形的孔壁、有连接各层的焊盘、有隔离用的反焊盘,还有从信号层到各参考层之间的电容耦合。这些寄生参数会在高频下形成阻抗不连续点,信号经过时会发生反射,产生振铃,影响波形质量。
更关键的是,过孔还有长度。这个长度不是指钻孔深度那么简单,而是指信号在过孔孔壁上实际传播的路径。一个通孔从顶层贯穿到底层,如果目标信号层在 L3,那么信号在过孔里从顶层走到 L3,只使用了过孔的一部分;剩下的从 L3 到底层的部分,称为残桩(stub)。
残桩看起来只是“多余”的铜,但在高速信号眼里,它是一段一端开路、另一端连着主信号路径的短传输线。信号经过这里,会在残桩末端发生反射,反射波回到主路径后会叠加在原始信号上,形成振铃和抖动。残桩越长,反射延迟越大,对信号的影响就越明显。
3.2 残桩效应与背钻的取舍
残桩的电气长度决定它在什么频率下影响最大。工程上一般用四分之一波长来估算残桩的谐振频率,公式可以粗略写成:
[ f_{stub} \approx \frac{v}{4 \times L_{stub}} ]
其中 v 是信号在介质中的有效传播速度,FR4 中大约按 150 mm/ns 到 160 mm/ns 估算,但更严谨的做法是用叠层导出有效介电常数来算。举一个例子:如果残桩长度为 1 mm,在有效速度 150 mm/ns 的介质中,谐振频率大约是 37.5 GHz,这看起来很高。但如果残桩长度做到 3 mm,谐振频率就会降到 12.5 GHz 附近,而这个频段对于 25 Gbps 以上的高速串行信号来说,已经处于信号频率成分的高能量区域内,影响就非常显著。
因此,在高速设计里,背钻(back-drill)成了常见的处理手段。背钻的道理很简单,就是用一把口径比原钻孔更大的钻头,从板子背面把不需要的残桩铜壁钻掉。背钻后残桩长度可以从原来的 3 mm 甚至更长,压缩到 0.2 mm 以下,谐振频率被推到很高,远离信号频段,反射问题自然大幅缓解。
背钻不是免费的。它增加了一道工序,成本和时间都有上升,而且在背钻时如果控制不好深度,还可能钻到信号层造成开路或者阻抗突变。所以工程上的取舍是:低速信号不走背钻,高速信号若使用通孔换层,优先评估残桩长度,必要时才做背钻。
3.3 过孔长度对延时的定量影响
残桩是信号完整性里的危害因素,而过孔里真正“有用”的那一段,也就是信号实际走过的厚度方向路径,会贡献额外的传输延迟。理解这一点很容易:信号从顶层换到内层,它走的不只是水平的 X-Y 路径,还有一个 Z 向的垂直路径。这个垂直路径的长度,等于信号起始层到目标信号层之间的介质厚度差。
计算过孔延时并不玄乎,本质上和走线延时一样,都是物理长度除以有效传播速度。假设顶层到 L3 的厚度差是 0.25 mm,那么一个过孔就带来大约:
[ T_{via} = \frac{0.25\ mm}{150\ mm/ns} \approx 1.67\ ps ]
这个数字看起来很小,但等长匹配的精度要求往往很高。一个 DDR4 数据组可能要求所有线对齐到±5 mil 以内,而一个过孔 0.25 mm 等于约 10 mil。也就是说,穿过一个过孔,就等于占用掉整组等长的可用余量的一半以上。如果一根数据线上有 3 个换层过孔,而另一根线全走表层,两者之间的过孔长度差异就是几十 mil 的量级,完全无法忽略。
3.4 Allegro 中把过孔长度计入等长
很多人问过同一个问题:Allegro 的走线长度统计里,到底有没有包含过孔长度?这个问题的答案在不同版本和不同配置下并不一致,所以最保险的做法是主动确认,而不是依赖默认值。
在 Allegro 的 User Preferences 中,有一个与等长计算相关的选项,路径大致在 Setup -> User Preferences -> Design Flow -> Method,里面关于 Etch Length Calculation 的设定会影响约束管理器计算走线长度时是否计入过孔。有些版本提供 Physical / Conductor 这类选择,Physical 会把 Z 向路径按物理深度计入,Conductor 则更偏向于水平方向上的铜箔投影长度。如果你希望等长计算更贴近真实链路的传播时间,建议开启包含过孔长度的方式,并在做最终评审时用第三方仿真或者实际测量来验证。
如果你的版本里找不到相关设置,也可以采用手动补偿的方式:在叠层管理器里读取出各层的 Z 坐标,然后逐个统计信号路径上经过的过孔数量,把每一段换层的厚度差加起来,再除以信号有效传播速度,得到过孔总延时,最后把这部分等效长度加入到约束目标中。这个方法虽然繁琐,但胜在完全可控,适合项目上对版本配置没有十足把握的场景。
4. 实操:Pin Delay + 过孔长度怎么在 Allegro 里落地
4.1 建立带 Pin Delay 的约束集
实际操作中,我最推荐的做法是在工程一开始就把 Pin Delay 纳入约束集,而不是等到布线完成后再补。
打开 Constraint Manager,切到 Electrical 视图,找到 Electrical Constraint Set,新建一个 ECSet,比如叫 DDR4_CTRL_GROUP。在 Routing -> Wiring 下,给这个 ECSet 配置 Relative Propagation Delay 属性。配置时,需要指定一个目标网络,其他网络作为成员网络,等长匹配会以目标网络的实际长度和 Pin Delay 作为基准,成员网络必须对齐到这个基准。
接下来,为这个 ECSet 所包含的网络逐一填写 Pin Delay。这里我有一个实用习惯:先把芯片封装资料里给出的所有信号 Pin Delay 整理到一张 Excel 表里,包括电压域、信号名、引脚名、Pin Delay 值,然后在约束管理器的 Pin Delay 编辑窗口中直接粘贴。这样不仅快,还方便后期对照检查。填完以后,约束管理器会自动计算出每个成员网络相比于目标网络的“有效长度差”,并在相关列中显示你需要补偿的长度。
4.2 Relative Propagation Delay 等长计算实例
举一个简化的例子。假设 DDR4 的一个数据组里,DQS0 是目标网络,DQ0 到 DQ7 是成员网络。查封装资料,得到 DQS0 的接收端 Pin Delay 是 80 ps,而 DQ2 的接收端 Pin Delay 是 20 ps。两者的差值就是 60 ps。在 FR4 介质中,有效传播速度约 150 mm/ns,换算成补偿长度大约是:
[ 60\ ps \times \frac{150\ mm/ns}{1000} = 9\ mm ]
等等,这个计算要重新捋一下单位。150 mm/ns 表示信号在 1 ns 内走 150 mm,所以 1 ps 内走 0.15 mm。60 ps 对应的长度就是:
[ 60 \times 0.15\ mm = 9\ mm ]
这个 9 mm 不是让你直接多走 9 mm 的蛇形线,而是说 DQ2 由于封装延迟比 DQS0 短了 60 ps,所以在 PCB 走线上需要额外补偿约 9 mm 的物理长度。当然,真实 DDR4 系统中 Pin Delay 差值可能没有这么大,但量级概念是相同的:几十 ps 的封装延迟差,会要求你在走线长度上补偿出好几毫米的差异。如果不填 Pin Delay,这 9 mm 就彻底失踪了,等长必然失准。
4.3 换层过孔长度测算实操
处理过孔长度,我通常会走一遍这样的流程。
第一步,在 Allegro 中打开 Setup -> Cross-section,记录每一层叠层的 Z 坐标,建立一张“层号 -> Z 坐标”的对照表。Z 坐标差异就是信号换层的物理厚度差。
第二步,选中需要分析的信号网络,在约束管理器或者 PCB 编辑器中查看该网络的走线路径,确认它经过哪些换层过孔。这里可以使用 Allegro 的 Show Element 功能,点选每一个过孔,查看它的 Start Layer 和 End Layer。如果过孔是盲埋孔,起始和结束层都写得清清楚楚;如果是通孔,通常只显示 Top 到 Bottom,但你还需要结合信号网络实际连接到的铜箔层判断信号真正走出的是哪一段。
第三步,把每个过孔的有效长度累加。比如顶层到 L3 的过孔用了 0.25 mm 厚度,L3 到 L5 的过孔用了 0.22 mm 厚度,两个过孔合计贡献 0.47 mm 的 Z 向路径。这个值可以直接折算成等效走线长度,加到你手工维护的总长度账本里。
第四步,回到约束管理器,如果里面显示的长度还没有包含过孔,就把这段折算后的长度加到相应网络的目标要求中。如果显示已经包含过孔,则不需要重复添加。这里最怕的就是两边都算一遍,所以我建议项目组里统一一个约定,要么相信工具,要么相信自己,不要混着用。
4.4 用 SigXplorer 或 Sigrity 做 SI 验证
时序和信号完整性问题,最终还是要靠仿真来说话。Cadence 生态里,SigXplorer 适合做快速的拓扑分析和“可行性仿真”,Allegro Sigrity 则适合做更完整的全链路提取。
在完成带 Pin Delay 的等长约束后,我会把典型信号网络从 Allegro 送入 SigXplorer。在拓扑结构中,除了 IBIS 模型、传输线模型之外,还要明确加入过孔模型。SigXplorer 里可以设置过孔的层间互连信息,也可以导入从叠层和过孔参数生成的无源模型。然后观察源端和接收端的波形,检查过冲、振铃和时序余量。
更严谨的做法是使用 Sigrity 的 SystemSI 或 PowerSI 做 S 参数级别的提取。不过对于绝大多数设计团队来说,先用 SigXplorer 的时域仿真把趋势看明白,再决定要不要做更重的全链路仿真,是投入产出比最高的路径。仿真结果如果显示眼图闭合或者时序余量不足,回头检查 Pin Delay 是否填错、过孔残桩是否需要背钻,往往能找到症结。
注意:仿真不是说代替一切,而是验证你约束管理器里的“绿色”到底是不是真实的“绿色”。我见过太多等长约束一片绿、但仿真结果一塌糊涂的案例,最后追根溯源,都是 Pin Delay 或者过孔长度没有正确纳入计算。
5. 常见问题与排查技巧实录
5.1 等长明明对了,波形为什么还是差
这是最经典的问题。我的排查顺序通常是:先看等长约束里是否使用了相同的目标网络和成员网络,再看 Pin Delay 是否填齐、符号是否正确,然后看信号换层过孔是否有残桩,最后看参考平面是否连续。很多时候,波形差并不是等长没做对,而是等长之外的因素在捣乱。
举个例子,地址组等长在约束管理器里绿得发亮,但仿真显示地址信号上升沿有明显的台阶感。查到最后发现,其中三根地址线在换层附近穿越了一个被电源平面分割的区域,返回电流被迫绕行,导致有效回路电感剧增。这和 Pin Delay、过孔长度无关,但同样属于高速信号完整性问题。所以遇到现象不要急着怀疑工具,先按照链路组成的各个方面逐项排查。
5.2 过孔残桩导致的振铃和眼图闭合
如果仿真波形上出现周期性振铃,而且振铃的周期接近四分之一残桩波长的往返时间,那基本可以锁定过孔残桩。处理手段不外乎几种:如果层叠允许,把高速信号换到更靠近表层的位置,减少残桩长度;如果设计允许,直接做背钻;如果因为成本或工艺不能背钻,那就减少换层次数,甚至用盲埋孔结构替代通孔。
在 Allegro 里检查残桩长度时,我会重点看信号在哪个信号层进出过孔。一个通孔贯穿 10 层板,如果信号从 L2 进、L3 出,实际残留的 stub 是从 L3 到底板这一段,长度不短。如果信号从 L2 进、直接从表层出,那 stub 反而比较短。这个细节在评审时经常被忽略。
5.3 层切换后等长显示异常
Allegro 中偶尔会出现一种现象:某条线在布线时换了一个层,约束管理器里的长度就突然变长或者变短,变化幅度明显超过预期。这可能就是过孔长度参与计算的设置在起作用,也可能是换层导致蛇形线被自动优化掉了一部分。遇到这种情况,先别急着调线,确认一下你使用的是不是同一套长度计算规则,再看换层前后实际的 Z 向路径变化是否合理。
5.4 常见问题速查表
| 问题现象 | 可能根因 | 排查方法 | 解决措施 |
|---|---|---|---|
| 等长指标绿,仿真时序仍差 | Pin Delay 未填或填错 | 打开约束管理器 Pin Delay 表逐一核对 | 从封装资料获取准确 Pin Delay,统一单位和符号 |
| 波形出现规律性振铃 | 过孔残桩过长 | 计算过孔 stub 谐振频率,对比信号谐波 | 背钻、换层到靠近表层、使用盲埋孔 |
| 信号换层后等长突变 | 长度计算规则里是否计入过孔不一致 | 检查 User Preferences 的 Etch Length 设置 | 统一团队内部规则,避免不同工具设置冲突 |
| 高速差分对内 skew 过大 | 对内过孔数量或参考层不一致 | 检查差分对内每个单端的换层路径 | 尽量保证差分对走线层和过孔结构对称 |
| 低电平处有台阶或回勾 | 返回电流路径不完整 | 检查平面层是否有缝隙或开槽 | 优化参考平面连续性,在换层处增加回流地过孔 |
这个表格是我在项目复盘时常用的模板,实际碰到的问题远不止这些,但核心思路是一样的:先定位是“长度”的问题,还是“路径”的问题,还是“阻抗”的问题,再决定用什么工具去解决。不要一上来就以为是软件算法有 bug,绝大多数情况下,是我们没有把所有该考虑的物理路径放进约束里。
最后再分享一个个人习惯:我在项目里会专门维护一份“时序链路台账”,把每条关键信号的源端 Pin Delay、PCB 走线长度、过孔数量与总厚度、接收端 Pin Delay 都列出来,用最朴素的方式做一次手算估算,再与 Allegro 约束管理器的结果对比。两者差值在合理范围内,我才敢放心交给仿真团队。这个习惯帮我提前发现了不少问题,尤其是那些“等长全绿但仿真不收敛”的疑难杂症。对于刚接触高速设计的人,我也建议从这份台账开始,它比任何自动化工具都更能让你理解信号到底是怎么走完一整条链路的。