在上一篇内容中,我们系统拆解了DRAM内存访问协议的五大基础命令、核心时序参数与完整读写周期。本文将深入解析DRAM命令交互的核心规则与时序约束,这是内存控制器实现高效命令调度、最大化内存带宽利用率、最小化访问延迟的核心底层逻辑。
本文介绍的通用命令交互规则,基于DRAM的资源占用模型,可广泛适用于SDRAM、DDR/DDR2/DDR3 SDRAM等主流内存系统,同时覆盖开页/闭页管理策略、Bank冲突、读写切换、跨Rank访问等全场景的最小调度间隔计算,是深入理解DDR内存协议的核心内容。
一、DRAM命令交互的核心基础
1.1 资源占用模型
整个DRAM命令交互体系,都建立在资源占用模型之上。该模型的核心逻辑是:只要两个DRAM命令不会在同一时间抢占共享硬件资源,就可以在设备内实现完全流水线化的连续调度。
DRAM的共享资源分为两类:
-片上共享资源:Bank内的灵敏放大器、全Bank共享的I/O门控多路复用器、读写驱动电路等
-片外共享资源:内存控制器与DRAM之间的命令总线、地址总线、数据总线
即便共享资源处于可用状态,DRAM设备的峰值电流与功耗限制,也会通过tRRD、tFAW等时序参数,进一步约束命令的下发速率,避免设备功耗与温度超标。
1.2 行缓冲区管理策略
DRAM命令的交互逻辑与调度复杂度,直接由内存系统的行缓冲区管理策略决定,主流分为两类:
1.开页内存系统:某一行被激活后,灵敏放大器会持续保持该行数据有效,直到同一Bank的跨行访问触发预充电操作。该策略依赖内存访问的空间局部性,同一行的多次访问无需重复执行行激活-预充电流程,能大幅降低访问延迟与功耗,但命令调度需要跟踪每个Bank的行状态,复杂度更高。
2.闭页内存系统:每次读写访问完成后,立即执行预充电操作复位Bank,快速准备好下一次跨行访问。该策略适合空间局部性差、随机跨行的内存访问场景,控制器设计更简单,但随机访问会产生完整的行周期开销。
二、同Rank连续读写命令的流水线调度
对于同一Rank内已激活的开页,连续的列读/列写命令可实现无冲突流水线调度,是内存带宽最大化的理想场景。
2.1 同Rank连续读命令
同一Rank内,无论目标是同一Bank的同一开页,还是不同Bank的已开页,连续列读命令都可实现流水线调度。

Figure 11.12 – Consecutive column-read commands to the same bank, rank, and channel(同一Bank、Rank、通道的连续列读命令)
该场景的核心时序规则:
-
连续列读命令的最佳调度间隔为 MAX(tBURST, tCCD),由数据突发时长和设备内部预取长度共同决定
-
对于SDRAM、DDR、DDR2 SDRAM,tBURST天然大于tCCD,因此调度间隔由tBURST决定
-
对于DDR3 SDRAM,预取长度提升至8个数据节拍,tCCD为4个周期,此时调度间隔需取两者的最大值
2.2 同Rank连续写命令
与连续读命令一致,同一Rank内不同开页的连续列写命令,最佳调度间隔同样为 MAX(tBURST, tCCD),可实现无冲突流水线执行。
三、读写命令与预充电命令的交互时序
预充电命令负责关闭当前激活的行,是闭页系统的核心操作,其与读写命令的时序约束,直接决定了跨行访问的最小间隔。
3.1 读到预充电时序
列读命令后紧跟预充电命令,需满足核心时序约束,保障读操作完成前,灵敏放大器不会被预充电复位。

Figure 11.13 – Read to precharge command timing(读至预充电命令时序)
核心时序公式:
-
基础最小间隔:tBURST + tRTP – tCCD
-
当设备内部突发长度tCCD与总线突发时长tBURST相等时,最小间隔简化为tRTP(读至预充电延迟)
-
通用计算公式:tRTP + (N-1)×tCCD,其中N为构建单次总线突发所需的内部突发数量
-
若使用带Posted CAS的列读命令,需额外叠加附加延迟tAL,公式变为:tAL + tBURST + tRTP – tCCD
3.2 写到预充电时序
列写命令后紧跟预充电命令,需保障写数据完整写入DRAM存储单元后,再执行预充电操作,核心约束为写恢复时间tWR。

