DDR4内存系统架构:通道、Rank、Bank、数据路径与时序关系
写均衡调试,说白了就是让DDR4颗粒和控制器在物理层面上对齐。但在动手抓波形之前,你得先把整个内存系统的骨架搞清楚。我记得刚入行那会儿,一脸懵地盯着一堆信号线,根本分不清哪个是哪个。后来被老工程师带了一周,才算把这张图刻进脑子里。
2.1 通道(Channel)—— 最粗的那根管子
一个通道(Channel)就是一条完整的数据链路。
- 每个通道有自己独立的DQS、DQ、命令地址总线。
- 通常一个CPU集成了2个或4个通道。比如我们常见的双通道DDR4,就是2条独立通道。
- 各通道之间物理隔离,时序独立。调试时可以单独抓一个通道的写均衡。
我在项目中碰到过一个案例:板子上两个通道写均衡做完,一个跑3200MT/s稳如狗,另一个死活锁不住。最后定位是通道B的走线等长没做好。所以说,通道级的隔离性既是优势,也是排查的切入口。
2.2 Rank —— 谁在跟你对话
每个通道下挂的颗粒,可以分成若干个Rank。
Rank是什么?就是一个通道上一组同时被片选信号CS#选中的颗粒。你想想看,一根数据线上挂好多颗粒,到底听谁的?靠CS#决定。当前拉低的那个Rank就是被选中的奴隶。
具体来说:
- 单Rank: 简单,一组颗粒,一个CS#。
- 双Rank: 共用数据总线,但两组颗粒分时工作。CS#0和CS#1交替拉低。
- 四Rank: 通过RDIMM或LRDIMM实现,调试更复杂。
2.3 Bank —— 数据仓库里的隔间
每个Rank内部,又划分成若干Bank。DDR4每个Bank是独立的存储阵列。你可以同时在不同Bank里做读写操作,但不能在同一Bank里同时干两件事。
| 粒度 | 典型数量(DDR4 8Gb为例) | 我的理解 |
|---|---|---|
| Bank Group | 4组 | 每个Group可以独立激活,提升并发度。 |
| 每组Bank数 | 4个 | 4×4=16个Bank。有些芯片是8组Bank Group×4。 |
写均衡训练时,JEDEC规范规定了必须要发特定的MRS命令来激活写均衡模式。这些命令针对的是整个Rank,跟Bank没有直接关系。但你要知道,写均衡的数据会写入到某个指定Bank的某个Row里。如果这个Bank里有脏数据,可能会干扰。我通常会在做写均衡前发个空操作序列清一清。
2.4 数据路径与时序关系——信号怎么跑
数据路径这件事,分三块看:
- 写路径: 控制器发DQS边沿,然后发DQ数据。颗粒用DQS的边沿来采样DQ。
- 读路径: 颗粒发DQS边沿,然后发DQ数据。控制器用DQS的边沿来采样DQ。
- 命令地址路径: 控制器发命令和地址,颗粒在CK的上升沿采样。
为什么写均衡只调写路径?因为读和写的信号方向不一样,时序偏差的来源也不一样。写均衡处理的是控制器到颗粒之间的DQS-DQ相对时序偏差。
2.5 时序参数速览
| 参数 | 含义 | 写均衡中的角色 |
|---|---|---|
| tDQSS | DQS到CK的时钟偏差范围 | 写均衡的核心目标:把DQS对准到CK窗口内。 |
| tDQS2DQ | DQS边沿到DQ数据的偏移 | 单位间隔(UI)的保持时间是否满足。 |
| tWLS | 写均衡设置的步进分辨率 | 决定了你能调多细。颗粒里写均衡寄存器每步对应多少ps,看颗粒手册。 |
| tWR | 写恢复时间 | 写了数据后要等待的时间,不然读出来是错的。 |
讲到这里,我建议你先在脑子里画一张图:一个通道,下挂两个Rank,每个Rank里面16个Bank,数据线DQ走写路径,DQS承载边沿,在CK的参考下对齐。这张图理顺了,写均衡的本质你就拿下一半了。
2.6 总结:一张表理清层次
| 层级 | 数量参考(DDR4 32GB RDIMM) | 调试注意 |
|---|---|---|
| 通道 | 2~4 | 各通道独立,不能混调。 |
| Rank | 1~4 | 每个Rank需分别写均衡。 |
| Bank Group | 4或8 | 写均衡不直接涉及,但影响数据模式。 |
| Bank | 16或32 | 训练时自动选择最小Bank。 |
| Row/Column | 视密度而定 | 地址线分布决定了写均衡的相位参考。 |
| DRAM Cell | GB级 | 真正存数据的地方。 |
搞懂了这些层级,你再用逻辑分析仪抓写均衡波形时,看到CS#的切换、Bank Address的变化、DQS和DQ的相位关系,就不会一头雾水了。说真的,我见过不少人直接跳过架构去抓波形,结果抓了一堆乱码也不知道问题出在哪。先画图,再动手,这是硬道理。