Understanding and Implementing DRAM Timings
November 11, 2018
DRAM devices have more than a dozen commands e.g $READ$, $WRITE$, $REFRESH$,
and more than two dozen timing constraints e.g. $t_{RC}$, $t_{RAS}$,
$t_{RCD}$, for their correct operation. The timing constraints control
intra-bank, inter-bank and inter-rank operation. Understanding these
constraints can be challenging. In addition, implementing these
constraints in a memory controller, in RTL or in a performance
simulator, can be error prone.
It is easy to understand and implement the timing constraints if they
are viewed as a matrix. The table below shows the intra-bank timing
constraints. The table can be easily extended to include additional
commands e.g. single bank refresh, power up, power down etc. Similar
tables can be constructed for inter-bank and inter-rank constraints. There
are a few power constraints e.g. $t_{TAW}$, $t_{FAW}$ which are not
captured by this table but are required for correct operation.
$\def\lc{\left\lceil}$
$\def\rc{\right\rceil}$
$\def\na{\times}$
$From\ (To\rightarrow)$ |
$PRE$ |
$ACT$ |
$RD$ |
$WR$ |
$REF$ |
$RD\_AP$ |
$WR\_AP$ |
$PRE$ |
|
$t_{RP}$ |
$\na$ |
$\na$ |
$t_{RP}$ |
$\na$ |
$\na$ |
$ACT$ |
$t_{RAS}$ |
$t_{RC}$ |
$t_{RCD}$ |
$t_{RCD}$ |
$t_{RC}$ |
$t_{RCD}$ |
$t_{RCD}$ |
$RD$ |
$t_{RTP}$ |
$\na$ |
$t_{CCD}$ |
$t_{RTW}$ |
$\na$ |
$t_{CCD}$ |
$t_{RTW}$ |
$WR$ |
$\small{WL+\frac{BL}{2}+WR}$ |
$\na$ |
$t_{WTR}$ |
$t_{CCD}$ |
$\na$ |
$t_{WTR}$ |
$t_{CCD}$ |
$REF$ |
|
$t_{RFC}$ |
$\na$ |
$\na$ |
$t_{RFC}$ |
$\na$ |
$\na$ |
$RD\_AP$ |
|
$t_{RTP} + t_{RP}$ |
$\na$ |
$\na$ |
$t_{RTP} + t_{RP}$ |
$\na$ |
$\na$ |
$WR\_AP$ |
|
$\small{WL + \frac{BL}{2} + WR + t_{RP}}$ |
$\na$ |
$\na$ |
$\small{WL + \frac{BL}{2} + WR + t_{RP}}$ |
$\na$ |
$\na$ |
Commands
- $PRE$
- Precharge.
- $ACT$
- Activate.
- $RD$
- Read.
- $WR$
- Write.
- $REF$
- All bank refresh.
- $RD\_AP$
- Read with auto precharge.
- $WR\_AP$
- Write with auto precharge.
Timing Constraints
- $RAS$
- Row Address Select/Strobe. A signal used to latch the row address.
- $CAS$
- Column Address Select/Strobe. A signal used to latch the column address.
- $AL$
- Additive Latency. It was introduced in DDR2 [3] and allows the memory controller to issue a read or write command, after an activate command, but before $t_{RCD}$ has elapsed. An external read/write command (from the memory controller) becomes an internal read/write command after a delay of $AL$. This is called posted CAS i.e. posted read or write operation. Note that $AL$ can be zero (disabled) i.e. the minimum time between an activate and read or write command is $t_{RCD}$.
- $CL$
- CAS (Read) Latency. It is the time between an internal read command and the availability of the first bit of output data.
- $RL$
- Read Latency. The overall read latency as seen by the memory controller is equal to $AL + CL$.
- $CWL$
- CAS Write Latency. It is the time between an internal write command and the availability of the first bit of input data.
- $WL$
- Write Latency. The overall write latency is equal to $AL + CWL$.
- $BL$
- Burst Length. The number of clock edges (rising and falling) taken for data transfer e.g. 4 for DDR2, 8 for DDR3 and DDR4, 2 for HBM.
- $t_{RP}$
- Row Precharge time i.e. time to precharge/close a row.
- $t_{RCD}$
- RAS to CAS Delay i.e. time to activate/open a row i.e. time delay between sending a row address (to activate/open a row) and sending the first column address (to read/write data).
- $t_{RAS}$
- Row Active time i.e. activate to precharge delay. This includes the time to activate/open a row ($t_{RCD}$) and internally restore/refresh the row back into the array.
- $t_{RC}$
- Row Cycle time i.e. activate to activate delay. The minimum time between an activate and a precharge is $t_{RAS}$ and the time to precharge/close a row is $t_{RP}$. Therefore, $t_{RC} = t_{RAS} + t_{RP}$.
- $t_{RTP}$
- Read to Precharge i.e. minimum time between a read and precharge command.
- $WR$
- Write Recovery time or write to precharge delay.
- $t_{CCD}$
- CAS to CAS Delay i.e. time between successive column addresses (to read/write data).
- $t_{RTW}$
- Read to Write delay.
- $t_{WTR}$
- Write to Read delay.
- $t_{RFC}$
- Refresh Cycle time i.e. time to refresh a row or a group of rows. Refresh leaves a row in precharged/closed state.
- $t_{FAW}$
- Four Activate Window.
- $t_{TAW}$
- Two Activate Window.
Implementing Timing Constraints
The psuedo code below shows how the numerous timing constraints can be
easily implemented in a performance simulator. This approach makes the
code readable and error free.
//Declare an enum of commands
enum CMD {
PRE,
ACT,
RD,
WR,
REF,
RD_AP,
WR_AP,
MAX
};
//Declare and populate a timing matrix
int constraint[CMD::MAX][CMD::MAX];
constraint[PRE][ACT] = tRP;
constraint[PRE][REF] = tRP;
...
//Track when a command can be legally issued in the future
int next[CMD::MAX];
//Let the current command be a read command
CMD current = CMD::RD;
//Apply all constraints
for (int i = 0; i < CMD::MAX; i++) {
next[i] += constraint[current][i];
}
References
- DRAM Timings a, b, c
- DRAM Operation
- Additive Latency