Figure 11.24 – Write to precharge command timing(写至预充电命令时序)
核心时序规则:
-
列写命令到预充电命令的最小间隔,必须满足tCWD + tBURST + tWR
-
与写到读切换的tWTR不同,tWR要求数据完全写入存储单元,而tWTR仅要求I/O门控资源释放,因此tWR的时长通常显著大于tWTR
-
若使用带Posted CAS的列写命令,需额外叠加附加延迟tAL,公式变为:tAL + tCWD + tBURST + tWR
四、同Bank跨行访问的命令交互与Bank冲突
同一Bank内,对不同行的访问会触发Bank冲突,必须先执行预充电关闭当前行,再重新激活新行,产生完整的行周期开销,是DRAM随机访问延迟的核心来源。
4.1 同Bank跨行连续读命令
该场景分为最佳与最差两种极端情况,时序差异极大。
最佳场景
前提条件:前序行访问命令已满足tRAS最小要求,数据已完成回写到存储单元,可立即执行预充电。

Figure 11.14 – Consecutive column-read commands to different rows of the same bank: best-case scenario(同一Bank不同行的连续列读命令:最佳场景)
最小调度间隔公式:tBURST + tRTP – tCCD + tRP + tRCD
最差场景
前提条件:列读命令在tRCD满足后立即发出,此时tRAS尚未达标,预充电命令必须等待tRAS满足后才能下发。

Figure 11.15 – Consecutive column-read commands to different rows of same bank: worst-case scenario(同一Bank不同行的连续列读命令:最差场景)
最小调度间隔公式:tRAS + tRP + tRCD = tRC + tRCD,直接产生完整的行周期开销。
4.2 同Bank跨行连续写命令
同Bank跨行的连续写命令,除了行周期约束外,还需额外满足写恢复时间tWR的要求。

Figure 11.20 – Consecutive write commands, bank conflict, best cases(连续写命令,Bank冲突,最佳场景)
最佳场景最小调度间隔公式:tCWD + tBURST + tWR + tRP + tRCD
4.3 同Bank写后读跨行访问
写命令后对同一Bank的不同行发起读访问,需同时满足写恢复时间与行周期的双重约束。

Figure 11.26 – Read following write to different rows of the same bank(同一Bank不同行的写后读访问)
最佳场景最小调度间隔公式:tCWD + tBURST + tWR + tRP + tRCD
五、跨Bank访问的命令交互与冲突优化
不同Bank之间的硬件资源相互独立,理想情况下可并行执行操作,但如果目标Bank存在行冲突,仍会产生预充电-行激活的开销,可通过控制器的命令重排序大幅优化性能。
5.1 跨Bank读冲突:无命令重排序
前提条件:第二个读请求的目标Bank存在行冲突,且控制器不支持命令重排序,必须按顺序执行完第一个请求的所有命令,再执行第二个请求的命令。

Figure 11.16 – Consecutive DRAM read commands to different banks; bank conflict; no command reordering(不同Bank的连续DRAM读命令;Bank冲突;无命令重排序)
最小调度间隔:tRP + tRCD
5.2 跨Bank读冲突:支持命令重排序
若控制器支持命令重排序,可提前下发冲突Bank的预充电命令,与第一个读请求的列读操作并行执行,进一步压缩调度间隔。

Figure 11.17 – Consecutive DRAM read commands to different banks, bank conflict, with command reordering(不同Bank的连续DRAM读命令,Bank冲突,支持命令重排序)
最小调度间隔:tRP + tRCD – tCMD
5.3 跨Bank读后写冲突
读命令后,对不同Bank的冲突行发起写访问,无命令重排序的最佳场景下,最小调度间隔为tCMD + tRP + tRCD。

Figure 11.22 – Write command following read command to different banks: bank conflict, best case(不同Bank的读后写命令:Bank冲突,最佳场景)
5.4 跨Bank写后读冲突
写命令后,对不同Bank的冲突行发起读访问,无命令重排序的最佳场景下,最小调度间隔取两个值的最大值:MAX(tCMD + tRP + tRCD, tCWD + tBURST + tWR)。

Figure 11.27 – Read following write to different banks, bank conflict, best case(不同Bank的写后读访问,Bank冲突,最佳场景)
-
若行冲突的预充电-激活流程耗时更久,调度间隔由tRP + tRCD决定
-
若写操作的写恢复流程耗时更久,调度间隔由写操作的完整时长决定,避免共享I/O资源冲突
六、跨Rank访问的命令交互与时序开销
不同Rank共享数据总线,但拥有独立的Bank硬件资源,核心约束来自共享总线的切换开销,而非Bank内的资源冲突。
6.1 跨Rank连续读命令
跨Rank的连续读命令,核心开销来自数据总线的DQS数据选通信号重同步时间tRTRS,避免不同Rank的数据在总线上冲突。

