tRP详解:行预充电时间

tRP详解:行预充电时间

行预充电时间,记作 tRP,是 DRAM 时序里一个容易让人轻视的参数。说白了,它就是在你关闭当前行之后,需要等多长时间才能激活下一行。

我年轻的时候觉得 tRP 不就是个等待时间嘛,设小点不就好了?结果有一次板子跑到高负载场景,时不时就报内存错误。查了半个月,最后发现是 tRP 压太紧,行没放干净就强行打开了新行。嗯,从那以后我学会了一件事——尊重预充电。

tRP 到底在做什么?

你想想看,DRAM 里面的存储单元是一个个小电容。读数据的时候,电容上的电荷被感知放大器拉出来;读完后,这一行的电容需要恢复到稳定状态。这个恢复过程就是预充电。

如果你刚关掉一行,马上又去打开另一行,但原来的行还没放完电,两个行的位线就会互相干扰。结果是:读取数据出错,或者写入数据不完整。

  • tRP 的计量单位:时钟周期或纳秒。DDR5 里通常是 12-15 ns 级别。
  • tRP 在谁身上体现:每次从 ACT 到下一次 ACT,中间必须夹一个 PRE 命令,等你把 tRP 等完。
  • 影响范围:整条 Rank 上的所有 Bank。一个 Bank 在预充电时,其他 Bank 照样能跑,别搞混了。

上图是一个标准的行操作时间线。你会发现,从 PRE 命令发出到 ACT 下一行,中间隔的就是 tRP。

关键记忆点:tRP 是“行放电 + 位线预平衡”的时间。放电不干净,下一个行的数据就没法判断。不要试图用眼睛估,要用仿真看波形。

tRP 与 tRAS 的关系

这里有个容易犯的错。tRAS 是行激活的最小保持时间,tRP 是行关闭后的等待时间。两者是 顺序绑定 的。

一条命令流是这样的:

  1. ACT —— 打开行,开始 tRAS 计时。
  2. 读/写操作 —— 在行打开期间完成。
  3. PRE —— 关闭行,tRAS 必须已经满足。
  4. 等待 tRP —— 预充电完毕,才能再次 ACT 同一 Bank 的其他行。

也就是说,tRAS + tRP 是两个行之间最短的间隔。如果你用 tRC = tRAS + tRP 来算,没错,这个公式是对的。但我见过很多工程师只调 tRAS 忘了 tRP,结果 tRC 并没有缩短多少。

我的习惯:调时序时,先看 tRC 这个总值,再拆成 tRAS 和 tRP。如果最终目标是把周期压下来,你往往需要在 tRAS 和 tRP 之间做权衡。

预充电的类型

在实际系统中,预充电分为两种:

类型 触发方式 典型场景 对 tRP 的影响
显式预充电 MC 主动发 PRE 命令 读后立即关闭行,准备下一行 完全受 tRP 控制
自动预充电 读/写命令携带 AP,完成后自动关闭 顺序访问、Cache Line 读取 内部处理后仍然需要 tRP 窗口

你可能要问:自动预充电是不是可以省掉 tRP?不能。自动预充电只是帮你省了一个显式的 PRE 命令,DRAM 内部该放电的时间一点都不会少。

我在项目中遇到过一例:用自动预充电跑大块数据拷贝,性能很好。但换到随机小包访问,自动预充电反而浪费了时间,因为每次访问后都要等完 tRP 才能动其他行。嗯,这里要注意——不要迷信自动预充电,要看你的访问模式。

tRP 对性能的影响

我们把 tRP 对吞吐量的影响量化一下。假设你有一拼连续的读请求,每笔读需要:

  • 打开行:tRCD = 15 ns
  • 读数据:tCL = 14 ns
  • 关闭行:tRP = 15 ns

如果这些读请求涉及的是不同的行,那你每笔读的周期就是 tRCD + CL + tRP = 44 ns。如果 tRP 能优化到 10 ns,周期就变成 39 ns,吞吐量提升 12.8%。

但注意:如果所有请求都命中同一行,tRP 就不出现,完全不影响。所以我经常说,tRP 的优化价值取决于你的行切换频率。

我曾经踩过的坑:在 DDR4 的 Read-to-Read 场景里,我以为同一 Bank 内不同行切换时 tRP 是唯一约束,结果忘了 tRRD_S(不同行激活的间隔)。实际波形里,tRP 已经等完了,但 tRRD 还没到,白白浪费了 2-3 个周期。别只看 tRP,把整个行激活约束链都检查一遍。

如何优化 tRP

优化不是硬压参数。我的建议顺序如下:

  1. 确认当前的 tRP 值:查 SPD 或者跑 MemTest 找芯片的极限。DDR5 的 base tRP 通常写在 DF 里。
  2. 模拟高频场景:用 DRAM 仿真模型跑一遍温度-电压角点,看看预充电时位线的恢复时间。如果恢复不到位,tRP 再小也没用。
  3. 微调步长:每次减 1-2 ns,跑压力测试(Random R/W、Hammer test),看有没有出现读数据错、写数据被覆盖等异常。
  4. 结合 tRAS 一起调整:如果你把 tRAS 压得很低,tRP 可能就必须放宽,因为总的放电时间 tRAS + tRP 不能低于 tRC_min。
  5. 验证所有温度:低温和高低温对预充电的影响不一样。低温下漏电慢,tRP 可以压一压;高温下漏电快,反而 tRP 要放宽一些(别搞反了)。

这里放一张预充电过程的流程示意,帮你串一下整个逻辑:

tRP 在行操作中的位置与关键节点 DRAM 行操作流程与 tRP 位置 ACT 激活行 tRCD 列访问等待 tCL 数据操作 PRE 关闭行 tRP 预充电时间 ACT 下一行 说明: • tRP 位于 PRE 之后,ACT 下一行之前,不可跳过。 • 相同 Bank 下,tRP 结束后才能再次 ACT;不同 Bank 可以并行操作。 • tRAS + tRP = tRC 为最小行周期,优化时留意此边界。

最后提醒一句:tRP 的调整空间因芯片而异。DDR5 的 tRPpb、tRPab 等细化参数更复杂。不管细则如何变化,预充电的本质不会变——放电要彻底,否则后患无穷。

我自己在调优时,会先用仿真跑一次最差温度、最差电压的预充电波形,看位线差分信号什么时候完全归零,再反推出 tRP 的最佳候选值。这样比硬猜参数靠谱多了。