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的寻址过程分两步走:先激活行,再访问列。为什么这么设计?因为行和列的地址线是复用的,这样可以减少引脚数量。
具体流程是这样的:
- 行激活(RAS):发送行地址,打开整行
- 列访问(CAS):发送列地址,读取/写入具体单元
- 预充电(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