Pub手册4.4.4,DDR静态读训练 (Static Read Training) 是通过训练来确定读取命令和FIFO(First In, First Out)数据之间的延迟。
1. FIFO 和输入阶段
在DDR控制器的PHY(物理层)读取路径中,存在一个FIFO缓冲区。这个FIFO的作用是将DDR内存中的数据传输到控制时钟域,也就是将从DDR中读取的数据传输到控制器中进行后续处理。
2. 静态读取训练的目标
静态读训练的目的是确定从发出读取命令到FIFO中第一字(数据)准备好的时间延迟。换句话说,这项训练帮助控制器计算出读命令开始和数据准备好之间的时延,以便精确控制读操作的时序。
3. 静态读训练的并行性
静态读取训练在多个字节上并行执行,并且需要进行写入和读取内存的操作。静态读训练会使用可编程的地址来进行内存访问。具体来说,它使用的地址满足以下要求:
- DTAR寄存器: 静态读训练使用最多四个可编程寄存器(DTAR0 到 DTAR3)。这些寄存器定义了内存中的四个不同的起始地址(行、列、bank等),用于执行 BL8(Burst Length 8) 或 BL4(Burst Length 4) 的写入和读取操作。
- 内存访问的要求:
- 每个地址对应的列地址是一个 BL8 或 两个相邻的BL4 操作。
- 所有DTAR寄存器的行和bank地址必须相同。
- 列地址的最低3位([2:0])建议为
000
,以确保可以访问8个连续的突发地址。
4. 静态读训练中的写入操作
在进行静态读训练时,会通过写入全1和全0的数据来进行训练:
- 全1数据会写入到地址 DTAR2。
- 全0数据会写入到地址 DTAR0 和 DTAR1
- 为了确保训练的效果,写入操作使用 8个BL8 或 16个BL4 写入操作。
5. 静态读训练中的读取操作
在静态读训练的读取部分,数据的读取顺序是特定的,确保只有编号24到31的”beats”(字节)是全1的(假设”beats”编号从0到47)。静态读训练会进行 6个BL8 或 12个BL4 的读取操作。
每次读取操作会返回 48个数据beats,这些数据将被传输到PHY。
6. 延迟调整
静态读训练的核心任务是调整读取命令和FIFO中数据之间的延迟。它会尝试不同的延迟值,通过反复的读写操作,直到接收到预期的数据为止。最终会确定一个最小延迟,并在此基础上加一个时钟周期作为余量。
7. 静态读训练的范围
静态读训练仅对特定的内存 rank(内存通道)进行。如果多个rank使用同一个路径(即同一个数据总线),那么需要保证所有rank在每个字节的读取路径延迟都在1个时钟周期内。如果不同的rank之间的延迟差异较大,用户需要对每个rank分别进行训练,并选择最大的延迟值进行后续操作。
总结:
静态读训练的目的是通过对内存访问地址的精确控制,调整读取命令到FIFO中数据准备的延迟。这种训练能够帮助确定最优的延迟设置,确保在内存的读取操作中,数据可以按照预定的时序准确返回。同时,训练操作是通过并行执行多个字节的读写操作,并在每次读写时调整延迟,直到找到最佳的延迟配置。
本文链接: https://talent-tudou.github.io/2024/11/18/DDR/Data Training-Static Read Training/
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!