4. DDR4 时序参数详解:tRCD、tCL、tRP、tRAS

做 DDR4 设计,说白了就是跟一堆时序参数打交道。刚入行那会儿我总觉得这些数字是随便定的,后来吃过一次亏才明白——每一个参数背后都是物理延迟,差一个周期都可能让系统跑不起来。

咱们先看四个核心参数:tCL、tRCD、tRP、tRAS。它们决定了读/写一条指令要等多久,也是你做长度匹配时绕不开的约束目标。

4.1 tCL – CAS Latency(列选通延迟)

tCL 是从发出 READ 指令到数据首次出现在 DQ 引脚之间的时钟周期数。嗯,简单说就是“读了以后等多久能拿到数据”。

  • 单位:时钟周期(CK tCK)
  • 典型值:DDR4-2400 下常见 tCL=17,DDR4-3200 下 tCL=22 左右
  • 物理含义:从列地址选通到内部数据路径输出所需的延迟

我在一个 8 层板的项目里遇到过奇怪的现象——明明 READ 指令都对了,但数据总比预期晚两个周期。后来查时序报告才发现是 tCL 约束没写进去,综合器直接取了最乐观值。你想想看,要是没人告诉你 tCL 到底该设多少,板子调通才怪。

经验公式:tCL(以 ns 计)≈ 时钟周期 tCK × tCL(周期数)。比如 tCK=1.25ns (DDR4-3200),tCL=22,则 tCL≈27.5ns。这个值要跟颗粒 datasheet 严格对上。

4.2 tRCD – RAS to CAS Delay(行到列延迟)

tRCD 是从发出 ACT(行激活)指令到可以发出 READ/WRITE(列指令)必须等待的最短时间。说白了就是你打开一行以后,还不能立刻读写,得等列地址稳定下来。

  • 典型值:DDR4-2400 下 tRCD≈17,DDR4-3200 下 tRCD≈22
  • 为什么重要:长度匹配时要把 ADD/CMD 组的时钟和数据相对延时控制在 tRCD 范围内?不,其实 tRCD 决定了你能多快切换行,对系统带宽影响最大。

我习惯在 PD 设计阶段先看 tRCD 和 tCL 的组合。如果颗粒 datasheet 里 tRCD 比 tCL 大很多,那说明行激活是瓶颈,你得考虑更大的 Page Size 或者 Bank 交替来掩盖这个延迟。

4.3 tRP – Row Precharge Time(行预充电时间)

tRP 是发出 PRE(预充电)命令后,关闭当前行到下一个 ACT 能发出之前的最小等待。还记得刚才那个 ACT 把行打开吗?用完以后要发 PRE 关掉,然后才能开新的一行。

  • 典型值:通常与 tRCD 相近,DDR4-2400 下 tRP≈17
  • 避坑点:预充电操作会消耗 time,如果你连续读不同行,tRP 就是开销。所以 DDR4 加入了 Bank Group 和 Bank 交替机制,让你可以一边预充电一边读另一个 Bank。

我曾经在高速信号仿真里忽略 tRP 的时序余量,结果系统在 burst 结束后出现行冲突,数据全乱。后来加了一级 Pipeline 才解决。嗯,tRP 这个参数千万别只看最小值,实际走线长度偏差会吃掉一部分余量。

4.4 tRAS – Active to Precharge Time(行激活到预充电时间)

tRAS 是从 ACT 发出到允许发出 PRE 的最小时间间隔。你把一行打开后,哪怕读完了也不能立刻关,必须等 tRAS 过去。这个时间跟行内数据的稳定有关。

  • 典型值:DDR4-2400 下 tRAS≈34~39,DDR4-3200 下 tRAS≈44~48
  • 注意:tRAS = tRCD + tCL + tBurst 之类的近似关系?不对,tRAS 是独立的,但通常 datasheet 会要求 tRAS ≥ tRCD + tCL + tBurst / 2。

我记得有一次在做 Row Hammer 测试时,发现频繁的 ACT-PRE 序列违反了 tRAS 的最小值,导致内存控制器内部状态机死锁。所以说,tRAS 管得宽,不仅影响性能,还影响可靠性。

4.5 四个参数的相互关系

