简介:面向使用 Allegro 进行高速 PCB 设计的硬件工程师,这份资料系统讲解为高速信号添加 PIN_delay 的完整流程。内容以 Xilinx FPGA 实际项目为实例,覆盖从 Vivado 中导出 PIN_delay 文件、按 169.5ps/in 将 ps 数据换算为 mil、整理为 CSV 并导入 Allegro,再到在 SIGXplorer 中建立多路径拓扑和验证数据的全流程。文档重点说明了多路径信号不能直接建立 Match group 的处理方法,以及用 Excel VLOOKUP 核对导入数据的技巧,并给出具体换算公式和操作截图式描述,便于读者按步骤复现。文件共 1 个,为 docx 格式,约 805KB,阅读方便。已有 9018 人学习浏览,适合需要处理高速信号时序约束的中高级硬件工程师参考。
1. Allegro里给高速信号加PIN_delay,绕线前做和绕线后补是两回事
Allegro里给高速信号做等长约束,只控etch length不够,必须把PIN_delay一起加进约束,否则绕完线的DDR、SerDes组在芯片die端看仍然是偏的。PIN_delay描述的是芯片封装内部die到引脚之间的那段延迟,它不在PCB走线上,却真实参与时序。把值补齐以后,等长绕线、延迟报告、SigXplorer仿真才能统一到同一个时间基准。下面的内容按概念到参数、参数到落库、落库到验证的顺序展开,适合正在调DDR3/DDR4地址组、或者第一次做高速接口等长的Layout工程师。
2. 加PIN_delay前先搞清它加在哪一段:封装延迟与板级走线的分界
2.1 Relative Propagation Delay公式里的PIN_delay是哪一段
约束管理器里的相对传播延迟,盯的是同一组网络到达目标pin的时刻差。Allegro计算时把每段路径拆成两部分:封装内部die到pin的延迟,以及PCB上pin之间的走线延迟。关系可以写成:
Ttotal = Tpin + TboardTpin就是PIN_delay,Tboard是etch length换算出的传播时间。Layout能控制的只有Tboard,芯片时序要求关心的却是die端的整体关系。等长绕线只比Tboard,等于默认所有pin的Tpin都相同——低速板卡这么近似没问题,DDR3-1600以上、或者几十Gbps的高速信号接口,封装延迟差异已经和时序裕量同量级,忽略它会让等长越等越不准。
PIN_delay的值可以填正数也可以填负数。方向判断准则是:以die为参考点、信号从die往pin传播时取正;如果芯片资料给的是pin到die方向的值,或者约束表里Reference Pin和Target Pin的取向与数据方向相反,符号要相应反转。拿不准时先在SigXplorer里用两个pin搭一个简单拓扑跑一下对比,比盲填靠谱。
2.2 从IBIS或封装手册换算PIN_delay的两种单位
PIN_delay的常见来源有三处:IBIS模型里写明的pin-to-die延迟、封装手册里的bonding wire或bump延迟表、芯片应用笔记直接给的推荐值。拿到手多数是ps,也有直接给等效mil的。换算要用FR-4上的实际传播速度:
v_microstrip = 6.0 # mil/ps,表层微带线,约6.6 ps/mm v_stripline = 5.3 # mil/ps,内层带状线,约7.4 ps/mm for ps in [100, 250, 450]: print(f"{ps} ps -> 表层 {ps*v_microstrip:.0f} mil, 内层 {ps*v_stripline:.0f} mil")输出结果就是在mils显示单位下应填的等效长度,反过来也一样。实际操作时先看Constraint Manager当前显示单位是Time还是Length,再决定填ps还是mil。内层走线和表层走线的传播速度不同,同一组信号最好按实际层叠取对应系数,不要全部套同一个数。
下面给一个大致的量级参考,具体数值以对应芯片手册为准:
| 封装类型 | 典型PIN_delay | 应用场景 |
|---|---|---|
| BGA封装DDR颗粒 | 100~300 ps | DDR3/DDR4地址、命令组 |
| 多die封装 | 150~450 ps | 2DPC、多Die封装,需逐die核对 |
| SerDes高速封装 | 50~150 ps | PCIe、10G/25G差分对 |
| 引线框封装 | 300~700 ps | 老式QFP,bonding wire较长 |
2.3 整组填一个值还是逐pin填:粒度怎么选
PIN_delay按网络粒度就能填,也可以按pin粒度逐个处理。DDR地址/命令组里,同一芯片各pin的封装延迟差几十ps很常见,DDR3-1600以上这个差量已经需要逐pin修正;数据组里DQS与DQ的skew更敏感,建议逐pin填。
推荐的落地顺序:先用芯片手册给的组典型值整组填一版,把等长约束先跑起来,等信号完整性仿真报出具体margin不足的net,再逐pin精修那几条。不要一上来就追求所有pin精确到个位ps,Layout阶段的约束先把量级锁对,精度交给仿真阶段收口。
3. 在Allegro约束管理器里添加PIN_delay的详细步骤
3.1 打开Constraint Manager定位到高速总线网络
菜单路径Setup → Constraints → Constraint Manager,快捷键CM。17.4和更新版本的Cadence Allegro里路径一致。左侧树展开Electrical → Net → Routing → Relative Propagation Delay,右上角过滤框选到目标bus或net group。差分对则进Electrical → Differential Pair → Relative Propagation Delay,PIN DELAY列的位置和单端相同。
进表之前先把DDR这类总线收进net group,否则表格里几百个网络混在一起,填值容易串行。高速信号接口的约束表我习惯按控制器分组,一个控制器一个net group,填PIN_delay和后续等长都在同一张表里完成。17.4里左侧还有Constraints → All Constraints的汇总入口,适合全局检查,但编辑PIN DELAY还是在上述工作表中操作。
3.2 在Relative Propagation Delay工作表填入PIN DELAY列
默认工作表显示的是Total Etch Length和Delay,PIN DELAY列需要手动调出来:表头右键 → Show → PIN DELAY。列出现后逐行填写,关键栏位说明如下:
| 栏位 | 填写内容 | 说明 |
|---|---|---|
| Reference Pin | 参考pin | 通常选驱动端pin或时钟源pin |
| Target Pin | 目标pin | 接收端pin,与Reference组成pin pair |
| PIN DELAY | 延迟值 | 正负号按2.1的方向准则 |
| Tolerance | 容差 | 可直接填±25 ps这类区间 |
填完点工作表上方的Apply,约束立即生效,不用重新生成网络。后期换料或者改了封装,回到同一张表覆盖数值再Apply一次即可。Tolerance这一列很多人忽略,它是等长检查的判定带宽,DDR3常用±25 ps,数据手册要求更严的会到±5 ps,绕线阶段先按手册实际值填,别凭感觉放大。
两个入口的差异要注意:Constraint Manager里填的值会写进系统约束,布线时等长计算直接引用;用Edit → Properties方式给pin挂PIN_DELAY属性,属性同样参与计算,但不会显示在数值列里,两种方式混用容易有一处漏改,实际项目里选一种入口用到头。
3.3 用Edit Properties给单个pin挂PIN_DELAY属性的替代做法
芯片厂商给的delay表经常是一张Excel,几十个pin逐个对照填,用属性方式更快:
- 菜单Edit → Properties,Find面板只勾Pin
- 框选目标芯片的高速信号pin
- 新增属性PIN_DELAY,值填300ps(当前单位是mil就填换算值)
- Apply写入
这种方式适合与Excel对照批量核对,也适合只给个别特殊pin做补偿。缺点是属性入口不经过Constraint Manager的检查,填错单位或拼错属性名不会立刻报错。用这个入口时,填完去约束管理器里刷新,确认PIN DELAY列或Properties列能看到值。
提示:无论哪个入口,填完都跑一次Constraint Manager的Check,确认没有新增DRC错误。单位不识别时Allegro会报,但数值大小不合理只能靠后续时序验证兜底。
4. 填完PIN_delay后的验证:从SigXplorer到延迟报告
4.1 用SigXplorer确认PIN_delay参与仿真计算
PIN_delay不只是约束表里的一列数字,它会随拓扑被带入SigXplorer的信号完整性模型。打开路径是Analyze → SI/PI Simulation → Preferences设好模型库,再在SigXplorer里加载对应net的拓扑。选中pin后,属性面板里能看到PIN_DELAY已经并入该pin的延迟参数。
验证是否生效的快速方法:随便挑一个DDR数据组net,把PIN_DELAY从0改到目标值,观察总延迟的增量是否等于填的值。增量对得上说明模型提取正确;增量不对,优先检查单位是否被切换过,或者这个net实际走的是差分约束表而不是单端表。差分对要P/N两侧一起看,SerDes接口尤其要确认两侧的差没有被模型放大。
4.2 绕线完成后核对含PIN_delay的整体延迟
布线收尾后的核对路径有两条:
| 报告工具 | 看什么 | 是否含PIN_delay |
|---|---|---|
| Route → Analysis → Delay Report | 板级etch length和串扰 | 不含 |
| Constraint Manager → Relative Propagation Delay | 延迟和等长状态 | 含,可切换Delay显示 |
Delay Report只看PCB走线,想确认补偿是否生效,回Constraint Manager把显示切到Delay,核对每个net的总延迟与目标值的差值。差分对额外看P/N两侧,PIN_delay填入后两侧值的差不能造成新的对内skew。
绕线目标建议直接设成含PIN_delay的总延迟:右键目标net所在行,set为Target,其余net的Delta自动相对它计算,目标值填含补偿的数值。如果继续拿etch length做目标,工具会把基准net的封装延迟差异也当作需要绕掉的偏差,出现越等长、die端看越偏的反效果。整组绕完后回到工作表看Delta和Tolerance一列,所有net应该落在同一个带宽区间里。
4.3 等长状态异常时的排查方向
绕线完成后等长状态标红,按下面顺序查,比盲调绕线快:
- 先查PIN DELAY列是否有漏填或符号与其它net相反的网络
- 再查混用的两种入口,属性方式写入的值是否覆盖了约束表里的系统值
- 最后查Tolerance设置,高速接口的容差经常是±5 ps,手动绕线很难达到,先放宽到数据手册要求的实际值,别让容差和pin delay互相打架
5. 三种常见的PIN_delay设置错误与批量处理技巧
5.1 符号方向填反,等长越等越偏
最典型的错误是整个组的PIN_delay符号反了。判断技巧:填完后跑一次仿真,对比skew变化方向。填了值反而恶化,基本就是符号问题。DDR地址/命令组以控制器为参考,数据组以各自DQS为参考,先按这个方向检查一遍再继续调。
5.2 单位混用造成量级错误
工作表当前显示单位是mil时直接填ps,几百ps会被当成几百mil,量级差十几倍。填值前右键确认显示单位是Time还是Length,与手上的数值单位对齐后再Apply。同一张表里混着ps和mil更麻烦,Allegro按当前显示单位解析输入,所以统一显示单位是必经动作。
5.3 用Allegro SKILL脚本批量给差分对写PIN_DELAY
几十对差分对逐行填效率低,用Allegro SKILL按网络名批量写:
; 注册命令 set_pin_delay,用法: set_pin_delay 300ps axlCmdRegister("set_pin_delay" 'set_pin_delay) procedure(set_pin_delay(@optional (dly "300ps")) let((pins pin) pins = axlDBGetDesign()->pins foreach(pin pins when(rexMatchp("^U1_A[0-9]+$" pin->name) axlDBPropSet(pin "PIN_DELAY" dly) printf("pin %s -> %s\n" pin->name dly) ) ) axlSaveDesign() ) )脚本逻辑:axlCmdRegister把set_pin_delay注册成Command窗口命令,axlDBGetDesign取得当前设计的所有pin,rexMatchp按正则匹配网络名,axlDBPropSet把PIN_DELAY属性写入匹配到的pin。正则^U1_A[0-9]+$按实际网络命名改,跑完到约束管理器确认PIN DELAY列,重点抽查差分对P/N两个pin的值是否一致。收尾验证:把含PIN_delay的约束导出成Constraint Report,逐项核对DDR组和PCIe差分对的实际延迟与目标的margin,再交给时序仿真收口。
本文还有配套的精品资源,点击获取