调DDR参数的时候,很多人看到设备树里一堆时序参数就头大:tRCD、tRP、tRAS、tWR、tRFC、tWTR……每个都认识,但不知道具体是什么意思,也不知道怎么调。
这篇文章把LPDDR4X的主要时序参数讲清楚,每个参数的物理含义、典型值、调试方法,都梳理一遍。
一、先搞懂DDR的一个完整读写周期
在讲具体参数之前,先理解DDR的工作流程。DDR不是你想读就能读的,要走一套固定的流程:
发送命令 → 行激活 → 等待tRCD → 列读写 → 数据传输 → 预充电 → 等待tRP → 下一行激活
具体来说:
1. 行激活(Activate):告诉DDR要操作哪一行,这一行的数据从存储阵列读到行缓冲(Row Buffer)
2. 等待tRCD:行激活到列读写之间的延迟,等数据稳定
3. 列读写(Read/Write):告诉DDR要操作哪一列,开始读或写数据
4. 数据传输:Burst长度的数据传输,LPDDR4X默认是16beat(32字节)
5. 预充电(Precharge):关闭当前行,把行缓冲的数据写回存储阵列
6. 等待tRP:预充电到下一次行激活之间的延迟
7. 重复:操作下一行
理解了这个流程,时序参数就好懂了——每个参数都是流程中两个步骤之间的最小等待时间。
二、核心时序参数详解
1. tRCD(RAS to CAS Delay)——行激活到列读写的延迟
物理含义: 行激活命令发出后,要等多久才能发列读写命令。这段时间是用来让存储阵列的数据读到行缓冲并稳定下来的。
典型值: LPDDR4X-4266下,tRCD约为18ns(对应38个时钟周期)
怎么调:
tRCD设小了:数据还没稳定就读,会读错
tRCD设大了:浪费时钟周期,降低有效带宽
一般按数据手册的标称值设,不要自己往小调
如果Training时读取出错,可以适当增大tRCD试试
2. tRP(Row Precharge Time)——预充电时间
物理含义: 预充电命令发出后,要等多久才能发下一次行激活。这段时间是用来把行缓冲的数据写回存储阵列,并复位行缓冲的。
典型值: LPDDR4X-4266下,tRP约为18ns(38个时钟周期)
怎么调:
tRP设小了:预充电没完成就激活下一行,会出错
tRP设大了:跨行操作的延迟变大
和tRCD一样,按标称值设,不要往小调
tRP和tRCD经常设成相同的值,因为物理过程类似
3. tRAS(Row Active Time)——行激活最小时间
物理含义: 行激活命令发出后,至少要等多久才能发预充电命令。也就是说,一行打开后,至少要保持打开多长时间。
典型值: LPDDR4X-4266下,tRAS约为42ns(90个时钟周期)
怎么调:
tRAS设小了:行打开时间不够,数据还没读完就预充电,会出错
tRAS设大了:行占用时间太长,影响bank间交错效率
tRAS必须大于tRCD + 突发传输时间
一般tRAS = tRCD + tWR + 一些余量
4. tWR(Write Recovery Time)——写恢复时间
物理含义: 写操作的最后一个数据发出后,要等多久才能发预充电命令。这段时间是用来让写入的数据稳定并锁存到存储阵列的。
典型值: LPDDR4X-4266下,tWR约为18ns(38个时钟周期)
怎么调:
tWR设小了:数据还没写进去就预充电,数据丢失
tWR设大了:写操作后的预充电延迟变大
tWR和tRCD经常设成相同的值
5. tRFC(Refresh Cycle Time)——刷新周期时间
物理含义: 刷新命令发出后,要等多久才能发下一个命令。刷新是DDR内部的操作,把所有存储单元的数据重新写一遍,防止电容漏电导致数据丢失。
典型值: LPDDR4X-4266下,tRFC约为210ns(448个时钟周期)
特点:
tRFC比其他时序参数大很多,因为刷新是全bank操作,耗时较长
刷新期间,DDR不能响应读写命令,所以刷新会占用总线时间
温度越高,刷新频率越高(tREFI变短),刷新占用的总线时间比例越大
这就是为什么高温下有效带宽会下降——刷新开销变大了
6. tWTR(Write to Read Turnaround)——写读切换时间
物理含义: 写操作的最后一个数据发出后,要等多久才能发读命令。写读切换时,DDR内部要切换数据方向,需要一定的恢复时间。
典型值: LPDDR4X-4266下,tWTR约为10ns(21个时钟周期)
怎么调:
tWTR设小了:写读切换太快,读数据会出错
交替读写的场景(如视频编解码),tWTR对性能影响较大
一般按标称值设,不要往小调
7. tRTW(Read to Write Turnaround)——读写切换时间
物理含义: 读操作的最后一个数据发出后,要等多久才能发写命令。和tWTR相反,是读切换到写的延迟。
典型值: LPDDR4X-4266下,tRTW约为8ns(17个时钟周期)
三、时序参数速查表

