@
allmightbe 关于缓存,我印象里每个 bank 是有一个 row buffer 的。
一次性取 8 个字节,大概是因为 DIMM 的位宽是 64 bits 的吧(带 ECC 是 72 bits ,不过有效数据还是 64 bits ),但是实际上 burst length 对于 DDR4 的情况是常用 8 (因为好像从 DDR3 开始 prefetch 一般都是做的 8n ),也就是说一次连续的读写会涉及到 64 bytes 。如果要在一次读写中只让部分数据有效,一个是会用到 Data Mask 引脚,把部分数据位掩码掉;另一个是 burst chop ,让 burst length 变为 4 。但是如果都是短字节的随机读写,就会让 DDR 接口上一次读写操作中有大部分数据是浪费的。所以 CPU 里要做 Cache ,在需要的时候按 Page 为单位和 RAM 做数据交换,从而把内部比较随机的 RAM 读写变成相对连续的 DDR 读写。
不过关于一次读写的数据长度这一点上,我理解这个还是要和具体的 DDR 控制器设计相关的,我见过的一个用到 DDR 的设计是一个 Memory Channel 只带 2 个颗粒,DQ 位宽 16 bits ,burst length 固定为 8 ,这样的话发出一个地址请求,就会读写 16 bytes 的数据,内存控制器的地址是按 0x10 对齐的,也就是地址的低 4 位只用于配合读写长度进行字节的提取,但是 DDR 控制器到内存颗粒上总是一次读写就是连续的 16 bytes 。