2. DDR4/LPDDR4协议精要
Versal 的 DDR 控制器(DDRMC)在硬件层面把 DDR4/LPDDR4 的物理时序、命令调度和训练流程封装成可配置的接口,但工程上真正决定“能不能跑起来、跑得稳不稳”的,仍然是协议本身。理解协议不是为了背时序表,而是为了知道:控制器在什么时刻发出什么命令、这些命令落在哪个 Bank、刷新如何插入、模式寄存器如何约束颗粒行为,以及训练阶段控制器在“试探”什么。本节围绕这五条主线展开,并给出面向 Versal 接口设计的观察点。
命令时序:从“命令真值表”到“可用的时序窗口”
DDR4 的命令由 CS_n、ACT_n、RAS_n/CAS_n/WE_n 以及地址线组合编码。常用命令包括 ACT(激活行)、RD/WR(读写)、PRE(预充电)、REF(刷新)、MRS(模式寄存器写)、ZQCL/ZQCS(ZQ 校准)等。对 Versal 设计者而言,命令本身不需要手工拼,但必须理解命令之间的最小间隔:tRCD(ACT 到内部读写命令)、tRP(PRE 到下一次 ACT)、tRAS(ACT 到 PRE 最小激活时间)、tRRD_S/tRRD_L(不同 Bank 组内/组间激活间隔)、tFAW(四激活窗口)、tCCD_S/tCCD_L(列命令间隔)、tWTR、tRTP、tWR 等。这些参数共同决定控制器能在多短时间内把请求“塞”进颗粒。
一个直观的示例:若 DDR4-3200 颗粒的 tRCD=14ns、tRP=14ns、tRAS=32ns,则一次“打开行—读写—预充电”的最小闭环约为 tRCD + 突发时间 + tRP。控制器调度器会把这些约束转成周期数(按控制器时钟换算),并在命令总线上排队。Versal 的 DDRMC 会在初始化阶段读取颗粒的 SPD 或由用户配置的时序参数,把这些值写入控制器寄存器;如果参数填得比颗粒实际能力更紧,表现通常是训练通过但压力测试偶发失败,而不是直接无法启动。
Bank 结构与 Bank Group:并行度的来源
DDR4 把 Bank 划分为 Bank Group(BG),每个 BG 内多个 Bank。LPDDR4 则采用 channel + bank 的组织,通道间独立,bank 数量与容量相关。Bank 结构的核心意义是:不同 Bank 可以同时保持“已激活的行”,从而让控制器在多个 Bank 之间交错访问,掩盖 tRCD、tRP 等延迟。Bank Group 进一步约束了同组与跨组的时序差异(tCCD_L 与 tCCD_S、tRRD_L 与 tRRD_S)。
面向 Versal 接口设计,这意味着地址映射(address mapping)不是随便排的。控制器把系统地址映射到 rank、bank group、bank、row、column。若把连续访问集中到同一 Bank 的同一行,可以获得很高的行命中率;若映射不当,连续访问频繁跨 Bank 甚至跨 Rank,就会不断触发 ACT/PRE,吞吐下降。工程上常见的做法是:先按颗粒的 bank 数量与位宽确定映射粒度,再用 Versal 提供的地址映射选项(如 bank/row/column 交错方式)做对比测试,观察带宽与延迟变化。
刷新机制:不可回避的“时间税”
DRAM 电容会漏电,必须在 tREFI 内完成一次刷新。DDR4 的典型 tREFI=7.8μs,一次 REF 命令占用 tRFC(随容量增大而增大,常见数百纳秒)。LPDDR4 类似,但支持更细的刷新管理。刷新分为全 Bank 刷新(REF)和按 Bank 刷新(REFab/REFsb 等,视颗粒支持),后者允许控制器在空闲 Bank 上刷新,减少对正在访问 Bank 的打断。
刷新对 Versal 设计的影响体现在两点:一是有效带宽会被刷新“吃掉”一部分,容量越大、tRFC 越长,损失越明显;二是刷新与命令调度存在竞争,控制器需要在 tREFI 窗口内找到空隙插入 REF。若系统对延迟敏感,可以关注控制器是否支持 postponement(推迟刷新)以及温度补偿刷新(需颗粒支持)。在高温场景下,tREFI 会减半,带宽损失随之翻倍,这是很多“常温正常、高温异常”问题的根源之一。
模式寄存器:颗粒行为的“配置面”
MRS 命令写入模式寄存器 MR0~MR6(DDR4)或 MR0~MR若干(LPDDR4),决定突发长度、CAS 延迟、写恢复、ODT、输出驱动强度、刷新速率、ZQ 校准等。Versal 控制器在初始化时按配置依次写 MR,训练过程中也可能动态调整部分 MR(如 ODT、驱动强度)。
需要特别注意的是:模式寄存器不是“设一次就完事”。例如 ODT 阻值影响信号完整性,写均衡(write leveling)和读门控(read gate)训练会依赖 ODT 设置;若 ODT 与 PCB 阻抗不匹配,训练可能勉强通过但眼图余量很小。再如 CAS 延迟(CL)必须与控制器配置一致,否则读数据返回的采样点会整体偏移。工程上建议把关键 MR 值(CL、CWL、BL、ODT、驱动强度、刷新速率)与控制器配置逐项核对,作为 bring-up 检查表的一部分。
训练相关特性:控制器在“找什么”
DDR 接口在高速下必须做训练,因为 PCB 走线长度、颗粒内部延迟、电压温度都会造成位与位、字节与字节之间的偏斜。Versal DDRMC 的训练主要包括:写均衡(Write Leveling,对齐 DQS 与 CK)、读门控(Read Gate,确定读 DQS 前导位置)、读/写眼图训练(确定最佳采样点与驱动/ODT 设置)、以及地址/命令训练。训练的本质是控制器发送特定模式,颗粒回读或反馈,控制器扫描延迟抽头(taps)找到窗口中心。
训练结果通常以“窗口大小”和“中心位置”呈现。窗口越大,说明时序余量越足;若某位窗口明显偏小,往往指向该数据线的走线、过孔、端接或颗粒焊接问题。训练通过不等于系统稳定,建议在训练后运行压力测试(如 memtest 类模式)并观察误码。Versal 提供训练状态寄存器与眼图扫描工具,可用于定位是哪一位、哪个字节、哪个方向(读或写)余量不足。
把协议要素落到 Versal 配置上
综合来看,命令时序决定“能不能发”,Bank 结构决定“发得多快”,刷新决定“能持续多久”,模式寄存器决定“颗粒怎么配合”,训练决定“信号能不能被正确采样”。在 Versal 工程中,这五者分别对应 DDRMC 的时序参数页、地址映射页、刷新配置页、MRS 初始化序列和训练/眼图工具。建议 bring-up 时按以下顺序核对:先确认颗粒型号与容量,再核对 CL/CWL/BL/ODT 等 MR 值,然后检查 tRCD/tRP/tRAS/tRFC/tREFI 是否与颗粒手册一致,最后跑训练并查看窗口大小。若训练窗口偏小,优先检查 PCB 走线与端接,而不是先改时序参数——协议参数填错通常表现为“训练不过或压力测试失败”,而信号问题表现为“窗口小但能过”。