简介JEDEC DDR5 Spec PDF 是联合电子设备工程委员会发布的 DDR5 内存规范文档面向内存设计、验证、测试及相关系统开发人员为从 DDR4 向 DDR5 迁移提供权威参考。规范核心特点包括最高 6400 MT/s 数据传输速率、更低功耗与更高存储密度并系统覆盖模块物理层/电气特性、控制器架构与指令集、PHY 层时钟与数据传输机制同时给出信号完整性要求、关键时序参数、命令真值表、封装引脚定义以及模式寄存器、初始化与复位流程等细节内容预览显示其包含直至 Rev0.99f 的完整修订历史便于按版本追溯技术变更。包体为单个 PDF 文件约 10.39MB适合直接下载后离线查阅和关键词搜索目前已有 3764 人学习下载尤其适合服务器、存储系统及高性能计算场景的硬件工程师与半导体从业者作为标准备查与合规评估工具。1. 拿到 JEDEC DDR5 Spec pdf 先别当最终规范看很多人拿到的这份 JEDEC DDR5 Spec pdf并不是最终发布的 JESD79-5而是 JC42.3 委员会在 2019 年初流出的 Full Spec Draft Rev 0.84g。它难读但信息密度比最终版高得多BL32 突发长度被拆成四个 ballot 分别表决TRR 在草稿中后期被 RFM 替换MR12 因为 VREF 寄存器排布被挪成 MR13ODT 的 RTT_PARK 默认值在前后两轮之间被改成 OFF。这些设计取舍在正式发布版里不会留痕迹。对内存控制器开发、PHY 设计、固件工程师和服务器平台验证来说这份草稿是理解 DDR5 从 3200 走向 4800 MT/s 时训练序列、命令时序与 ODT 改动动机的第一手材料。2. DDR5 物理层与电气特性x16 封装引脚与压力眼图2.1 x16 DRAM 封装引脚寻址修正背后是 Bank 组结构变化草稿在 Rev0.77 修正了 x16 寻址表里 #BG / #Banks per BG / #Banks 的错误看起来是笔误修订实际上暴露了 DDR5 和 DDR4 在 Bank 组织上的关键差异。DDR4 的 x4/x8/x16 共用一套 Bank 组结构DDR5 的 x16 颗粒受引脚数限制BG 数量与 x4/x8 不同。草稿修正后的配置是x4 和 x8 用 4 个 Bank Group、每 BG 4 个 Bankx16 缩到 2 个 BG、每 BG 4 个 Bank。总 Bank 数从 16 变成 8这直接影响 bank group 级别的读写并行度和刷新调度窗口。配套的还有 Addressing Table 的 editorial update。x16 的 Row/Column 位宽随 BG 缩减重新分配固件里如果沿用 DDR4 的地址映射某些地址位会被解释错。调 x16 内存条时最直接的影响是 tCCD_L 能比 x8 更宽裕但同一 BG 内的 Bank 冲突概率上升。平台验证时建议先用寻址测试遍历全部 Row 地址确认 MC 的地址译码和颗粒寻址表一致。器件宽度Bank Group 数每组 Bank 数总 Bank 数草稿状态x44416基础结构x84416基础结构x16248Rev0.77 修正x16 的 DQ 还分 upper/lower byte这跟后面写电平校准的 MR2/MR3 合并直接相关。草稿在 Rev0.83 里专门为 x16 upper byte 增加了 MR3 字段做固件的不看这一条会漏掉半通道训练。2.2 电源轨压摆率与输入时钟电压敏感性Supply Rail Voltage Slew RatesBallot#1845.35在 DDR5 里被单独拎出来 ballot。电压轨从 DDR4 的 1.2V 降到 VDD/VDDQ 1.1VVPP 仍是 1.8V压摆率不足带来的不再是“慢一点”的问题而是 DLL 锁定时钟参考点漂移。草稿对 Reset and Init 章节引入 stable power 的概念也就是在 Reset_n 释放前各电源轨不仅要到达终值压摆率也要落在限值内。上电时序里先 VDD、再 VDDQ、后 VPP 的常见顺序到 DDR5 建议用 spec 里的 slew rate 下限反推电源 ramp 时间而不是沿用 DDR4 经验。Ch8 的 Input Clock Voltage Sensitivity 在草稿中被更新输入时钟 MCK_t/MCK_c 的电压敏感度直接关系到 PLL 抖动容限。4800 MT/s 下 UI 只有 208ps时钟上多 3ps 的抖动就会吃掉约 1.5% 的时序预算。DDR5 的输入时钟已经不能按数字信号处理要按模拟信号对待PCB 上时钟走线的参考平面切换点必须做阻抗连续。电源轨典型电压需要关注的参数VDD1.1V压摆率、纹波、DLL 锁定窗口VDDQ1.1V压摆率、ODT 切换时的地弹VPP1.8V行激活相关压摆率慢会造成 tRP 不稳定注意具体 slew rate 数值在草稿里分布在 DC Operating Condition 和电源章节不同 speed bin 下限值不同不要直接抄 DDR4 的 10%/100us 规则。2.3 TX/RX 压力眼图与输入时钟抖动规范DDR5 把 SerDes 领域的压力眼图测试引入内存接口。草稿新加了 Ch8 RX Stressed Eye 和 Ch9 TX Stressed Eye并把 Input Clock Jitter 改成新格式文本只是大量数值还标灰 TBD。引入压力眼图的原因是传统 setup/hold 表格在 208ps 的 UI 下已经无法表达信号质量必须用眼图张开度和 BER 来定义收发端能力。我一般会写个小脚本从 PHY 的仿真波形里粗算眼图参数在 training 阶段快速判断通道是否值得继续调 DFE# eye_param.py —— 从接收端仿真波形粗算眼张开度 def eye_open(bits, samples_per_ui, v_high0.55, v_low-0.55): # bits: 均衡后波形采样点V长度要是 samples_per_ui 的整数倍 # samples_per_ui: 每 UI 采样数一般 16 或 32 tap {} for phase in range(samples_per_ui): col [bits[i phase] for i in range(0, len(bits) - samples_per_ui, samples_per_ui)] tap[phase] (sorted(col)[len(col) // 8], sorted(col)[7 * len(col) // 8]) eye_height min(hi - lo for hi, lo in tap.values()) eye_width 100.0 * sum( 1 for hi, lo in tap.values() if hi - lo 0.1 * (v_high - v_low) ) / samples_per_ui return eye_height, eye_width逻辑是把一个 UI 内的采样点按相位折叠取 12.5% 和 87.5% 分位作为眼图上下包络的近似再做张开度统计。v_high/v_low 是示意值实际按 VDDQ 和训练参考电平换算。参数 samples_per_ui 由仿真步长决定建议 16 以上低于 8 算出的眼宽误差会超过 5%。提示灰色 TBD 不代表设计方忽略时钟抖动恰恰说明在草稿阶段还没有收敛值。做板级仿真时以中间值加 20% 余量比等终稿更稳妥。2.4 封装电气规范与输入电容Q418 ballot 把 Input Capacitance Spec 和 Package Electrical Specification 一起整合进草稿。输入电容影响 ODT 补偿曲线封装寄生电感和电阻则影响 Burst 读写在 DQ 翻转时产生的地弹。x16 颗粒的封装走线比 x4/x8 短反而对 ODT 的 fine tune 更敏感。这个阶段的输出不是拿来直接用而是给 IBIS 模型校准时确认最小/最大 corner 用。仿真的输入电容如果直接拿最终版的典型值会把 ODT 训练范围算错。3. DDR5 命令协议与读写操作BL32 拆分与命令真值表3.1 BL32 ballot 被拆成四份改动面有多大BL32Burst Length 32在草稿里不是一次性合入的而是拆成 Burst Order、Read Operation、Write Operation、Command Intervals 四个子 ballot。这四份对应的规范章节全都要动说明 BL32 不只是把读数据长度从 16 字节翻倍而是牵扯到地址交错、数据掩码位置、命令间隔定义。BL32 在 x4/x8 上应用时数据总线被 32 字节占用 8 个 nCK到 x16 上因为数据位宽加倍突发长度对应的时间反而更短这造成同一个 BL32 模式在不同器件宽度上的时序表现不同。Command Truth Table 在多次修订中去掉了 CA0 的 decode note同时新增 explicit WRA 命令以配合 hPPR/sPPR。真值表在 DDR5 里已经不能只看 CA5 一位判断命令类型厂商自定义编码段在草稿中明确讨论了但没有合入。固件解析命令队列时要按 PC 阶段拆解不要把 DDR4 的“命令CSCA 映射”直接搬过来。3.2 MPC 命令与 DLL RESET 的执行路径草稿把 DLL RESET 从 MR 编程改成通过 MPC 命令执行并专门为 2-cycle MPC 增加了时序图。MPC 和 MRW 的区别在于MRW 是写寄存器MPC 是触发动作。DLL RESET 需要动到时钟分发路径用 MRW 写等效位会引入“值已写入但未真正复位”的歧义MPC 可以保证命令级别的事务语义也方便控制器在 tXS 结束后精确计数def mpc_dll_reset(phy, mr_index6): # 先写 MR 清残留状态再发 2-cycle MPC 触发 DLL RESET # mr_index 按草稿 MR 总表定义实际值以所对照版本为准 phy.mrw(mr_index, 0x00) phy.mpc(opcode0xA0) # 2-cycle MPC 前半段操作码为占位 phy.mpc(opcode0x00) # 后半段完成命令译码 phy.wait_timing(tDLLK) # 等待 DLL 重新锁定的时间窗口前两行是清残留避免上一次 DLL 状态影响本次复位后的训练结果。mpc 的两个 opcode 是占位具体编码要到草稿 Ch4 的 MPC 章节对照不同版本可能不同。wait_timing 里的 tDLLK 是 DLL 锁定时间和 MR13 里的 tDLLK 配置是同一个概念这也是为什么初始化序列要把 MR13 放在 DLL RESET 之前。2-cycle MPC 在 Self Refresh 退出后的 tXS 窗口内如何计数草稿专门加图示说明1-cycle 和 2-cycle 命令在 tXS 结束后要分别开窗。3.3 读写命令间隔里的新增参数 tWTRAtWTR_L 的修订来自 Ballot#1830.44A但更值得关注的是新增参数 tWTRA它定义 Read to Write Command Interval 这条路径。tWTR 解决的是“写完多久能读”tWTR_L 是同 Bank Group 的写后读tWTRA 则用在 Write Pattern Command 之后切换到正常读操作的场景训练阶段和 post-package repair 阶段都会碰到。参数定义作用场景tCCD_L / tCCD_S同/异 Bank Group 的列选命令间隔BL32 模式要加大 paddingtWTR_L同 Bank Group 写后读延迟与 DQS 总线释放相关tWTRARead to Write Command Interval 新参数训练和 WRA 场景使用tRTW读后写间隔和 tWTR 方向相反这些参数在 Ch13 Timing Parameters by Speed Grade 的表里按 speed bin 给出草稿里 3600–4000 部分先合入了 write-to-write same bank group 的时序4800 以上只有占位。实际调试时建议先用 JEDEC 提供的 training 测例跑一遍 tWTR_L再用自定义读写混合模式扫 tWTRA两个参数别混用。Write to Write same bank group 的提案来自华为和 Qualcomm 的原始 ballot 有冲突最后放在 BL32 模式下的 Read to Write Command Interval 章节里协调。这给控制器设计带来的实际影响是调度器不再能简单用 tCCD 一个参数做写队列仲裁写后写、写后读、读后写分别是三条独立时间链。3.4 Refresh 演化从 TRR 到 RFM以及 hPPR/sPPR草稿在 Rev0.80 用 RFMRefresh Management替换了 TRRTarget Row RefreshMR41 的语义随之重构。TRR 的思路是提前刷新指定风险行RFM 则把决策上收到内存控制器的刷新管理状态机颗粒侧只接收“进入刷新管理窗口”的指令。这个改动影响 Command Truth Table、MR Overview List 和 Refresh 时序三处改动面比一次 ballot 大得多。hPPR/sPPRhard/soft Post Package Repair基于 Hynix 的提案需要新增 MR54–57 字段并且通过 explicit WRA 命令完成替换写入。做固件的人要注意WRA 是被 hPPR/sPPR 场景激活的正常读写队列里不要走到这个路径否则 auto-precharge 行为不可预期。3DS 堆叠部分还有单独的 Refresh 时序tRFC 更新和 Read/Write 命令间隔草稿把它合并进 Refresh Definitions 章节x16 3DS 和平面颗粒的 tRFC 差别在 4800 bin 上已经可见。4. DDR5 模式寄存器 MR0–MR255ODT 默认值与 VREF 重排4.1 MR 编号重排为什么 VREF CS 从 MR12 变成 MR13草稿最初给 VREF CS 模式分配了新 MR12结果是 VREF 类寄存器被打散。后来编辑上把 MR12 整体下移VREF CS 最终落到 MR13三个 VREF 寄存器连成一片MRW 编程时可以用连续地址写。这件事看起来是编号洁癖实际影响固件任何基于早期草稿写的 MR 地址表在 Rev0.80 之后全部失效。MR 编号功能草稿里经历的变更MR62000/2100 MT/s 速率相关后期由 Micron ballot 补入MR12原 VREF CS 位置下移后编号给其他用途MR13VREF CS / CA 参考电平与 VREF DQ 相邻排列MR41Refresh Management从 TRR 改为 RFM 语义MR42–44Duty Cycle Adjuster集成自独立 ballotMR54–57hPPR/sPPR 配置新增配套 explicit WRAMR2/MR3 也在几个版本之间反复调整初版把写电平内部周期对齐字节分散在两个寄存器后来把单比特定义全部挪到 MR2字节级对齐控制统一放 MR3并增加 x16 upper byte 支持。x16 上两个 byte 的写电平结果要分别写进 MR3 的不同字段少写一个 byte 会导致半个通道训练失败。4.2 Duty Cycle Adjuster 与占空比失真补偿DCADuty Cycle Adjuster在 Rev0.75 集成MR42、MR43、MR44 三组字段分别承担 DQ 与 DQS 路径上的占空比调节具体字段映射以 MR 定义表为准。占空比失真在 4800 MT/s 下会导致眼图上下不对称训练时先由 PHY 测量占空比误差再通过 MRW 写入调整值。调整流程通常是先 DQS 后 DQ每步 1 个 LSB写一次读一次 MRR 确认生效再继续def dca_tune(addr, target50.0): duty read_duty(addr) # 当前 DQS 占空比单位 % step 1 if duty target else -1 for _ in range(32): duty read_duty(addr) if abs(duty - target) 0.5: break write_mr(addr, MR42, read_mr(addr, MR42) step)read_duty 是控制器的训练测量接口返回值来自 PHY 的 DFE 统计模块。MR42 在这里代表 DQS 通道的调整寄存器MR43/MR44 按草稿定义分属其余信号组。32 次循环上限是为了避免硬件异常时无限写 MR正常训练一般在 8 次内收敛。草稿还加入了 DFE MRW 的更新时序以及 DFE 模式寄存器映射的可视化表示。DFE 抽头系数走 MRW 写入后需要等待生效时间这个时间和 DCA 的生效时间不一样不能共用同一个等待宏。4.3 PDA 枚举模式与 MPSM 的状态变化PDA Enumerate Mode 在草稿里有一处细节修改DQ 值从“valid low 期间最后 4 个 strobe edge 捕获”改为“valid low 期间任意 strobe edge 捕获”。前者对 strobe 时序容错更严后者放宽了对 DQS 边缘位置的约束。做 PDA 枚举的控制器固件要关注 DQS preamble 的设置草稿在 Rev0.76 里专门加了和 diagram 匹配的说明。MPSMMulti-Purpose System Management设备在 MR3:OP3 里补齐了 Device 15 的定义MPC 命令表里同步增加了 VrefCS 的 Apply 命令。MPSM 的调用路径一般是系统管理中断触发的而不是正常训练路径固件里要单独维护一套超时保护避免 MPSM 卡在状态机里把 MC 的刷新窗口占掉。4.4 温度传感器、Transparency Mode 与 OnDie ECC温度传感器 ballot 最初没进草稿等到 Q318 才合入MR4 随更新改了一版。DDR5 的温度传感器不只是报温度还参与 Refresh 率的自适应调节。Transparency Mode 则涉及 MR14–22 的一整段它让部分 MR 的配置可以直接映射到测试模式DFx 工程师可以用它绕过正常流程直接注入故障。OnDie ECC 的语义在草稿中从 WILL 改为 SHALL这是规范语言的强制化DRAM 内部的 ECC 不再是有则更好而是必须实现。对控制器来说OnDie ECC 不增加总线负载但行锤击/RFM 的统计模型必须把它考虑进去否则 ECC 修正和 RFM 刷新会互相掩盖。5. DDR5 上电初始化与训练序列Write Leveling 与 DFE5.1 初始化序列第 7 步为什么 MR13 要放在 DLL RESET 之前Hynix 在 2019 年 1 月的 init sequence rev03 里新增了简单的一步在 DLL RESET 之前先编程 MR13tCCD/tDLLK。DLL RESET 是一次硬复位复位后 DRAM 需要 tDLLK 时间完成锁定而 tDLLK 窗口本身由 MR13 里的字段定义。不先写 MR13控制器无法在复位前知道该等多久。步骤动作关键检查点1VDD/VDDQ/VPP 上电并满足压摆率各 rail 达到终值2CKE 拉低、Reset_n 拉低驱动初始状态3等待电源稳定stable power 窗口4释放 Reset_nCKE 保持低等待时钟稳定5写入基础 MRMR0、MR1 等速率与驱动配置6写 MR13tCCD/tDLLK在 DLL RESET 前完成7MPC 触发 DLL RESET开始锁定8等待 tDLLK锁定结束再进训练9Write Leveling / Read Training按 speed bin 执行第 6 步是 rev03 新增的关键路径。频率切换Frequency Change也涉及类似 tXS 的窗口草稿里用注记说明 2-cycle 命令在 tXS 结束后如何计数。固件实现里最好把 DLL RESET 和 Frequency Change 分成两个独立函数不要共用一个“等待任何时序”的宏因为 tDLLK 与 tXS 的起点和终点定义不一样。5.2 Write Leveling从名字统一到 RTT_PARK 默认值WL 缩写在草稿里被全局改成 Write Leveling理由是容易和 Write Latency 混淆。同一个改动里MR2/MR3 的字节级控制合并完成x16 的 upper byte 支持落地。写电平的原理是扫 DQS 相位直到与 CK 对齐控制器通过读回 MR1 的采样标记判断是否对齐def write_leveling(addr, byte0): for tap in range(64): write_mr(addr, MR2, tap) # 写入 DQS 相位 tap if mrr(addr, MR1) (1 (byte * 8)): return tap # 找到对齐点 raise TimeoutError(leveling failed)byte 参数在 x16 上取 0 或 1x4/x8 固定 0。MR1 的采样位按 byte 展开所以判断条件里根据 byte 对结果做移位。如果 x16 只做 byte 0 的校准上字节会在高速读写时出现半个通道的相位偏斜。同一轮改动里 RTT_PARK 和 RTT_DQS_PARK 的默认值被改成 OFF。之前的草稿里某些 ODT 状态有默认 termination到了 Rev0.81 才统一改成无偏置。这意味着任何“不配置 ODT 也能工作”的假设都是危险的初始化代码必须显式写 MR 设置 RTT_PARK。非对称 RON 控制Ballot#1845.59也是这个区域的改动它允许 DQ/DQS 驱动在不同方向采用不同阻抗调 ODT 时要注意和 RON 配合否则读训练和写训练看到的信号对称性不一致。提示ODT 默认值从“有默认”改成 OFF是草稿后期才定下来的高风险变更。参考早期代码或博客时先确认作者用的草稿版本再看 RTT_PARK 有没有被显式配置。5.3 读训练模式与 DQS 间隔振荡器Read Training Mode 增加了连续输出选项这对 DFE 收敛很关键。原来训练模式下读数据是脉冲式返回DFE 抽头需要反复唤醒连续输出让训练引擎可以持续观察固定图案收敛速度更快。DQS Interval Oscillator 在校准 tDQSCK 时用到草稿修正了计算方法和相关 diagram。tDQSCK 在 x16 颗粒上比 x8 离散性更大训练必须逐个 rank 执行不能用一个 rank 的结果直接广播。写训练Write Pattern Command由 Micron 的 ballot 分两轮合入最终版本需要保留 DQ 标注的全局清理工作也就是 DQ15 和 DQU7 这类命名还没有统一。做验证的时候用 Write Pattern 的固定序列对比 DQ 引脚的物理映射能提前发现封装 ballout 和控制器字节通道的错位。5.4 VREF 步进时间与 DFE 的联合调优草稿里 VREFDQ 的步进时间被更新到 300ns 量级VREFCA 的步进时间讨论过 300ps 级别的同步调整两个数量级不同配置时要区分 MR 字段的单位。VREF 扫完粗调后再动 DFE 抽头顺序反了会陷入局部最优。常见做法是先固定 DFE 为默认值扫 VREF 找眼图最高点再固定 VREF 调 DFE 抽头最后再回扫一次 VREF 确认边界没有偏移def vref_dfe_tune(addr): vref vref_scan(addr, start90, end130) # 粗扫 VREF dfe dfe_scan(addr, taps[1, 2, 4]) # 固定 VREF 调 DFE vref vref_scan(addr, startvref - 4, endvref 4) # 精扫 return vref, dfe参数 start/end 是 VREF 的百分数配置范围不是电压绝对值。精扫窗口取粗扫结果 ±4 步避免重新陷入全局扫描。DFE 的 taps 参数表示抽头数量DDR5 草稿里的 DFE 属于接收端均衡和 TX 端的去加重是两套机制别混用。DFE MRW 的生效时序在草稿中有专门说明写完寄存器后不能立刻进入读训练至少要等一个 MRW-to-training 的间隔。6. 把 Revision History 当 diff 看定位 DDR5 草稿中的高风险设计6.1 颜色编码就是天然的 diff 标记草稿开头写明了颜色规则红色是上一轮 ballot 的更新蓝色下划线是最新更新灰色是参考占位。这就是一份带变更标记的源码。读 PDF 时不要只看正文先把每个表格的红色和蓝色单元格找出来那些数值是委员会改过至少一轮的。Input Clock Jitter 全是灰色 TBD说明设计方还没收敛Speed Bins 在 5200–8400 之间的占位表也是灰色性能和功耗估算都不可靠。6.2 用 ballot 编号做索引从 PDF 里提取文本后我一般直接按 ballot 编号 grep能把一个功能的改动历史完整拉出来pdftotext -layout JEDEC_DDR5_Draft_Rev0.84g.pdf draft.txt grep -n -E Ballot#(1845|1830|1848|1850) draft.txt | head -801845 开头是 DDR5 的主工作项读操作、写操作、BL32、封装 ballout 都挂在这个号段1830 开头经常是复用自 DDR4 时代的参数修订如 tWTR_L、tDQSCK这类参数通常比新功能更稳定1848 与频率和模式寄存器相关MR 总表的演进要看这组1850 是 3DS 堆叠的专用号段。用这个方式可以快速判断一个参数是“沿用 DDR4 修修补补”还是“DDR5 全新定义”后者在量产前的变动概率高得多。快速定位后在对应章节对比红色/蓝色标记基本能还原这个参数的完整演进路径。要注意grep 出来的匹配行如果只有编号没有内容还要回到上下文看段落因为规范里经常是在一整段的开头放 ballot 编号。6.3 追踪一个高风险参数ODT 默认值用上面的方法追踪 ODT 默认值能看到一条清晰的演进线Rev0.76 里还写着“ODT Defaults not made yet, need to walk through all states before changing”到 Rev0.81 已经改成 RTT_PARK 和 RTT_DQS_PARK 默认 OFF。中间只有两个版本但跨了 TG 讨论和两家颗粒厂的提案。凡是这种“先是 TODO、下个版本变成具体值”的参数都是控制器与颗粒之间最容易失配的地方。做初始化固件时对不同厂商颗粒至少要各准备一套独立的 ODT 配置不要用一套默认值走天下。另一个例子是 MR12 变 MR13同一个功能换了编号如果参考代码是 2018 年写的必须对照草稿确认当前 MR 表后再移植。6.4 三查法收尾把这份草稿当 diff 看归纳成三步查颜色优先读红蓝单元格查编号按 ballot 号段建立功能索引查历史同一个功能在 Revision History 里出现的次数代表它的稳定度。用这个方法把 Rev0.84g 和最终发布的 JESD79-5 再做一次对照重点看 ODT 默认值、tWTRA 和 DFE 相关 MR就能画出 DDR5 控制器从草稿到量产之间被改动最多的区域。我这么做过一轮至少提前规避过两个 ODT 拓扑配置问题其中一个正是 RTT_PARK 默认值变更引入的。本文还有配套的精品资源点击获取