Figure 11.18 – Consecutive column-read commands to different ranks(不同Rank的连续列读命令)
核心时序规则:
-
跨Rank连续读命令的最小调度间隔为tBURST + tRTRS
-
低频SDRAM、Direct RDRAM系统中,无需DQS重同步,tRTRS=0,可无缝流水线调度
-
DDR/DDR2 SDRAM系统中,tRTRS通常为1个完整时钟周期,会产生总线气泡
6.2 跨Rank连续写命令
与跨Rank读不同,写命令由内存控制器主导总线控制权,无需释放总线,理想情况下可无缝调度。但DDR2及后续设备的片上终端(ODT)切换,会引入额外的时序开销。

Figure 11.19 – Consecutive column-write commands to different ranks(不同Rank的连续列写命令)
核心时序规则:
-
SDRAM、DDR SDRAM系统中,无ODT切换开销,跨Rank连续写命令可按tBURST间隔调度
-
DDR2/DDR3 SDRAM系统中,ODT开关切换时间tOST会引入额外开销,最小调度间隔为tBURST + tOST
-
由于tRTRS通常大于等于tOST,工程中常统一用MAX(tRTRS, tOST)简化计算
6.3 跨Rank写后读命令
跨Rank的写后读访问,不存在同Rank的I/O门控资源冲突,仅需考虑总线同步与读写时序的相对偏移。

Figure 11.25 – Read following write to different ranks of DRAM devices(不同Rank DRAM设备的写后读访问)
最小调度间隔公式:tCWD + tBURST + tRTRS – tCAS
-
DDR2 SDRAM系统中,tCWD = tCAS – 1,若tRTRS=1,公式可简化为tBURST,实现无额外开销的无缝调度
-
DDR SDRAM系统中,tCWD=1、tRTRS=1,最小间隔为MAX(tCMD, tBURST – tCAS – 2)
七、读写切换的核心时序约束
读写命令的方向切换,是DRAM总线调度的核心难点,同Rank内的读写切换会引入显著的时序开销,是内存带宽利用率的关键瓶颈之一。
7.1 同Rank开页读后写切换
同Rank内,列读命令后紧跟列写命令,核心约束是避免读数据与写数据在总线上冲突,无需考虑内部I/O资源冲突。

Figure 11.21 – Write command following read command to open banks(开页下读后续写命令)
最小调度间隔公式:tCAS + tBURST + tRTRS – tCWD
-
SDRAM系统中,tCWD=0、tRTRS=0,最小间隔简化为tCAS + tBURST
-
DDR SDRAM系统中,tCWD=1、tRTRS=1,最小间隔同样简化为tCAS + tBURST,两种协议通过不同的参数抵消,最终结果一致
7.2 同Rank开页写后读切换
同Rank内,列写命令后紧跟列读命令,是开销更大的切换场景,核心约束是共享I/O门控资源的释放,必须等待写操作完成内部数据传输后,读命令才能使用I/O资源。

Figure 11.23 – Read following write to the same rank of DRAM devices(同Rank DRAM设备的写后读访问)
最小调度间隔公式:tCWD + tBURST + tWTR
-
该约束与目标Bank无关,只要是同Rank内的写后读切换,都必须满足tWTR(写至读延迟)要求
-
高端DRAM设备(如Direct RDRAM)通过内置写缓冲区,可大幅降低该开销,写数据进入缓冲区后即可释放I/O资源,无需等待写入存储单元
八、复合命令的交互时序规则
在11.1章节中我们介绍了列读写+自动预充电的复合命令,其核心交互时序与独立命令一致,但需满足设备内置的时序保护机制。
8.1 列读-预充电复合命令时序
复合命令将列读与预充电合并为单条命令,其内部的预充电动作,需同时满足读到预充电时序与tRAS最小要求。

