ARTICLE DETAIL

资讯详情

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

LPDDR5 Read Training实战:时序参数理解与眼图优化

LPDDR5 Read Training实战:时序参数理解与眼图优化 做LPDDR5调试验证的朋友应该都有过这种经历芯片上电、固件跑到DDR初始化卡在Read Training那一步串口吐出一串报错眼图扫描结果一片红。LPDDR5的速率站上6400Mbps甚至8533Mbps之后一个UI只有一百多皮秒读路径上随便一点时序偏差都会让数据采样点偏出有效窗口。这篇文章想聊聊我在LPDDR5 Read Training里踩过的坑重点放在时序参数怎么理解、眼图怎么优化希望能给正在调DDR PHY的工程师一点参考。1. Read Training 到底在练什么1.1 从“数据能不能读回来”说起Read Training直译是读训练但它的真实目的不是让控制器“学会读数据”而是让接收端准确知道从DRAM返回的DQS和DQ到底在什么时刻到达控制器引脚有效窗口有多宽采样点放在哪里最安全。DDR系统是源同步传输DRAM发送读数据时会同时发出读DQS作为采样时钟。控制器端要用这个DQS去采DQ前提是DQS边沿必须落在DQ数据有效的中间位置。问题是从DRAM内部到控制器引脚DQS和DQ各自经过的路径长度不一样封装引线、PCB走线、片上驱动差异都会引入偏斜。速率越低这些偏斜占UI的比例越小甚至可以忽略到了LPDDR5的速率一个UI只有117ps左右8533Mbps下几百飞秒的偏斜都可能把采样点推到数据翻转沿上。所以Read Training做的事情本质是一套自动校准流程通过控制器和PHY配合向DRAM发起读操作然后在接收端扫描DQS的相位、门控窗口、数据采样点找到一个让所有DQ bit都能稳定采样的“安全区域”。1.2 训练顺序为什么写训练要排在前面很多第一次接触DDR训练的人会问Read Training出场顺序为什么排在Write Training后面这不是随手定的而是因为读训练依赖写训练建立的相位基准。Write Leveling完成之后写DQS与CK在DRAM侧对齐控制器知道写路径上的延迟补偿到多少。这个信息虽然不直接等于读路径的延迟但训练引擎会基于已经校准的时序关系推算读DQS到达控制器的粗略时间再去细化扫描。换句话说写训练给读训练提供了一个“起点”如果没有这个起点读训练只能全范围盲扫不仅耗时还可能因为DQS gate打开时机不对采到错误的数据甚至采到相邻命令的干扰。所以正常的LPDDR5存储子系统初始化和训练顺序是先上电、稳定时钟、配置模式寄存器然后做WCK2CK训练、Write Leveling、Write Data Training最后才轮到Read Gate Training和Read Data Training。训练失败时先检查前面的步骤有没有真正通过不要一上来就盯着读眼图改参数。1.3 LPDDR5 的新增变数WCK与CKLPDDR5和LPDDR4一个很大的区别是引入了独立的WCKWord Clock。LPDDR5的DRAM核心工作频率和I/O速率分离读数据由WCK同步送出而控制器发命令用的还是CK。WCK和CK之间存在频率比和相位关系这个关系在初始化时不确定需要专门的WCK2CK Training把它对齐。这意味着什么在读路径上数据的时间参考点从CK变成了WCK而控制器内部做时序计算、设置Read Latency时仍然要对应到CK域。如果WCK2CK训练不准确后面所有读时序参数都是空中楼阁。所以我在调LPDDR5时最优先确认的不是读DQS相位而是WCK2CK训练结果和控制器的频率比配置是否一致。实际调测中碰到过好几次现象是Read Training报错、读数据整体偏移最后查下来是频率比配置错误——训练引擎按2:1的WCK: CK算RL固件里却配成了1:1差出整整一个周期读回来当然全是错的。2. 读路径上的关键时序参数2.1 tDQSCK 与相位补偿tDQSCK全称是DQS output access time from CK指从CK边沿触发后DRAM输出DQS需要经过多长时间。这个参数在数据手册里会给出min和max比如常见LPDDR5颗粒在高温下tDQSCK可能达到1000ps以上而一个UI只有117ps相当于跨了好几个bit周期。如果不做补偿直接按默认RL去读数据采回来的数据根本不知道在第几个周期。Read Training的核心任务之一就是测出当前条件下实际生效的tDQSCK然后把它折算成延迟补偿值写进PHY或者控制器的延迟寄存器里。折算的方式一般是把tDQSCK除以UI得到需要插入的额外延迟周期和相位微调值。实际训练时训练引擎会先做一次粗扫描找到数据大致位置再做细扫描确定最佳采样点。这里有个实操经验光看training报告里的RL值还不够要关注训练引擎最终补偿到的tDQSCK报告值和颗粒数据手册里的典型值对比一下。如果偏差明显超出手册范围通常不是训练本身的问题而是前面的WCK2CK训练不准或者仿真模型里CK到DQS的封装延迟没建对。2.2 tDQSQ、tQH 与数据眼宽tDQSQ是DQS边沿到最后一个有效DQ数据边沿之间的时间差决定了DQS能包住多少数据有效窗口tQH是DQS高电平脉冲宽度和DQ有效窗口的关系。这两个参数直接决定读眼图能开多大。从训练的角度看tDQSQ越小越好说明DQS和DQ的偏斜越小。实际PCB设计里DQS和DQ走线会做等长处理但仍然存在过孔、引脚、封装带来的残余失配。Read Training里的per-bit deskew就是针对每一根DQ单独调整延迟把每根DQ相对DQS的偏斜拉回来。训练完成后PHY的report里会列出每个bit的setup margin和hold margin这两个margin加起来如果小于0.5UI后续量产就非常危险。我习惯用“眼睛”来理解tDQSQDQS是眼睛的上眼皮DQ有效窗口是眼球眼皮必须足够宽把整个眼球包住采样点才能安全落在眼球中心。如果tDQSQ偏大等于上眼皮往下压眼球露出来的部分就少采样点的安全容差被压缩温度一漂就会出错。2.3 tRPRE/tRPST 和 DQS GateDQS不是一直有效的。读操作时DQS会有前导preamble和后导postamble分别用tRPRE和tRPST表示。前导的作用是给接收端“预告”数据要来了DQS时钟准备开始采后导则是告诉接收端数据发完了DQS可以停止采样。问题在于控制器端的DQS接收器不能一直开启。如果一直开DQS总线空闲时的噪声会被当成有效时钟采进去如果关太早脉冲后导部分没采完又可能丢数据。所以Read Training里专门有一项DQS Gate Training也叫读门控训练目的就是确定从哪个时刻打开DQS接收门、哪个时刻关闭确保只把有效读脉冲放进来。LPDDR5速率高DQS前导窗口变得很窄而且读和写共用一个DQS总线开关切换时容易发生残留信号。Gate训练的扫描方式通常是从早到晚移动开门位置找到最早能通过和最晚能通过的边界然后取中间值作为最终配置。实际调测中Gate窗口如果特别窄多半不是训练算法的问题而是板上DQS信号质量差或者DQS走线比DQ长太多导致前导退化。这时候先查硬件不要盲目调延迟寄存器。2.4 RL 与 DFI 延迟配置RLRead Latency是从列选命令发出到第一个读数据出现在DQ上的延迟单位是时钟周期。LPDDR5里RL还和WCK频率比、tDQSCK补偿值耦合在一起不是简单查表就能定死的。训练引擎会根据实际测量的时序关系把RL的整数部分和门控延迟的小数部分分开配置。DFIDDR PHY Interface规范里控制器的读通路依靠dfi_rddata_en信号和对应的延迟寄存器来决定什么时候从PHY接收数据。PHY完成训练后会把RL折算到DFI时序域生成dfi_rddata_en的相位和宽度。如果你在调试时改了RL忘记同步更新DFI配置就会出现训练报告里一切正常、跑系统却随机读错的现象。参数含义训练中的影响常见坑tDQSCKCK到DQS输出延迟决定RL的补偿值温度漂移后不重训会错位tDQSQDQS到DQ的偏斜决定per-bit deskew量某根DQ margin特别差tQHDQS高脉冲与DQ窗口关系影响采样点定位窗口宽度不够tRPRE读前导宽度影响Gate开门时机前导退化导致Gate窄tRPST读后导宽度影响Gate关门时机门关晚采到空闲噪声RL/DFI延迟读延迟与PHY接口延迟最终决定数据何时被采样RL改了DFI没同步3. 眼图优化的实际操作3.1 训练前的检查项动手调眼图之前先把下面这些检查一遍能省掉大量排查时间。供电和参考电压是第一优先级。LPDDR5对VDD2、VDDQ的纹波非常敏感读眼图看着就是打不开一量电源纹波超标。DRAM的VREF也就是接收端的参考电压也直接影响读眼图的高度。LPDDR5支持内部VREF校准但这个校准要等读训练完成后做才有意义。时钟同样不能漏检查。CK和WCK的抖动、频率精度超标读训练结果会不稳定同一次训练跑两遍margin每次都不一样。训练环境本身也要看控制器和PHY的配置代码版本、训练引擎的微码版本不同版本对读训练的策略差异不小遇到诡异的margin结果先确认是不是版本没对齐。最后写训练结果一定先确认通过。写Path没校准好读训练时发出的读命令时序就跟着偏得到的门控窗口和采样点没有可信度。换句话说写训练是读训练的基石基础歪了上面盖的楼再漂亮也立不住。3.2 标准训练流程的步骤拆解LPDDR5的Read Training标准流程我一般按下面几步走每一步都验证通过再进下一步。第一步是频率和WCK2CK配置。设置目标频率配置好WCK与CK的频率比运行WCK2CK Training。完成后回读训练结果确认相位校准值在合理区间。这个值在调试过程中要记录后面排查问题有用。第二步是写训练和写数据校准。包括Write Leveling、Write DQ校准、写VREF校准。跑完记录每根DQ的per-bit延迟值看有没有某根DQ的补偿量明显异于其他bit如果有大概率是走线或颗粒本身的问题。第三步是Read Gate Training。这是读训练的“开门”环节。训练引擎扫描DQS Gate的最佳打开窗口输出gate_start和gate_end两个边界值。我要重点看的是窗口宽度也就是gate_end减去gate_start的值。正常应该覆盖大部分UI如果窗口窄到只剩一半先查DQS信号质量。第四步是Read Data Training。训练引擎在Gate窗口内进一步扫描DQS相位和每个DQ bit的采样点得出每根DQ的setup/hold margin选定最终RL和DQS相位配置。这一步报告里的margin表是我后续判断系统裕量的主要依据。第五步是眼图扫描和全地址校验。完整的训练流程跑完后用PRBS或者特定数据模式跑全地址读写校验。不要只看training pass就认为完事训练pass只能说明训练算法找到了一个解这个解优不优必须用压力测试验证。3.3 眼图扫描与 margin 报表怎么看训练完成后PHY的调试工具会导出一份margin报告里面包含每个DQ bit的setup margin和hold margin。这个报告是眼图优不优的直接体现。举个我调过的例子某个LPDDR5设计在跑完训练后报告里大部分bit的setup/hold margin都在0.35UI以上只有DQ3的setup margin只有0.15UI说明这根DQ的采样点已经非常靠近边界。同期用示波器测眼图DQ3的眼宽也确实比其他DQ窄。这就是典型的per-bit偏斜问题。看margin报告不能只看平均值要看最小值。平均值再漂亮只要有一根DQ的margin小整个系统在量产环节都会出问题。我的经验标准是在常温下每个bit的setup和hold margin都应该大于0.25UI最好到0.3UI以上。如果某根DQ达不到就要去查走线、过孔、串扰而不是一味靠训练去“补”。还有一种情况是margin整体都小所有bit都只有0.15UI左右。这种不是单bit问题很可能是DQS相位没对准或者VREF整体偏低/偏高。先重新确认VREF校准结果再手动微调DQS相位通常会有明显改善。3.4 手动调整阶段per-bit deskew 和 VREF自动化训练不是万能的。有些场景下自动化训练选出来的解不是最优解需要手动干预。需要注意的是手动调整必须在训练结果基础上做不要推翻训练引擎直接盲调。per-bit deskew是调整单根DQ的延迟目的是把个别偏斜大的bit拉回中心。调整时一次只动一根DQ、一次只加一个延迟步进改完跑一次内存压力测试确认没有引入新的错误再接下去。如果把所有DQ一起调反而会把原本对好的位给带偏。调试时我习惯把每根DQ的初始margin记录成表格每调一次更新表格这样能直观看到调整效果。VREF的调整影响的是眼图高度和per-bit deskew的“眼宽”是正交的两个维度。LPDDR5支持读VREF校准但校准范围有限如果校准后的VREF值落在了范围边界读取可靠性就不好。这时候可以在训练工具里手动上下偏移VREF同时跑压力测试看错误率是否变化。测下来VREF偏移超过一定量、错误率明显上升的说明眼图高度本来就紧张要考虑从信号完整性层面解决。实操里最容易犯的错误是“贪”。某个参数调到边缘位置发现内存压力测试居然过了觉得是优化成功了。实际上边界上跑过只能说明运气好温度一变、电压一抖就直接挂。手动调优的准则是找到窗口中心而不是靠近边界。4. 常见问题与排查实录4.1 boot 死掉或数据校验失败这是最常见的问题。启动时跑到Read Training就卡死或者training pass了但后续内存自检随机报错。排查顺序我一般这么走。先看训练日志卡在哪一步。如果卡在Read Gate Training优先怀疑DQS信号质量和Gate窗口如果卡在Read Data Training优先看spare bit或per-bit补偿值是否有异常如果training全过但自检报错优先看RL和DFI配置是否一致然后看VREF校准结果。有一次调板子现象是训练全过跑memtest十分钟左右开始出错而且错误地址不稳定。查了很久最后发现是WCK2CK训练时温度偏低训练完成后板子工作温度上升tDQSCK漂移超出补偿范围。换用温度补偿模式重新训练问题消失。这个案例让我养成了习惯每块板子调完训练都在高、低温下各跑一遍完整流程看margin变化趋势。4.2 温度漂移导致的读窗口失效LPDDR5的温度敏感性比DDR4明显。tDQSCK、tDQSQ都会随温度变化高温下读数据有效窗口会变窄。训练是在常温下做的到了高温环境margin被吃掉一大块严重的直接训练失败。针对这个问题有几个处理方向。第一是训练时留足裕量不仅满足“能过”还要看margin余量足够覆盖全温区。第二是做温度补偿重训也就是固件里检测到温度变化超过阈值时重新触发Read Training。第三是仿真阶段就要做温变仿真把不同温度下的时序参数代入系统级仿真提前发现裕量不足的pin。这里我分享一个实测经验0.25UI的margin在-20℃到85℃范围内读窗口可能缩水一半。如果你的量产产品工作温度范围很大常温下至少留0.35UI margin否则后面温循测试一定挂。4.3 眼图不对称或单根DQ特别差眼图扫描结果显示左右边界不对称或者同一组byte lane里某根DQ的margin明显比其它差这类问题十有八九出在硬件上不是训练能根治的。单根DQ差先查PCB走线。打开布线文件看这根DQ的长度、过孔数量、相邻走线情况。走线长度和同组DQS差距大会直接表现为tDQSQ偏大。串扰也有可能DQ和DQS靠得近或者旁边有高翻转率的信号眼图就会被压窄。这类问题在仿真阶段能发现如果已经做出来了只能通过deskew强拉但对工艺一致性要求很高不建议量产依赖这个。眼图整体不对称常见原因是DQS duty cycle畸变。LPDDR5的读DQS由WCK分频产生如果WCK本身占空比不好读DQS的前导宽、后导窄Gate窗口就不对称。处理方法是先查WCK2CK训练结果再查PHY有没有duty cycle corrector寄存器正确配置后眼图不对称能改善不少。4.4 仿真与实测对不上仿真里读眼图漂亮得很实测却差得离谱反过来也有仿真显示margin不足实测却稳定跑完压力测试。这种对不上的情况大家应该都不陌生。仿真和实测差异大的根因主要是模型精度和测量方法。LPDDR5速率太高传统IBIS模型里的封装寄生参数、片上阻抗随频率变化行为的近似在几百飞秒级精度下就不够用了。更靠谱的做法是用经过硅验证的IBIS-AMI模型或者SPICE级模型。没有这类模型的时候仿真结果只用来做相对对比不要当成绝对裕量。实测这边也有坑。示波器探头的负载效应在LPDDR5速率下很明显探头一上去本来就不宽的眼图更小了。如果必须用示波器测眼图尽量用低负载探头并在测量结果里给探头负载留出余量。更推荐的方式是使用PHY内部的环回测试和训练margin报告来评估时域裕量比示波器测量更贴近真实工作条件。我个人在做LPDDR5调测时还习惯把每次训练的margin结果存档对比同块板子、同批颗粒之间的差异。通过积累几十块板子的训练数据能看出哪些参数天然稳定、哪些参数波动大后续做量产筛选和故障分析时这些数据往往是定位问题最快的线索。如果遇到百思不解的疑难杂症我的建议是退回去检查基础项——电源纹波、参考时钟抖动、地弹噪声很多时候根因就藏在这些容易被忽略的小细节里而不是在读训练算法本身。
返回列表