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 是行关闭后的等待时间。两者是 顺序绑定 的。
一条命令流是这样的:
ACT—— 打开行,开始 tRAS 计时。- 读/写操作 —— 在行打开期间完成。
PRE—— 关闭行,tRAS 必须已经满足。- 等待 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
优化不是硬压参数。我的建议顺序如下:
- 确认当前的 tRP 值:查 SPD 或者跑 MemTest 找芯片的极限。DDR5 的 base tRP 通常写在 DF 里。
- 模拟高频场景:用 DRAM 仿真模型跑一遍温度-电压角点,看看预充电时位线的恢复时间。如果恢复不到位,tRP 再小也没用。
- 微调步长:每次减 1-2 ns,跑压力测试(Random R/W、Hammer test),看有没有出现读数据错、写数据被覆盖等异常。
- 结合 tRAS 一起调整:如果你把 tRAS 压得很低,tRP 可能就必须放宽,因为总的放电时间
tRAS + tRP不能低于tRC_min。 - 验证所有温度:低温和高低温对预充电的影响不一样。低温下漏电慢,tRP 可以压一压;高温下漏电快,反而 tRP 要放宽一些(别搞反了)。
这里放一张预充电过程的流程示意,帮你串一下整个逻辑:
最后提醒一句:tRP 的调整空间因芯片而异。DDR5 的 tRPpb、tRPab 等细化参数更复杂。不管细则如何变化,预充电的本质不会变——放电要彻底,否则后患无穷。
我自己在调优时,会先用仿真跑一次最差温度、最差电压的预充电波形,看位线差分信号什么时候完全归零,再反推出 tRP 的最佳候选值。这样比硬猜参数靠谱多了。