Figure 11.28 – Row access to column-read-and-precharge command timing(行访问到列读-预充电复合命令的时序)
核心时序规则:
-
行访问命令到复合读命令的最小下发间隔为tRCD – tAL,Posted CAS模式下可提前下发
-
复合命令的内部预充电动作,默认在tAL + tBURST + tRTP – tCCD后执行
-
若此时tRAS尚未满足,DRAM设备会自动延迟预充电动作,直到tRAS达标,无需控制器干预,即tRAS锁定机制
8.2 列写-预充电复合命令时序
列写-预充电复合命令的时序约束更简单,由于tRAS的最小定义已覆盖单条列写命令的完整流程,无需额外的时序锁定。

Figure 11.29 – Row access to column-write-and-precharge command timing(行访问到列写-预充电复合命令的时序)
核心时序规则:
-
行访问命令满足tRCD要求后,即可下发列写-预充电复合命令
-
设备会自动在写操作完成、满足tWR要求后,执行内部预充电动作
-
DRAM设备通常为写周期受限设计,tRAS默认预留了单条写命令的时序余量,不会出现时序违规
九、DRAM命令最小时序约束汇总表
下表汇总了所有基础DRAM命令组合的最小调度间隔公式,覆盖行访问、列读、列写、预充电、刷新五大核心命令的全场景交互,是内存控制器设计、时序仿真的核心参考。
表11.4 DRAM命令最小时序约束方程汇总
|
前序命令(Prev) |
后续命令(Next) |
Rank |
Bank |
最小时序约束 |
对应图示 |
备注 |
|
A(行访问) |
A(行访问) |
S(同) |
S(同) |
tRC |
Figure 11.8 |
|
|
A(行访问) |
A(行访问) |
S(同) |
d(不同) |
tRRD |
Figure 11.32 |
同Rank第5次行激活需额外满足tFAW约束 |
|
P(预充电) |
A(行访问) |
S(同) |
d(不同) |
tRP |
Figure 11.6 |
|
|
F(刷新) |
A(行访问) |
S(同) |
S(同) |
tRFC |
Figure 11.7 |
|
|
A(行访问) |
R(列读) |
S(同) |
S(同) |
tRCD – tAL |
Figure 11.11 |
无Posted CAS命令时tAL=0 |
|
R(列读) |
R(列读) |
S(同) |
a(任意) |
MAX(tBURST, tCCD) |
Figure 11.12 |
tBURST为同Rank前序CAS命令的突发时长 |
|
R(列读) |
R(列读) |
d(不同) |
a(任意) |
tBURST + tRTRS |
Figure 11.18 |
tBURST为不同Rank前序CAS命令的突发时长 |
|
W(列写) |
R(列读) |
S(同) |
a(任意) |
tCWD + tBURST + tWTR |
Figure 11.23 |
tBURST为同Rank前序CASW命令的突发时长 |
|
W(列写) |
R(列读) |
d(不同) |
a(任意) |
tCWD + tBURST + tRTRS – tCAS |
Figure 11.25 |
tBURST为不同Rank前序CASW命令的突发时长 |
|
A(行访问) |
W(列写) |
S(同) |
S(同) |
tRCD – tAL |
Figure 11.11 |
无Posted CAS命令时tAL=0 |
|
R(列读) |
W(列写) |
a(任意) |
a(任意) |
tCAS + tBURST + tRTRS – tCWD |
Figure 11.21 |
tBURST为任意Rank前序CAS命令的突发时长 |
|
W(列写) |
W(列写) |
S(同) |
a(任意) |
MAX(tBURST, tCCD) |
Figure 11.19 |
tBURST为同Rank前序CASW命令的突发时长 |
|
W(列写) |
W(列写) |
d(不同) |
a(任意) |
tBURST + tOST |
Figure 11.21 |
tBURST为不同Rank前序CASW命令的突发时长 |
|
A(行访问) |
P(预充电) |
S(同) |
S(同) |
tRAS |
Figure 11.8 |
|
|
R(列读) |
P(预充电) |
S(同) |
S(同) |
tAL + tBURST + tRTP – tCCD |
Figure 11.13 |
tBURST为同Rank前序CAS命令的突发时长 |
|
W(列写) |
P(预充电) |
S(同) |
S(同) |
tAL + tCWD + tBURST + tWR |
Figure 11.24 |
tBURST为同Rank前序CASW命令的突发时长 |
|
F(刷新) |
F(刷新) |
S(同) |
a(任意) |
tRFC |
Figure 11.7 |
|
|
P(预充电) |
F(刷新) |
S(同) |
a(任意) |
tRP |
Figure 11.6 |
注:A=行访问;R=列读;W=列写;P=预充电;F=刷新;S=同;d=不同;a=任意