注意:以上数值是典型值,具体数值要以你用的颗粒的数据手册为准。不同厂商、不同速率等级的颗粒,时序参数会有差异。
四、调试时序参数的正确姿势
很多人调DDR参数,一上来就改tRCD、tRP,结果越调越乱。正确的调试顺序是:
第一步:先确认硬件没问题
电源电压是否正确(VDDQ 0.6V±5%)
走线等长是否满足(±5mil以内)
阻抗是否正确(单端50Ω,差分100Ω)
去耦电容是否到位
硬件有问题,软件怎么调都没用。
第二步:用默认参数跑Training
先用数据手册的标称时序参数,跑DDR Training
看Training是否通过,读写是否稳定
如果Training都过不了,先查硬件,不要急着改参数
第三步:跑压力测试
Training通过后,跑内存压力测试(如memtester、stress-ng)
常温、高温、低温都要跑
跑几个小时不出错,说明参数基本没问题
第四步:优化性能(可选)
如果稳定性没问题,想优化性能,可以适当减小某些时序参数
每次只改一个参数,改完跑一遍压力测试
不要一次改好几个,出了问题不知道是哪个引起的
性能优化的空间通常不大(5-10%),不要为了这点性能牺牲稳定性
五、常见误区
误区1:时序参数越小,性能越好
错。时序参数是最小等待时间,设小了会出错,设大了只是浪费一点时钟周期。稳定性永远比那点性能重要。工业级产品,稳定运行比什么都重要。
误区2:所有颗粒的时序参数都一样
错。不同厂商、不同批次、不同速率等级的颗粒,时序参数都可能有差异。换颗粒的时候,要重新确认时序参数,不要直接沿用旧的。
误区3:设备树里的时序参数不用管,Bootloader会自动设
半对半错。很多SoC的Bootloader会读取DDR颗粒的SPD信息(如果有的话),自动设置时序参数。但LPDDR4X很多颗粒没有SPD,时序参数需要在设备树或Bootloader里手动配置。不要假设它会自动设对,要确认。
误区4:tRFC不用管,反正是刷新
错。tRFC设小了,刷新不完整,数据会丢失,而且是随机出错,很难排查。tRFC是所有时序参数里最不能往小调的,一定要按标称值设,甚至可以留一点余量。
六、总结
DDR时序参数看着多,其实核心就那几个:
tRCD、tRP、tRAS、tWR、tRFC。理解了DDR的工作流程,每个参数的物理含义就清楚了。
调试的原则是:先硬件后软件,先稳定后性能,每次只改一个参数。
我们做汉四ROCFOUR的LPDDR4X方案的时候,会提供经过验证的设备树时序参数和参考配置,客户拿来就能用,不用自己从头调。不同速率等级(3200/3733/4266)、不同容量(2/4/8GB)的配置都有,直接对应就行。
有时序参数调试相关的问题,欢迎评论区交流!


