DDR4 软件设计规范
编制日期 2026-09-24
面向 XT52L08G16ABEWGA(8Gb 512M × 16 DDR4-3200 SDRAM)的控制器驱动设计约定 —— 覆盖 上电初始化 15 步、模式寄存器 MR0–MR6、Bank Group 时序约束、 五类训练(WL / MPR / VrefDQ 2D / CA / 读前导)、CRC 与 CA 奇偶错误处理、 刷新与低功耗,逐条给出可落地的命令序列、时序门限与状态判据。
| 文档编号 | DDR4-SW-SPEC-001 |
|---|---|
| 版本 / 状态 | V1.0 · 正式发布 |
| 适用器件 | XTX XT52L08G16ABEWGA(DDR4-3200,22-22-22,8Gb ×16,96-ball TFBGA)及同系列 96-ball / 78-ball 器件 |
| 参考标准 | XT52L08G16ABEWGA Datasheet 版本号 Rev 1.5(Mar-22-2023)· JEDEC JESD79-4 |
| 配套文档 | DDR4_电路设计指南.html(硬件 / 原理图 / 布线 / 端接约束) |
0. 目的与范围
本规范约束 DDR4 器件在嵌入式 / SoC 内存控制器中的软件行为:上电与复位初始化、模式寄存器配置、训练流程、读 / 写 / 刷新命令时序、ZQ 校准、ODT 与端接、CRC / CA 奇偶错误处理、低功耗与复位恢复。凡本文与器件 datasheet 冲突,以 datasheet 为准。
- 统一初始化序列:RESET# 低 ≥200 µs → 释放后 500 µs → CKE 拉高 → tXPR → MRS(MR3→MR6→MR5→MR4→MR2→MR1→MR0)→ ZQCL → 等 tDLLK + tZQinit → 训练,固化一套标准流程。
- 统一寄存器配置:CL / CWL / WR / RTP / AL / CAL / PL / ODT / DBI / CRC / Parity / Gear-down 全部通过 MRS 写入;除 datasheet 明确定义的默认值外,MR0–MR6 必须全部显式初始化。
- 统一训练口径:逐 Byte Lane 独立训练;VrefDQ 与延时二维扫描;训练失败降频重试,禁止硬编码参数。
- 统一刷新与错误处理:以 tREFI 为节拍并按实测温度切换倍率;CRC / CA 奇偶错误有重试、计数告警与降频策略。
一句话结论:DDR4 是「命令驱动、Bank Group 架构、训练决定存亡」的器件 ——
所有读写都要先 ACT 打开行,再发 RD/WR;数据在 AL+CL / AL+CWL 个周期后有效;
没有 ZQCL 的阻抗、没有 Write Leveling 的 DQS-CK 对齐、没有 VrefDQ 训练的内部门限、没有按温度缩短的 tREFI、没有按 Bank Group 区分的 tCCD_S/L,都会让系统表现为偶发位错甚至完全无法训练。
文档使用说明
- 本文是《DDR4 电路设计指南》的软件配套篇:硬件篇解决「怎么接、怎么供电、怎么走线、VTT / VREFCA 怎么做」,本文解决「控制器怎么初始化、怎么训练、命令怎么发、时序怎么等、错误怎么处理」。
- 命令码、寄存器位、时序值均取自 XT52L08G16ABEWGA Datasheet Rev 1.0,与 JEDEC JESD79-4 一致。其它容量 / 位宽 / 速度档存在差异,移植前必须逐条核对(尤其 x16 只有
BG0,x4/x8 有BG0~BG1)。 - 文中 C 代码为协议骨架伪代码,演示流程与判断条件,非特定平台可直接编译的完整实现;
ddr_cmd()、now_ns()等为平台相关底层。
① MR 默认值仅 datasheet 列出的几项被保证(MR3 A3/A4、MR4 A1/A5/A13/A[8:6]、MR5 A[2:0]),其余上电必须完整写一遍 MR0–MR6,MRS 必须按 BG/BA 整寄存器重写; ② 任何 DLL Reset 后必须等 tDLLK 才能发读命令——tDLLK 未满足就读,tDQSCK / tAON 违例; ③ 训练参数禁止硬编码——DDR4 的 Vref × 延时是二维搜索空间,必须用扫描结果,不做扫描等于把批次差异、高低温、电压波动的风险全部留给现场; ④ 时序门限一律按 datasheet max 留余量——typ 值只用来排程,不能当失败判据;温度越高 tREFI 越短,必须动态切换。
1 · 器件定位与阵列组织
DDR4 不是「即插即用的 SRAM」。它有 2 个 Bank Group(x16)、每组 4 个 Bank、行 / 列分离的地址、2KB 页、8n 预取,且所有功能靠 MR0–MR6 配置。软件设计的第一件事,是把「地址空间」「Bank Group 约束」和「训练依赖」搞清楚。
1.1 器件定位与关键参数
数据取自 XT52L08G16ABEWGA Datasheet Rev 1.0 第 2 节 Features、第 3 节 Ordering Information 与 Speed Bin 表。
| 项目 | 参数 | 软件影响 |
|---|---|---|
| 组织 | 512M × 16 | x16 接口,DQ[15:0] 两个 Byte Lane(U/L 各一) |
| Bank Group | BG0(1 bit) | x16 只有 BG0;决定访问落在同组还是跨组 |
| Bank 地址 | BA0–BA1(2 bit) | 组内 4 个 Bank,可独立 ACT / PRE |
| 行地址 (Row) | A0–A15(16 bit) | ACT 送 16 bit 行地址(A16 仅更高密度用) |
| 列地址 (Col) | A0–A9(10 bit) | 1K 列;2KB 页 = 1024 × 16bit |
| 页尺寸 / 突发 | 2KB / BL8(8n 预取) | 一次突发搬 8×16bit = 16B;BC4 时为 8B |
| 速度档 | DDR4-3200(22-22-22) | tCK(AVG) = 0.625 ns;CL22 / CWL16 或 20 |
| 温度等级 | 商业 0~95℃ / 工业 −40~95℃ / 宽温 −40~105℃ | 决定 tREFI 倍率与 ASR / TCR 配置 |
| VPP | 2.5 V(+0.25 / −0.125 V) | 字线升压;掉电 / 休眠不可先于 VDD 撤掉 |
1.2 Bank Group 与地址映射
DDR4 相对 DDR3 最大的结构变化是引入 Bank Group。x16 器件有 2 个 Bank Group × 4 个 Bank = 8 个 Bank。它的价值是允许不同 Bank Group 之间的访问流水化,代价是新增了 Bank Group 相关的时序约束:
| 访问关系 | 适用约束 | DDR4-3200 取值 | 带宽含义 |
|---|---|---|---|
| 连续读/写落在不同 Bank Group | tCCD_S | 4 nCK(2.5 ns) | 流水化,带宽最高 |
| 连续读/写落在同一 Bank Group | tCCD_L | max(5 nCK, 5 ns) | IO 门控冲突,效率下降 |
| ACT→ACT 不同组(2KB 页) | tRRD_S | max(4 nCK, 5.3 ns) | 开行更快 |
| ACT→ACT 同组(2KB 页) | tRRD_L | max(4 nCK, 6.4 ns) | 同组开行受限 |
| 写→读 不同组 | tWTR_S | max(2 nCK, 2.5 ns) | 总线转向快 |
| 写→读 同组 | tWTR_L | max(4 nCK, 7.5 ns) | 同组转向慢一倍 |
① 地址交织:让连续物理地址在 Bank Group 之间轮转(常见做法是把 BG 位放在地址低位或次低位),使常态访问落在 tCCD_S 分支;
② 控制器必须感知 Bank Group:若控制器把 DDR4 当 DDR3 调度(只用 tCCD 单一值),会因违反 tCCD_L 而出错,或为保险一律取 _L 而白白丢掉带宽;
③ 数据布局:DMA 缓冲区、帧缓冲等多通道并发数据,尽量让不同通道落在不同 Bank Group,避免并发访问挤在同一组形成「隐性降速」。
1.3 引脚与信号分组
96-ball TFBGA(x16)的关键引脚分组如下,软件 / 控制器需按组管理:
| 分组 | 引脚 | 方向与功能 | 软件关注点 |
|---|---|---|---|
| 时钟 / 使能 | CK/CK#, CKE | 差分时钟 + 时钟使能 | CKE 同步进 Power-Down / 自刷新;CKE 退出自刷新为异步 |
| 命令 | CS#, ACT#, RAS#/A16, CAS#/A15, WE#/A14 | 命令译码(ACT/RD/WR/PRE/REF/MRS/ZQ 由这些位编码) | ACT#=0 时 A16/A15/A14 为地址;ACT#=1 时为命令位 |
| 地址 | BG0, BA0–BA1, A0–A15, A10/AP, A12/BC | Bank Group / Bank / 行 / 列复用;MRS 时送 op-code | A10=AP 自预充;A12=BC on-the-fly;MRS 用 BG/BA 选寄存器 |
| 数据 | DQ[15:0], DQSU/DQSU#, DQSL/DQSL# | 16 bit 双向 + 两个差分 DQS 选通 | 两个 Byte Lane 必须分别独立训练(见 §9) |
| 掩码 / 反转 | UDM/LDM, UDBI/LDBI(复用) | DM 与 DBI 由 MR5 复用选择 | DM 与 DBI 互斥;读 DBI / 写 DBI 分别使能 |
| 可靠性 | PAR, ALERT#, TEN | 命令地址奇偶输入 / 错误告警输出 / 连通性测试 | ALERT# 开漏,不使用时板上必须上拉到 VDD;TEN 常态下拉 |
| 参考 / 校准 | ZQ, VREFCA | ZQ 外接 240 Ω ±1% 到 VSSQ;VREFCA 跟踪 VDD/2 | VREFDQ 已内部化(由 MR6 训练),不再有外部 VREFDQ 引脚 |
| 电源 | VDD/VDDQ 1.2V, VPP 2.5V, VSS/VSSQ | 核心 / IO / 字线升压 | VPP 必须同时或早于 VDD 上电,且全程 ≥ VDD |
| 复位 | RESET# | 异步低有效复位 | 脉宽 ≥ tPW_RESET(1.0 µsmin);常态保持高 |
① 只有 BG0:x16 的 Bank Group 地址仅 1 bit,MRS 选寄存器时 BG1 位恒为 0(MR 编码表中 BG1 = 1 的组合为 RCW 保留); ② TDQS 必须禁用:MR1 A11 = 0,DM/DBI/TDQS 引脚由 MR5 A[12:10] 决定功能; ③ 两个 Byte Lane 独立训练:写均衡反馈由 DQ[7:0](DQSL)与 DQ[15:8](DQSU)分别给出,控制器需两套独立延时。
2 · 术语与缩写
DDR4 的术语比 DDR3 多出整整一组(训练、Bank Group、CRC / Parity、CAL / PL)。这里按「命令 / 寄存器」与「时序 / 训练」两组列出,后续章节直接引用。
2.1 命令与寄存器术语
| 术语 | 全称 / 含义 | 软件关注点 |
|---|---|---|
| ACT | Activate,打开某 Bank 的一行进入行缓冲 | 送 16 bit 行地址 + BG/BA;受 tRRD_S/L、tFAW 约束 |
| RD / RDS4 / RDS8 | 读命令(固定 BL8 / on-the-fly BC4 / BL8) | 送 10 bit 列地址;数据在 AL+CL 后出现 |
| WR / WRS4 / WRS8 | 写命令(同上,另有无 CRC / 带 CRC 变体) | 数据在 AL+CWL 后送出;结束需等 tWR 才能 PRE |
| RDA / WRA | 带自动预充的读 / 写(A10/AP = 1) | 省一条 PRE 命令;但会关闭行,连续访问同页时不要用 |
| PRE / PREA | 单 Bank 预充 / 全 Bank 预充 | A10=1 为 PREA;刷新前必须全部 Bank 空闲 |
| REF | Refresh(Auto Refresh) | 内部地址计数,外部地址 Don't Care;间隔按 tREFI |
| MRS | Mode Register Set | BG0+BA[1:0] 选 MR0–MR6;A 总线送 op-code |
| MPR | Multi-Purpose Register,多用途寄存器 | 读训练时读出固定图案;用 MR3 A2 进入 / 退出 |
| ZQCL / ZQCS | ZQ 长校准 / 短校准 | 初始化用 ZQCL(tZQinit);运行期周期 ZQCS(128 nCK) |
| PDA | Per DRAM Addressability,逐颗寻址 | MR3 A4 使能后可用 CS# + 地址选单颗做差异化配置 |
| PPR | Post Package Repair,封装后修复 | hPPR(MR4 A13)/ sPPR(MR4 A5),需按序执行并等待 |
| CRC | Cyclic Redundancy Check,写数据 CRC | MR2 A12 使能;仅写方向;出错拉低 ALERT# |
| CA Parity | Command/Address 偶校验 | MR5 A[2:0] 设延迟;出错拉低 ALERT# 并阻塞命令 |
| DBI | Data Bus Inversion,数据总线反转 | 读 DBI(MR5 A12)/ 写 DBI(MR5 A11);两侧必须一致 |
| FGR | Fine Granularity Refresh,细粒度刷新 | MR3 A[8:6],支持 1x / 2x / 4x 与 on-the-fly 切换 |
| ASR / TCR | Auto Self Refresh / Temperature Controlled Refresh | MR2 A[7:6] 选 ASR;MR4 A3/A2 选 TCR 与温度范围 |
2.2 时序与训练术语
| 术语 | 含义 | DDR4-3200 参考值 | 软件关注点 |
|---|---|---|---|
| CL | CAS Read Latency,读命令到首拍数据 | 22 nCK | MR0 A[12,6:4,2];读 DBI 使能时可用 CL 更大档 |
| CWL | CAS Write Latency,写命令到首拍数据 | 16 / 20 nCK | MR2 A[5:3];1tCK 写前导时 DDR4-3200 取 16 |
| AL | Additive Latency,附加延迟 | 0 / CL-1 / CL-2 | MR1 A[4:3];让 ACT 后列命令可提前发 |
| CAL | CS-to-Command/Address Latency | 3 / 4 / 5 / 6 / 8 nCK | MR4 A[8:6];CS# 到 C/A 的额外延迟,提升 C/A 裕量 |
| PL | C/A Parity Latency | 4 / 5 / 6 nCK | MR5 A[2:0];奇偶错误到 ALERT# 拉低的延迟 |
| tCCD_S / tCCD_L | 列到列延迟(跨组 / 同组) | 4 nCK / max(5nCK,5ns) | 调度器必须区分,否则违例或丢带宽 |
| tRRD_S / tRRD_L | ACT 到 ACT 延迟(跨组 / 同组) | max(4nCK,5.3ns) / max(4nCK,6.4ns) | 开行密集场景的隐性瓶颈 |
| tFAW | 四激活窗口 | max(28nCK, 30ns) | 任意滑动窗口内最多 4 个 ACT |
| tREFI / tRFC | 刷新平均间隔 / 刷新周期 | 7.8 µs / 350 ns | 温度越界必须缩短;tRFC 内只能发 DES |
| tDLLK | DLL 锁定时间 | 1024 nCK(0.64 µs@3200) | DLL Reset 后必须等,才能发读命令 |
| tZQinit / tZQCS | 首次 ZQCL / ZQCS 校准窗口 | 1024 nCK / 128 nCK | 校准窗口内通道必须静默(仅 DES) |
| tMOD / tMRD | MRS 后等待(MR0 / 其它 MR) | max(24nCK,15ns) / 8 nCK | MR0 之后等 tMOD,其余等 tMRD |
| tXPR / tXS / tXP | RESET 后 CKE 退出 / 自刷新退出 / 掉电退出 | max(tXS,5nCK) / tRFC+10ns / 5 nCK | 初始化与唤醒路径的时间门限 |
| tPW_RESET | RESET# 有效脉宽 | ≥ 1.0 µs | 短于此值 DRAM 可能不复位 |
| VrefDQ | 数据接收端内部参考电压 | Range1 60~92.5% / Range2 45~77.5% VDDQ | MR6 A7 训练使能、A6 选范围、A[5:0] 设值 |
| 2D Training | Vref × 延时二维扫描 | — | ≥2666 建议做;3200 强烈建议做 |
3 · 控制器架构与初始化
DDR4 的初始化比 DDR3 严格得多:必须先完成 7 次 MRS、ZQCL、tDLLK + tZQinit,才能进入训练;训练完成后才允许正常读写。任何一步跳过,都可能表现为「常温能跑、高低温死机」。
3.1 分层职责
set_delay()、set_vref() 等原语。训练层不能直接写 MR 命令(应调用协议层的 mrs()),否则 MRS 的 tMRD / tMOD 与 DES 插入会被绕过;协议层不能自己决定延时与 Vref(应由训练层给值),否则训练结果会被硬编码覆盖。这条边界是 DDR4 驱动最常见的架构缺陷来源。
3.2 上电初始化 15 步
以下流程取自 datasheet 第 12–13 页「Power-Up and Initialization Sequence」,步骤顺序不可调整:
- 上电与 RESET#:RESET# 与 TEN 保持低于
0.2 × VDD;RESET# 在电源稳定后保持 ≥ 200 µs,TEN 保持 ≥ 700 µs;CKE 在 RESET# 释放前拉低(至少提前 10 ns)。VDD 从 300 mV 上升到 VDD min 的时间 ≤ 200 ms,且全程VDD ≥ VDDQ、(VDD−VDDQ) < 0.3 V;VPP 必须同时或早于 VDD 上电,且全程 ≥ VDD。 - RESET# 释放(拉高),继续等待。
- 等待 500 µs:DRAM 内部状态初始化,与时钟无关。此期间启动 CK/CK# 并稳定 ≥ 10 ns 或 5 tCK(取大者);CKE 拉高前必须满足 tIS,并在时钟沿 Td 注册一个
DES命令。 - ODT 处理:RESET# 有效期间 DRAM 的 ODT 保持高阻;CKE 注册为高之前 ODT 可不确定;若要在 MR1 使能 RTT_NOM,ODT 输入必须静态保持低,直到 tDLLK 与 tZQinit 都满足。
- CKE 拉高,并持续保持高直至初始化序列全部完成(含 tDLLK 与 tZQinit 到期)。
- 等待 tXPR(
tXPR = max(tXS, 5 × tCK))后,才能发第一条 MRS。 - MRS → MR3(全部应用设置),等
tMRD。 - MRS → MR6(VrefDQ 初始值等),等
tMRD。 - MRS → MR5(DBI / DM / RTT_PARK / CA 奇偶),等
tMRD。 - MRS → MR4(前导 / CAL / 刷新模式 / PPR),等
tMRD。 - MRS → MR2(CWL / RTT_WR / LPASR / 写 CRC),等
tMRD。 - MRS → MR1(DLL 使能 / 驱动 / RTT_NOM / 写均衡),等
tMRD。 - MRS → MR0(BL / CL / WR+RTP / DLL Reset),等 tMOD(不是 tMRD)。
- ZQCL:启动 ZQ 校准。从 Td 到 Tk 之间,MRS 与 ZQCL 之间必须插入
DES。 - 等待 tDLLK 与 tZQinit 均满足,然后进入读 / 写训练(含 VrefDQ 训练与 Write Leveling)。
① MR0 之后是 tMOD 不是 tMRD——MR0 含 DLL Reset,等待时间更长; ② ZQCL 发完必须等 tZQinit,且通道静默——校准期间发任何非 DES 命令都会让阻抗校准失真; ③ MRS 之间必须插 DES——datasheet 明确要求 Td 到 Tk 之间 MRS 与 ZQCL 命令之间要有 DES,否则命令可能被误锁存。
3.3 复位与再初始化
电源稳定的情况下做复位(不断电)流程如下:
- 拉低 RESET# 至
0.2 × VDD以下,保持 ≥ tPW_RESET(≥ 1.0 µs,工程上建议取 ≥ 200 µs 与冷启动对齐);其它输入可不确定。 - CKE 在 RESET# 释放之前至少 10 ns 拉低。
- RESET# 释放后,执行上电流程的 步骤 2 ~ 10(等 500 µs → 时钟稳定 → CKE 拉高 → tXPR → 七次 MRS → ZQCL → 等 tDLLK/tZQinit)。
- 复位完成,DRAM 就绪,可进入读 / 写训练(复位后必须重新训练,不能用上次的训练值)。
复位后 DLL 与 ZQ 校准状态均丢失,必须重新执行 DLL Reset(MR0 A8)+ tDLLK 与 ZQCL + tZQinit;同时所有训练结果(写均衡、读写延时、VrefDQ)依赖的硬件状态也回到初值,必须重训。只发 MRS 不重训,是最典型的「热复位后死机」原因。
3.4 初始化伪代码
/* DDR4-3200 初始化骨架伪代码(XT52L08G16ABEWGA, x16, 2 Bank Group) */
int ddr4_init(const struct ddr4_cfg *cfg)
{
/* ---- 1. 上电与 RESET ---- */
gpio_reset_n(0); /* RESET# = 0, TEN = 0 */
pmic_vpp_enable(); /* VPP 2.5V 先于/同时于 VDD */
pmic_vdd_vddq_enable(); /* VDD/VDDQ 1.2V, 斜坡 <= 200ms */
delay_us(200); /* RESET# 低 >= 200us */
gpio_reset_n(1); /* 释放 RESET# */
delay_us(500); /* 内部状态初始化 */
/* ---- 2. 时钟与 CKE ---- */
phy_start_clock(cfg->tck_ns); /* CK/CK# 稳定 >= 10ns 或 5tCK */
ddr_cmd(DES); /* Td 沿注册 DES,满足 tIS */
cke_high(); /* CKE 拉高,此后持续保持高 */
delay_ns(max(tXS, 5 * tCK)); /* tXPR */
/* ---- 3. 七次 MRS(顺序固定) ---- */
mrs(MR3, mr3_val(cfg)); delay_nck(tMRD); /* MPR/CRC/FGR/Gear-down */
mrs(MR6, mr6_val(cfg)); delay_nck(tMRD); /* VrefDQ 初值 */
mrs(MR5, mr5_val(cfg)); delay_nck(tMRD); /* DBI/DM/RTT_PARK/CA PL */
mrs(MR4, mr4_val(cfg)); delay_nck(tMRD); /* 前导/CAL/TCR/PPR */
mrs(MR2, mr2_val(cfg)); delay_nck(tMRD); /* CWL/RTT_WR/LPASR/CRC */
mrs(MR1, mr1_val(cfg)); delay_nck(tMRD); /* DLL/驱动/RTT_NOM */
mrs(MR0, mr0_val(cfg)); delay_ns(tMOD); /* BL/CL/WR/DLL Reset */
ddr_cmd(DES); /* MRS 与 ZQCL 之间插 DES */
ddr_cmd(ZQCL); /* 启动 ZQ 长校准 */
delay_nck(1024); /* tZQinit */
delay_nck(1024); /* tDLLK */
/* ---- 4. 训练 ---- */
if (ddr4_train(cfg) != 0) { /* WL -> MPR -> VrefDQ 2D -> CA */
log_warn("train fail at %d Mbps, retry lower freq", cfg->rate);
return ddr4_init_low_freq(cfg); /* 降频重试,绝不强行继续 */
}
return 0;
}
把初始化拆成 power_up() / mrs_sequence() / zq_cal() / train() 四个可独立调用的函数,并在每步之间插入 超时与状态检查(如 CKE 是否仍为高、电源是否掉过)。这样出现「初始化卡死」时可以直接定位到具体阶段,而不是整段黑盒。
4 · 模式寄存器 MR0–MR6 体系
DDR4 有 7 张模式寄存器(MR0–MR6),比 DDR3 多 3 张。它们通过 MRS 命令的 BG0 + BA[1:0] 选择,op-code 由地址总线 A[17:0] 承载。除 datasheet 明确保证的默认值位外,其余位上电必须全部显式写入。
4.1 七张表总览与寻址
| 寄存器 | BG1 | BG0 | BA1 | BA0 | 主要内容 |
|---|---|---|---|---|---|
| MR0 | 0 | 0 | 0 | 0 | 突发长度、突发类型、CL、WR + RTP、DLL Reset |
| MR1 | 0 | 0 | 0 | 1 | DLL 使能、输出驱动阻抗、AL、写均衡使能、RTT_NOM |
| MR2 | 0 | 0 | 1 | 0 | CWL、LPASR、RTT_WR、写 CRC 使能 |
| MR3 | 0 | 0 | 1 | 1 | MPR、CRC/DM 写命令延迟、FGR、PDA、Gear-down |
| MR4 | 0 | 1 | 0 | 0 | 读/写前导、读前导训练、CAL、SRA、TCR、Vref 监控、PPR |
| MR5 | 0 | 1 | 0 | 1 | DM / DBI、RTT_PARK、ODT 掉电缓冲、CA 奇偶、CRC 清除 |
| MR6 | 0 | 1 | 1 | 0 | VrefDQ 训练(使能 / 范围 / 值)、tCCD_L 与 tDLLK |
| RCW | 0 | 1 | 1 | 1 | 寄存器控制字,DRAM 忽略该组合,不可使用 |
上表中 BG1 位在 x16 器件上不存在(引脚只有 BG0)。软件写 MRS 时 BG1 恒为 0;若把 BG1 当作有效位去编码,会错误命中 RCW(BG0,BA[1:0] = 111)而被 DRAM 忽略。
4.2 MR0 —— 突发 / CL / WR / DLL
| 位 | 字段 | 编码 | 本器件推荐 |
|---|---|---|---|
| A[1:0] | Burst Length | 00 = BL8(固定);01 = BC4 或 8(on-the-fly);10 = BC4(固定);11 = 保留 | 00(BL8 固定) |
| A[3] | Read Burst Type | 0 = Sequential;1 = Interleave | 0 |
| A[12, 6:4, 2] | CAS Latency (CL) | 见 CL 编码表;支持 10~22、24(读 DBI 时为 12~26、28) | CL = 22(3200) |
| A[13, 11:9] | WR 与 RTP | WR = 10/12/14/16/18/20/22/24/26;RTP = 5/6/7/8/9/10/11/12/13 | WR = 24 nCK(tWR = 15 ns @3200) |
| A[8] | DLL Reset | 0 = 正常;1 = 复位 DLL(自清零) | 初始化时写 1,之后写 0 |
| A[7] | TM(测试模式) | 0 = 正常;1 = 测试 | 0 |
| A[17], 其余 RFU | 保留 | MRS 时必须写 0 | 0 |
写 MR0 时,WR 的编程值必须 ≥ 按 datasheet 公式算出的 WRmin(向上取整到编码档位);RTP 与 WR 是同一组编码位,改一个等于改另一个,因此必须整体重写。此外,tDAL(写后自预充到 ACT 的延迟)由 WR 编程值 + tRP 共同决定,改 WR 会连带改变 tDAL。
4.3 MR1 —— DLL / 驱动 / RTT_NOM
| 位 | 字段 | 编码 | 本器件推荐 |
|---|---|---|---|
| A[0] | DLL Enable | 0 = 关闭(DLL-off 低频模式);1 = 使能 | 1(≥ 正常速率必须开) |
| A[2:1] | Output Driver Impedance | 00 = RZQ/7(34 Ω);01 = RZQ/5(48 Ω);其余保留 | 按仿真/实测定,常取 48 Ω |
| A[4:3] | Additive Latency (AL) | 00 = 0;01 = CL−1;10 = CL−2;11 = 保留 | 按控制器调度策略定 |
| A[7] | Write Leveling Enable | 0 = 关闭;1 = 使能(训练期间开,训练结束清零) | 训练期 1,训练后 0 |
| A[10:8] | RTT_NOM | 000 = 禁用;001 = RZQ/4(60 Ω);010 = RZQ/2(120 Ω);011 = RZQ/6(40 Ω);100 = RZQ/1(240 Ω);101 = RZQ/5(48 Ω);110 = RZQ/3(80 Ω);111 = RZQ/7(34 Ω) | 按拓扑定,常取 40~60 Ω |
| A[11] | TDQS Enable | x4 / x16 必须 = 0;仅 x8 可用 | 0 |
| A[12] | Qoff(输出缓冲) | 0 = 输出缓冲使能;1 = 输出缓冲关闭 | 0 |
| A[13], A[6:5] | Rx CTLE 控制 | 000 = 厂商优化默认;其余厂商定义(需与 XTX 确认) | 000 |
4.4 MR2 —— CWL / RTT_WR / LPASR / 写 CRC
| 位 | 字段 | 编码 | 本器件推荐 |
|---|---|---|---|
| A[2:0] | RFU | MRS 时必须写 0 | 000 |
| A[5:3] | CAS Write Latency (CWL) | 000 = 9;001 = 10;010 = 11;011 = 12;100 = 14;101 = 16;110 = 18;111 = 20 | CWL = 16(3200,1tCK 写前导) |
| A[7:6] | LPASR | 00 = 手动常温;01 = 手动缩减温区;10 = 手动扩展温区;11 = ASR 自动 | 宽温应用建议 11(ASR) |
| A[10:9] | RTT_WR(动态 ODT) | 00 = 关闭;01 = RZQ/2(120 Ω);10 = RZQ/1(240 Ω);11 = Hi-Z | 按拓扑定;点对点常关闭 |
| A[12] | Write CRC Enable | 0 = 关闭;1 = 使能(控制器侧必须一致) | 高可靠场景 1 |
| A[13], A[8], A[11] | RFU | MRS 时必须写 0 | 0 |
写前导为 1 tCK 时,DDR4-3200 对应 CWL = 16;写前导为 2 tCK 时,同一速率档可用 CWL = 20(MR4 A12 控制写前导)。改前导必须同步改 CWL,并重新做写训练;两侧(控制器与 DRAM)配置不一致会直接导致写数据错位。
4.5 MR3 —— MPR / CRC 写延迟 / FGR / PDA / Gear-down
| 位 | 字段 | 编码 | 本器件推荐 |
|---|---|---|---|
| A[1:0] | MPR Page Selection | 00 = Page0(训练图案);01 = Page1(C/A 奇偶错误日志);10 = Page2(MRS 回读);11 = Page3(厂商) | 训练用 00 |
| A[2] | MPR Operation | 0 = 正常;1 = 数据流到/从 MPR(读训练模式) | 训练期 1,结束回 0 |
| A[3] | Gear-down Mode | 0 = 1/2 Rate 关闭(默认);1 = 使能 | 低频可开,切换后重训 |
| A[4] | Per DRAM Addressability | 0 = 关闭(默认);1 = 使能 | 多 Rank 差异化配置时 1 |
| A[5] | Temperature Sensor Readout | 0 = 关闭;1 = 温度读出到 MPR | 按需 |
| A[8:6] | Fine Granularity Refresh | 000 = 1x(固定);001 = 2x;010 = 4x;011 = 保留;101 = on-the-fly 1x/2x;111 = on-the-fly 1x/4x | 高温场景 101 或 111 |
| A[10:9] | Write CMD Latency(CRC + DM 同时使能时) | 见编码表;用于补偿 CRC + DM 带来的额外延迟 | 使能 CRC+DM 时按表配 |
| A[12:11] | MPR Read Format | 00 = Serial;01 = Parallel;10 = Staggered;11 = 保留 | 00(串行,最常用) |
4.6 MR4 —— 前导 / CAL / 刷新 / PPR
| 位 | 字段 | 编码 | 本器件推荐 |
|---|---|---|---|
| A[0] | RFU | 写 0 | 0 |
| A[1] | Maximum Power Down Mode | 0 = 关闭(默认);1 = 使能(最大省电) | 低功耗场景 1 |
| A[2] | TCR Range | 0 = 常规;1 = 扩展 | 按器件温度等级 |
| A[3] | Temperature Controlled Refresh | 0 = 关闭;1 = 使能(温度控制刷新) | 宽温应用 1 |
| A[4] | Internal Vref Monitor | 0 = 关闭;1 = 使能(调试用,DQ 输出内部 Vref) | 0(量产关闭) |
| A[5] | sPPR(软修复) | 0 = 关闭(默认);1 = 使能 | 0(按需) |
| A[8:6] | CS to CMD/ADDR Latency (CAL) | 000 = 关闭;001 = 3;010 = 4;011 = 5;100 = 6;101 = 8;其余保留 | 按控制器要求(常 3~5) |
| A[9] | Self Refresh Abort | 0 = 关闭;1 = 使能(可打断自刷新快速退出) | 唤醒时延敏感场景 1 |
| A[10] | Read Preamble Training Mode | 0 = 关闭;1 = 使能(读前导训练) | 训练期 1,结束回 0 |
| A[11] | Read Preamble | 0 = 1 nCK;1 = 2 nCK | 高速常取 1(配前导训练) |
| A[12] | Write Preamble | 0 = 1 nCK;1 = 2 nCK | 与 CWL 配套 |
| A[13] | hPPR(硬修复) | 0 = 关闭(默认);1 = 使能 | 0(按需) |
4.7 MR5 —— DM / DBI / RTT_PARK / CA 奇偶
| 位 | 字段 | 编码 | 本器件推荐 |
|---|---|---|---|
| A[2:0] | C/A Parity Latency Mode | 000 = 关闭(默认);001 = 4 nCK;010 = 5 nCK;011 = 6 nCK(PL) | 使能奇偶时按速率选 |
| A[3] | CRC Error Clear | 0 = 清除;1 = 错误(回读为状态位) | 处理完写 0 清除 |
| A[4] | C/A Parity Error Status | 0 = 清除;1 = 错误(回读为状态位) | 告警后清零 |
| A[5] | ODT Input Buffer(Power-Down 期间) | 0 = ODT 输入缓冲工作;1 = 关闭(省电) | 低功耗场景 1 |
| A[8:6] | RTT_PARK | 同 RTT_NOM 编码(34/40/48/60/80/120/240 Ω、禁用) | 多 Rank 常取 40~60 Ω |
| A[9] | Data Mask (DM) | 0 = 关闭;1 = 使能 | 与 DBI 互斥 |
| A[10] | Write DBI | 0 = 关闭;1 = 使能 | 控制器侧必须一致 |
| A[11] | Read DBI | 0 = 关闭;1 = 使能 | 使能后 CL 档位另选 |
| A[12], A[13], A[17] | RFU | 写 0 | 0 |
① 互斥:MR5 A9(DM)与 A10/A11(DBI)不能同时为 1,否则引脚功能冲突;
② 成对:读 DBI 与写 DBI 要分别配置,且控制器侧必须完全一致——只有一侧使能,数据会被整体反转,表现为「数据全反」;
③ 读 DBI 会改变 CL 档位:使能读 DBI 后,Speed Bin 中的 CL 需按 CL with read DBI 列选取(3200 下由 22 变为 26)。
4.8 MR6 —— VrefDQ 训练与 tCCD_L / tDLLK
| 位 | 字段 | 编码 | 说明 |
|---|---|---|---|
| A[7] | VrefDQ Training Enable | 0 = 正常模式;1 = 训练模式 | 训练期 1,训练完成后必须回 0 并冻结值 |
| A[6] | VrefDQ Training Range | 0 = Range 1;1 = Range 2 | Range1 约 60%~92.5% VDDQ,Range2 约 45%~77.5% |
| A[5:0] | VrefDQ Training Value | 6 bit 步进 | 2D 扫描时逐步改变,最终取窗口中心 |
| A[12:10] | tCCD_L 与 tDLLK | 见编码表 | 与速率档绑定,按 datasheet 选取 |
| A[9:8], A[13], A[17] | RFU | 写 0 | — |
训练流程结束后,应把 MR6 A7 清 0 退出训练模式,并把最终 Vref 值写入 MR6 A[6:0]。若忘记退出,DRAM 一直处于训练模式,内部 Vref 可能随训练状态漂移,表现为「读写偶发错误、温度一变就更糟」。
4.9 写 MRS 的准则
- 整寄存器重写:MRS 按 BG/BA 选中整张表,op-code 覆盖全部位域;不允许「只改一个位」——未显式写入的位会变成你以为的默认值以外的内容。
- 顺序固定:初始化按
MR3 → MR6 → MR5 → MR4 → MR2 → MR1 → MR0,MR0 放最后(它触发 DLL Reset)。 - 间隔正确:MR3/6/5/4/2/1 之后等
tMRD(8 nCK);MR0 之后等 tMOD(max(24 nCK, 15 ns))。 - 命令间插 DES:从 Td 到 Tk,MRS 与 ZQCL 之间必须插入 DES,保证命令边界被正确锁存。
- RFU 位一律写 0:写入非 0 的 RFU 编码,DRAM 行为未定义。
- 运行中改 MR 的限制:自刷新退出后,在 tXS 满足前,只允许访问 MR0 的 CL 与 WR/RTP、MR2 的 CWL、MR3 的 Gear-down(且器件不处于 PDA 模式);其它 MR 必须等 tXS 满足。
- 改 CL / CWL / WR / Gear-down 后必须重训:这些字段改变了延迟链,旧训练值不再有效。
- 多 Rank / PDA 场景:PDA 模式下先用
CS# + 地址选中目标颗,再发 MRS;未被选中的颗粒接受DES。配置完成后退出 PDA(MR3 A4 = 0)。