拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

LPDDR5上电与初始化时序训练全解析:从Power Ramp到CA/DQS校准

LPDDR5上电与初始化时序训练全解析:从Power Ramp到CA/DQS校准 做DDR调测这几年我最怕看到的现象不是板子点不亮而是点得亮但初始化过程中时不时失败一次抓波形又抓不到根因。LPDDR5比DDR4多了WCK和更复杂的训练流程上电从Power Ramp开始到CA Training结束中间任何一环的时序余量不够后面都是玄学故障。这篇文章就把LPDDR5上电与初始化这条链路完整拆开讲一遍包含我实际调LPDDR5-6400时用到的电压爬坡参数、Reset/CKE窗口、Mode Register配置顺序、CA Training的扫描逻辑以及DQS-DQ训练的常见坑。适合正在调板子的硬件工程师、写控制器驱动和底层固件的软件工程师以及准备做单颗粒双通道LPDDR5方案的架构评估的人参考。1. 整体设计思路LPDDR5 初始化到底在“约”什么1.1 从DDR4到LPDDR5时序链路发生了什么变化在说LPDDR5之前先想清楚DDR4那套逻辑。DDR4片内基本没有训练引擎初始化由控制器把MR设置好然后靠PHY的固定延迟走DQS-DQ训练write leveling、write data training、read leveling。这套流程本质是解决PCB走线长度不一致导致的skew问题训练的对象主要集中在DQ/DQS和命令时序。LPDDR5不同。频率上到6400MT/s之后数据UI只有156.25ps命令/地址总线的周期是312.5ps。在这个尺度下芯片内部时钟分布、引脚到核心逻辑的延迟、甚至片内温漂都已经不能忽略。JEDEC JESD209-5引入了大量训练术语包括CA Training、WCK2CK同步、VREF Training等。这些训练的目的从宏观上看是两件事把控制器发送的命令/地址信号在DRAM接收端的建立保持窗口调到最大把DRAM返回的读数据在控制器接收端的采样窗口调到最大。写数据方向的训练其实是第三条——把控制器发出的DQS/DQ在DRAM端口的setup/hold对中。所以这篇“上电与初始化时序”不是简单列几个参数而是把从电压域建立到PHY训练完成的整个状态机走一遍。每一步都有明确目的电源建立让内部逻辑有确定的电平参考RESET/CKE让状态机进入可接收命令的确定态MR配置确定IO驱动强度、端接、读写延迟ZQ校准让输出驱动/ODT阻抗对准标称值CA Training让“命令能不能被可靠收下来”DQS/DQ训练让“数据能不能被可靠收下来”。五个阶段缺一不可顺序也不能乱。1.2 LPDDR5的通道架构对训练流程的影响这里需要提一下“单颗粒双通道”这个热词。LPDDR5颗粒内部通常集成两个16bit的channel比如一个x32封装每个channel有独立的DQS/DQ、独立的CA bus和独立时钟两个通道共用电源和部分控制逻辑但训练必须按通道分别做。也就是说你初始化一个双通道颗粒相当于同时初始化两个“半独立”的内存子系统。这对调试意味着什么意味着CA Training的扫描结果必须按channel分开看A通道过了不代表B通道过两个通道的VREF也要分别校准。实际工程里最常见的错误就是把A通道训练好的PHY延迟参数直接搬到B通道。PCB上两个通道的走线长度不见得一致片内ODT电阻也有偏差搬过去大概率B通道训练失败。1.3 控制器、PHY和DRAM三方的责任边界初始化的执行顺序通常由控制器内嵌的MCMemory Controller状态机主导MC只负责在正确的时间点发出NOP、MRW、ZQCL等命令真正的延迟调整、窗口扫描是PHY的Training Engine在做。多数商用IP比如Synopsys DWC、Cadence、Xilinx/FPGA方案会把训练流程封装成固件固件通过APB/AXI寄存器访问PHY。调试时你不需要从头写训练算法但要能读懂固件吐出来的训练日志知道它停在哪个步骤。调LPDDR5最常遇到的困惑是“同样一颗颗粒换个PCB批号就training失败”这种case几乎都是把责任推给DRAM之前没先确认PHY端配置。我的习惯是先查PHY的初始化流程有没有按手册要求使能所有通道、有没有在训练前关闭MC的refresh、有没有把PHY时钟频率配到和MC一致再怀疑颗粒。顺序反了会被训练日志带偏。2. Power Ramp 阶段三大电源轨的“起跑顺序”2.1 电源域划分与关键电压LPDDR5的电源域比DDR4多通常有三个主要供电轨VDD1逻辑核心高压轨典型1.8V负责耐压较高的内部电路。VDD2逻辑核心中压轨典型1.05V负责大部分核心逻辑。VDDQIO接口轨典型0.5V走LVSTL电平标准直接决定命令/地址/数据总线的高电平幅度。理解这个划分很关键VDD2是芯片逻辑主力VDD1是辅助高压域VDDQ则直接服务于IO缓冲区。因为VDDQ的高低电平直接决定CA和DQ上信号是否有效它不建立好后面所有总线动作都没有物理意义。这也是后续初始化步骤都排在上电完成之后的根本原因。2.2 上电顺序、斜坡速率与实际约束规范对Power Ramp的核心要求可以归纳成三条VDD2不得晚于VDD1爬升通常要求VDD2先于或同时于VDD1VDDQ不得早于VDD2和VDD1各轨爬坡速率需要在规定范围内。为什么VDDQ不能早因为IO接收端的ESD保护二极管在上电瞬间可能形成闩锁路径如果VDDQ先于VDD2/VDD1建立内部等效电路会处于一种不可控的偏置状态。这不仅是理论问题我见过实际案例某块板子为了加快启动把VDDQ的EN信号提前了结果芯片严重发热初始化直接失败换回正常时序后一切正常。电源轨的先后顺序建议参考SoC/PMIC的参考设计不要自己创新。爬坡速率参数方面我在调试时重点关注两个值一是各轨从10%到90%标称电压的上升时间二是爬升过程中是否出现电压台阶。规格书一般要求斜坡速率在0.25V/ms到10V/ms之间。太慢系统启动等待时间变长太快VDDQ的大电流冲击可能造成地弹引发其他电源轨毛刺。PMIC的软启动斜坡设计通常设在0.5V/ms到2V/ms这也是多数平台默认值。2.3 上电时序测量与常见硬件坑上电调试我习惯用四通道示波器同时抓VDD1、VDD2、VDDQ和RESET_n触发设为VDD2上升沿。重点检查三件事VDDQ和VDD2/VDD1的先后关系、各轨是否出现“回沟”电压先上去后又掉下来再爬上去、RESET_n是否在所有电源进入90%标称之后才拉高。回沟是最容易被忽略的坑。它通常来自后级负载电流太大、LDO/DC-DC环路补偿没调好或者大容量去耦电容充电导致前一级板级电源跌落。回沟深度如果超过标称电压的5%LPDDR5内部逻辑可能还没完全复位就收到RESET_n拉高后面训练失败概率显著上升。这里还要提醒一个细节测量Power Ramp时示波器探头带宽不要低于500MHz探头地线必须短接在测试点附近。否则你测到的爬坡波形会包含大量振铃容易误判成电压台阶。我用过1GHz带宽的差分探头抓VDDQ看到的现象和普通探头完全不同这也是很多人测了半天测不准的原因。3. Reset 释放与 CKE 拉高初始化状态机的“点火”3.1 Reset窗口先稳电源再动RESET电源稳定之后LPDDR5颗粒会一直保持在复位状态直到RESET_n从低电平释放。这部分关键参数有几个RESET_n低电平保持时间从电源达标到拉高规格书一般给一个最小值工程上建议预留50%以上余量RESET_n拉高后到CKE拉高之间的最小间隔包含时钟稳定时间和内部振荡器/锁相环锁定时间RESET_n释放与CK的相位关系没有硬性要求但CKE拉高必须相对CK满足建立保持时间。实际Debug时我见过最多的问题是系统用硬件看门狗在启动早期就拉RESET_n但看门狗动作没有和电源管理芯片的Power Good信号做同步。结果就是偶尔一次reset过早颗粒内部状态没清干净训练失败。解决办法是RESET_n的释放信号必须来源于“电源OK”并再延时一段固定时间而不是软件随手拉一个GPIO。3.2 CKE拉高与时钟稳定的对齐关系CKE拉高是LPDDR5退出复位、开始接受命令的关键一步。在CKE拉高之前PHY必须已经把CK差分时钟稳定输出并且至少跑够tCKSRX这类参数要求的周期数。工程上稳妥的做法是PHY先启动时钟输出等待几百微秒远超规范最小值再拉CKE。这个余量几乎没有副作用但能排除PHY锁相环锁定慢、时钟抖动大等启动异常带来的偶发失败。CKE本身是CMOS电平信号但它进入DRAM内部会参与时钟门控逻辑所以CKE拉高的沿必须和CK有明确的建立保持关系。控制器在拉CKE前通常会用NOP命令预热总线让CA/CS总线保持确定的电平状态避免CKE拉高瞬间CA总线上出现毛刺被误判成命令。这个细节在PHY训练日志上不会体现但确实会导致偶发初始化失败。3.3 初始化命令序列MRW和ZQ的先后逻辑CKE拉高后MC会依次发出一串初始化命令。主流控制器的固定序列大致如下发送NOP命令等待tINIT初始时间执行ZQCL长校准校准IO阻抗写入一组MRW配置电源模式、刷新参数、驱动强度/ODT、RL/WL再执行一次ZQCL/ZQCS让校准结果作用到新配置的驱动和ODT上等待tZQCAL完毕后进入PHY Training阶段。这里有个容易被忽视的逻辑MRW配置驱动强度应该在ZQ校准之前还是之后工程上建议先MRW把IO配置好再ZQCL这样ZQ校准出来的码值作用在正确的目标阻抗上。反过来如果先ZQ后MRW校准结果在MRW之后可能因为驱动强度变化而失效。另外刷新相关的MRW要特别小心。LPDDR5默认进入自刷新Self Refresh如果不把刷新模式配置到正确状态训练过程中随时可能插进来一个自刷新Exit干扰训练窗口。我踩过一次固件漏配了刷新模式结果训练前20次通过第21次必失败排查了一天才发现是刷新和训练抢时间。4. Mode Register 与 ZQ 校准参数先设对训练才有意义4.1 关键MR配置项驱动强度、ODT、RL/WL、刷新LPDDR5的MR数量比DDR4多很多调试时我一般只关心以下几组驱动强度Driver Strength决定CA/DQ输出阻抗常见选项有40/48/60/80/120欧姆等需要按系统信号完整性和走线阻抗选择ODTOn-Die Termination区分写方向和读方向端接阻值常见也是40/48/60/80/120欧姆直接影响信号反射和眼图RLRead Latency和WLWrite Latency控制器和DRAM之间数据采样时刻的基准后面DQS-DQ训练的结果会在这个基准上做微调Refresh配置包括自刷新使能、刷新间隔训练过程中需要临时关闭或延长VREF配置DQ VREF和CA VREF的初始值后续VREF Training会在初始值附近调整。一个比较重要的实践经验MR配置不是一次性写到位的。很多平台会在粗配后做一轮基础训练再用训练结果更新MR比如调整VREF、ODT之后再做完整训练。所以如果你看到固件日志里出现两组MRW不要觉得是bug那是正常的“两阶段配置”。4.2 ZQ校准原理与长/短校准选择ZQ校准的本质是用芯片内部一组精密比较器把ZQ引脚外接的240欧姆参考电阻与片内可调电阻阵列做逐次逼近比较产生一组校准码。这组码用来控制输出驱动和ODT的阻抗使其在工作温度、电压漂移时仍然对准目标值。整个过程相当于给芯片内部的“可变电阻”做了一次数字标定。LPDDR5有ZQCL长校准和ZQCS短校准两种命令。长校准精度高、耗时约几百纳秒到微秒级短校准速度快、精度略低。系统启动阶段一般做一次ZQCL运行过程中如果不做周期性的ZQCS温度漂移可能导致信号质量逐步恶化最终出现偶发训练失败。所以正常工作时软件要周期性发ZQCS这个动作不能省。调试时可以用示波器测量ZQ引脚电压。正常长校准过程中ZQ电压会从初始值逐步稳定到0.5×VDDQ附近。如果不是这样大概率是ZQ电阻焊接问题或PCB寄生电容过大。我遇到过ZQ电阻贴错封装导致地弹训练日志显示ODT calibration pass但CA信号质量奇差的情况用示波器一看ZQ引脚波动严重替换合格电阻后一切正常。4.3 训练前必须确认的PHY控制器配置软件配置MR之前必须先确认PHY侧几个基本项PHY的时钟频率是否与目标LPDDR5数据率匹配MC与PHY之间的DFI接口频率、DFI PHY Master模式是否使能所有通道的PHY数字延迟线初值是否一致训练固件的版本是否支持当前颗粒型号。这一块最容易出的问题是使用FPGA开发时把DDR4的PHY初始化代码拿过来改却漏了WCK使能。LPDDR5的写数据路径依赖WCKWord Clock如果PHY没有使能WCK输出写训练永远失败而且训练日志只会显示“write training no window”完全不会提示是WCK没开。我第一次调LPDDR5时在这个问题上花了两天希望大家不要重蹈覆辙。5. CA Training 与 DQS-DQ 训练时钟相位校准的手术现场5.1 CA Training的物理意义先说一个基本物理前提LPDDR5的命令/地址总线仍然是单端信号CK差分时钟负责捕获CA采样的时序基准。随着频率升高芯片引脚到内部采样的路径延迟、走线长度差、片内温度漂移都会造成“相位漂移”。CA Training要做的就是在控制器端逐根调整每根CA信号以及CS、CKE等控制信号相对CK的延迟使整组信号到达DRAM接收端的建立时间和保持时间都处于窗口中心。一个容易误解的点CA Training不是DRAM内部训练出来的东西而是控制器侧训练。DRAM没有能力改变CA的采样时刻它能做的只是通过MRR回读或者MPR模式返回固定pattern控制器根据DRAM的响应来判断当前CA相位是否有效。这也是CA Training和DQS-DQ训练最大的区别。5.2 扫描方法、窗口判定与per-bit de-skew实际CA训练的基本流程可以简化为PHY把时钟和CA延迟线设为最小值向DRAM写入MPR使能命令或者通过MRR读回一个已知pattern控制器依次发送CA训练patternDRAM回读数据若读回的pattern与预期一致则认为当前相位是“通过”以固定步长通常1/64或1/256个UI逐步增大延迟记录所有通过点得到窗口对每根CA信号重复上述扫描得到per-bit的de-skew值并将延迟线更新到每根信号的中点。这里有一个参数计算参考如果数据率是6400MT/s命令总线的UI是312.5ps。很多PHY延迟线提供约1/64个UI的步进也就是约4.88ps。如果你的训练窗口只有3到4个步进说明CA总线的信号完整性已经非常紧张不要指望de-skew能救回来应该回头查PCB走线等长、VREF和ODT配置。5.3 DQS训练与DQ数据眼校准写/读方向DQS-DQ方向的训练比CA训练复杂至少分四个阶段顺序不能乱Write Leveling调整写DQS相对CK的相位让DQS的上升沿与CK对齐。没有这一步后面写数据全都白搭。Write DQ Training逐bit扫描写数据延迟找到每个DQ bit相对DQS的有效窗口把延迟调到窗口中心同时训练正确建立保持关系。Read DQS Training也叫Read DQS Gate训练调整读DQS的接收门控窗口确保PHY只在有有效DQS返回时才开门采样。门开早了会采到总线毛刺门开晚了会丢有效数据。Read DQ Training扫描读数据bit相对读DQS的相位把每个bit的采样点移到眼图中心。四个阶段中Read DQS Gate训练失败率最高因为它依赖DQS从DRAM返回到控制器的时间。这个时间不只和走线长度有关还和温度、电压以及颗粒内部延迟有关。LPDDR5的读DQS门控窗口受片内去偏逻辑影响较大调试时如果读方向总是不稳定优先检查WCK和DQS之间的相对抖动以及PHY门控延迟初值。5.4 一个具体的训练流程示例含寄存器级操作以某个基于AXI总线的PHY为例不同IP寄存器名不同思路通用调试日志里会出现类似下面的流程[PHY_TRN] Step 1: write leveling [PHY_TRN] ch0: wl pass, final code115, window[102,131] [PHY_TRN] Step 2: write DQ training [PHY_TRN] ch0: wdq pass, code66/67/65/68, avg center66 [PHY_TRN] Step 3: WCK2CK training [PHY_TRN] ch0: wck2ck pass, code80 [PHY_TRN] Step 4: read DQS gate training [PHY_TRN] ch0: rdqs gate fail, no window看到“read DQS gate fail, no window”这种日志先不要急着怀疑PHY代码。我会按下面顺序排查检查WCK是否已经使能并稳定输出用示波器看WCK波形检查读DQS返回路径上是否存在信号完整性问题特别是DQ/DQS端接到VDDQ的端接是否使能检查PHY门控延迟扫描范围是否足够有些IP的默认扫描范围只有半个UI对走线较长的板子不够用最后才考虑DRAM侧的MR配置有没有把RL设错。如果这些都没问题可以在寄存器里把门控延迟的初值往一个方向偏置重新跑一遍训练。工程上很多时候是初值设得太居中导致扫描窗口被边界截断稍微偏置一下窗口反而就出来了。6. 实操工具与自动化把调试效率提上去6.1 示波器抓取上电时序的要点抓Power Ramp和Reset时序示波器建议至少4通道带宽500MHz以上采样率不低于1GSa/s。探头用短地线的无源探头或差分探头都可以关键是地线必须就近接地不能拖一根长鳄鱼夹。测量时把VDD2设为触发源时基设在10ms/div到100ms/div之间看完整的上电窗口。测完波形后记录三个时间点VDD2到达10%时刻、VDDQ到达90%时刻、RESET_n拉高时刻这三个时刻的先后关系就是判决依据。如果VDDQ到达90%的时刻比VDD2晚得不够多就需要检查PMIC的时序配置。6.2 寄存器读写与自动化扫描脚本示例如果PHY的寄存器可以通过内存映射或者I2C/SPI访问写一个简单的Python脚本做自动训练扫描会省很多时间。下面是我常用的扫描逻辑骨架实际寄存器偏移按PHY手册替换import time def read_reg(addr): # 根据平台实际访问方式替换 return bus.read(addr) def write_reg(addr, val): bus.write(addr, val) def run_training(step): write_reg(0xF00, step) # 触发训练步骤 time.sleep(0.05) return read_reg(0xF10) # 读训练结果 def scan_ca_window(signal_id): results [] for code in range(0, 64): write_reg(0xF20 signal_id, code) # 设置CA延迟 status run_training(0xCA) results.append((code, status)) pass_codes [c for c, s in results if s 0] if not pass_codes: return None window_start min(pass_codes) window_end max(pass_codes) center (window_start window_end) // 2 return window_start, window_end, center扫描完拿到的窗口列表直接打印出来如果窗口不连续比如只有两端通过、中间失败大概率是信号完整性问题而不是延迟设置问题。这个现象后面还会说到因为它真的很常见。6.3 训练结果日志如何解读训练日志一般会输出每步训练在每个通道、每个bit上的通过/失败以及最终code。看日志有几个要点先看有没有FAIL有FAIL直接定位步骤看通过窗口的宽度如果窗口只有1到2个code属于高风险通过批量生产时可能因为温漂直接失败对比两个通道的code如果差异过大比如通道A的CA code是30通道B是52检查两个通道PCB走线长度差是否合理。另一个经验所有训练code最好保存下来作为Golden Dataset。换一批颗粒、换一块PCB后重新训练对比code差异能快速发现板级变化。看到code变化超过10个步进但PCB没改就该查电源纹波或者颗粒批次差异了。7. 常见问题与排查技巧实录7.1 高频失败现象速查表我把调LPDDR5过程中最常遇到的问题整理成一张表方便对照失败现象优先排查方向检查要点初始化卡在Power Ramp后的Reset等待电源时序VDDQ是否晚于VDD2/VDD1RESET_n是否在所有电源稳定后才拉高CA Training窗口很小或只有1个点CA总线信号完整性PCB等长、VREF、ODT、驱动强度检查ZQ校准结果Write Leveling失败DQS与CK相位PHY时钟频率、WCK使能、写DQS延迟初值Read DQS Gate失败WCK/DQS返回路径WCK是否稳定、门控延迟扫描范围、RL配置Write/Read DQ训练部分bit失败DQ走线等长对应bit的走线长度差、串扰、端接训练过程中偶发失败刷新与训练冲突Refresh MR配置训练前是否禁止refresh高温下训练失败率上升电源/散热电源纹波、ZQCS是否周期执行、温度补偿这张表不是标准答案但覆盖了大部分工程现场的高频问题。7.2 典型案例CA窗口偏移的定位过程举一个真实案例。某板子在常温下CA训练全过但把板子放进恒温箱升到85度后训练偶尔失败。从日志发现失败时CA窗口整体右移了差不多8个code。排查过程先确认不是电源问题VDD2在高温下纹波正常再排除DRAM颗粒本身换了三颗颗粒现象一样最后用示波器对比常温/高温下的CA波形发现CA信号的上升沿变缓、判决点偏移。根因是PCB上CA网络走线过长且负载过重高温下片内驱动器的输出电阻变大信号边沿更慢建立时间恶化。解决办法是改MRW配置把驱动强度从60欧姆调到48欧姆重新训练后窗口回到正常范围。这个案例说明CA Training的窗口宽度本质是信号质量的度量训练code只能告诉你哪里不对不能替你解决SI问题。调驱动强度、调ODT、调VREF这些信号完整性的动作才是真正把窗口打开的手段。7.3 老工程师的四个避坑提醒第一个提醒不要跳过Power Ramp验证直接跑Training。电源时序问题偶尔能靠PHY容错掩盖过去但产品到量产阶段温度一变化就会爆发。上电波形务必全流程抓一遍存档。第二个提醒训练代码务必按通道、按bit分开保存。LPDDR5单颗粒双通道的左右通道训练结果天然会有差异统一套用一份code会掩盖问题。第三个提醒遇到训练失败先复位一遍再跑不要直接改代码。很多偶发失败是训练前的MC状态残留重新初始化一次往往就过了。如果连续三次都失败在同一位置再开始正式分析。第四个提醒所有MRW配置修改都记录ChangeLog每次改完训练结果同步保存。DDR调试最怕“昨晚还能过今天什么都没动就挂了”没有配置记录根本无从查起。我个人在实际调试中体会最深的一点是LPDDR5的初始化时序链条很长长到任何一个环节的小问题都会被放大成训练失败的大问题。不要用“先点亮再说”的心态去碰LPDDR5而是把上电、复位、MR、ZQ、CA、DQS、DQ训练当作一条可验证的流水线每一段都留下波形或日志证据。最后再分享一个小经验当训练窗口怎么调都打不开时不妨从功耗角度看一眼VDDQ的实际波形很多LPDDR5训练失败的根因不是时序逻辑而是0.5V的电源轨纹波超了规格。先保证电压干净再谈时序这个顺序在DDR调试里永远成立。
返回列表