2、DDR基本原理:存储单元与寻址技术

大家好,我是老张。做DDR测试这么多年,我经常被问到:“DDR到底是怎么存数据的?”说实话,这个问题看似简单,但真要讲清楚,得从最底层的存储单元说起。今天咱们就聊聊DDR的基本原理,我会结合我踩过的坑,帮你把这块硬骨头啃下来。

2.1 DDR存储单元结构

DDR的存储单元,说白了就是一个电容加一个晶体管。电容负责存电荷(代表0或1),晶体管负责开关。你想想看,这结构是不是特别像一个小水桶?电容就是水桶,晶体管就是水龙头。

核心要点:每个存储单元存储1bit数据。电容有电荷代表“1”,没电荷代表“0”。但电容会漏电,所以需要定期刷新。

我在项目中遇到过一件事:有次测试DDR3模组,发现某些地址位老是读错数据。排查了半天,最后发现是电容漏电太快,刷新周期没跟上。嗯,这里要注意——刷新时序是DDR测试的重中之重

存储单元的组织方式是这样的:

  • Bank:一组存储阵列,DDR内部通常有4~8个Bank
  • Row:行,每个Bank有数千行
  • Column:列,每行有数百列
  • Cell:每个行列交叉点就是一个存储单元

我个人习惯把Bank比作一栋楼,Row就是楼层,Column就是房间号。你要找数据,得先知道哪栋楼(Bank)、哪一层(Row)、哪个房间(Column)。

2.2 行与列寻址

DDR的寻址过程分两步走:先激活行,再访问列。为什么这么设计?因为行和列的地址线是复用的,这样可以减少引脚数量。

具体流程是这样的:

  1. 行激活(RAS):发送行地址,打开整行
  2. 列访问(CAS):发送列地址,读取/写入具体单元
  3. 预充电(Precharge):关闭当前行,准备下一次访问

避坑指南:我曾经在调试DDR4时,忽略了行激活到列访问的延迟(tRCD)。结果信号采样总是不稳定。后来加上这个延迟参数,问题就解决了。记住:tRCD、tCL、tRP这三个时序参数,是DDR测试的“三驾马车”

你可能会问:“为什么要先激活一整行?”其实这是DDR的巧妙之处。激活一行后,整行的数据都被读到Sense Amplifier(感测放大器)里,后续的列访问就快多了。这就像你打开一个抽屉,里面的东西一目了然,不用再翻箱倒柜。

2.3 预取技术(Prefetch)

预取技术,是DDR提速的关键。说白了就是:一次读多个数据,然后串行输出

DDR的预取宽度是这样的:

DDR版本 预取宽度 内部频率 vs 外部频率
DDR 2n 内部频率 = 外部频率 / 2
DDR2 4n 内部频率 = 外部频率 / 4
DDR3 8n 内部频率 = 外部频率 / 8
DDR4 8n 内部频率 = 外部频率 / 8
DDR5 16n 内部频率 = 外部频率 / 16

举个例子你就明白了。DDR3的预取宽度是8n,意思是内部一次读8个数据,然后分8个时钟周期串行输出。这样内部时钟可以跑得慢,但外部接口速度却很高。我刚开始做DDR3测试时,看到内部频率只有200MHz,但接口速率却达到1600MT/s,当时就懵了——后来才明白是预取在起作用。

注意:预取技术虽然提高了带宽,但也带来了数据对齐的问题。我在测试DDR4时,遇到过因为预取边界没对齐,导致数据错位的案例。所以测试时一定要检查地址对齐。

2.4 突发长度(Burst Length)

突发长度,就是一次读写操作连续传输的数据个数。DDR的突发长度通常是固定的:

  • DDR:BL=2
  • DDR2:BL=4或8
  • DDR3:BL=8(固定)
  • DDR4:BL=8(固定)
  • DDR5:BL=16(固定)

为什么要有突发长度?因为DDR内部预取的数据量正好等于突发长度。DDR3预取8个数据,所以突发长度就是8。这样内部读一次,外部刚好传完,效率最高。

我建议你在测试时注意:突发长度决定了地址的递增方式。比如DDR3的BL=8,那么列地址的低3位是不用的(因为一次读8个,地址自动递增)。我曾经在写测试脚本时,忘了这个细节,结果地址计算全错了,折腾了一整天。

关键总结:

  • 存储单元 = 电容 + 晶体管,需要定期刷新
  • 寻址分两步:行激活 → 列访问
  • 预取技术:一次读多个,串行输出,提高带宽
  • 突发长度 = 预取宽度,决定了数据传输的粒度

好了,DDR的基本原理就聊到这儿。这些概念是后续测试的基础,你最好能画个时序图自己走一遍。下一节咱们会讲DDR的电气特性,到时候再聊。


公众号:蓝海资料掘金营,微信deep3321