它们并不是孤立的。来看一张图,你就明白这些参数在一条读事务里串起来的样子。

DDR4 读事务时序链(tRCD / tCL / tRP / tRAS) ACT 命令 tRCD 等待 READ 命令 tCL 等待 数据输出 tRAS 维持期 PRE 命令 tRP 等待 新的 ACT 就绪 tRAS 必须覆盖 tRCD + tCL + Burst 从 ACT 到 PRE 的时间,否则 data 会丢失。 tRP 位于 PRE 之后,关掉一行才能开新行——这部分是刷新和 Bank 交替的代价。

你看图中,从 ACT 出发,先等 tRCD 才能发 READ,再等 tCL 才能收数据。tRAS 像个大括号,把 ACT 到 PRE 之间的距离锁死。关行之后还得等 tRP 才能激活下一行。这四个参数直接决定了单行访问的延迟和带宽。

4.6 参数对比速查

为了方便你做长度匹配和时序约束,我整理了一张表,把典型值和考量点列出来。

参数 全称 典型值 (DDR4-2400) 典型值 (DDR4-3200) 关键约束点
tCL CAS Latency 17 CK 22 CK DQ 输出时序,与 tCK 正比
tRCD RAS to CAS Delay 17 CK 22 CK 行激活后多久可以读写
tRP Row Precharge Time 17 CK 22 CK 预充电后多久激活新行
tRAS Active to Precharge 34~39 CK 44~48 CK 行必须保持激活的最短时间

个人的一个小习惯:拿到颗粒 datasheet 后,我会把 tRCD、tCL、tRP 三个值画在一组 bar chart 上看,如果某个值明显偏大,就说明那个环节是瓶颈。长度匹配时优先保证组合中最长的那个路径有足够余量。

4.7 计算示例:把周期数换算成实际时间

假设你在设计一个 DDR4-2666 的子系统。已知 tCK = 1.5ns(DDR4-2666 对应的时钟周期是 0.75ns?等等,这里要分清楚:DDR4 的 tCK 是 CK 时钟周期,DDR4-2666 的 tCK = 0.75ns?不对,DDR4-2666 的时钟频率 1333 MHz,tCK = 0.75ns。我习惯用 UI 来算,但为了方便直接取 tCK = 0.75ns)。

tCL = 18 CK → tCL(时间) = 18 × 0.75ns = 13.5 ns
tRCD = 18 CK → tRCD(时间) = 18 × 0.75ns = 13.5 ns
tRP = 18 CK → tRP(时间) = 18 × 0.75ns = 13.5 ns
tRAS = 38 CK → tRAS(时间) = 38 × 0.75ns = 28.5 ns

那么一个完整的读事务(单行,无 Bank 交替)总耗时 ≈ 
tRCD + tCL + Burst 长度(Burst 8 = 8 × tCK = 6ns) 
= 13.5 + 13.5 + 6 = 33 ns
加上 tRP (13.5ns) 后,再次激活新行需要等 46.5ns。

嗯,这个计算在系统级仿真里很有用。我做 SI/PI 仿真时经常把这几段延迟叠加上去,看时序余量够不够。

4.8 常见误区与避坑

我曾经在一次项目里把 tCL 和 tRCD 搞反了,以为先 CL 再 RCD,结果时序约束完全写反。仿真时数据窗口总是对不准,查了两天才发现是参数对应关系错了。所以,画时序图时一定要标清楚箭头方向。

  • 误区一:tRAS 只用于刷新,不是。tRAS 约束的是正常读/写操作中的行保持时间,影响系统延迟。
  • 误区二:长度匹配时可以忽略 tRCD 和 tCL 的差异,只做等长。不对,走线偏差会吃掉时序余量,尤其是高频下,即使差 10ps 也可能打破建立/保持窗口。
  • 误区三:tRP 和 tRCD 可以用同一个值。实际上不同颗粒可能有差异,必须查 datasheet 确认。

最后再说一点:这些时序参数不是孤立的,它们跟地址/命令时序、数据 DQ/DQS 的相位、Vref 都有关系。后面章节我们会讲到如何把这些参数换算成实际的走线长度约束。嗯,今天就先到这。