2、DDR子系统架构:Controller、PHY、Channel拓扑、Fly-by与T型拓扑对比
好,咱们进入第二章。这一章我打算把DDR子系统的骨架给你拆开看看。
很多人一上来就盯着初始化时序表猛看,结果连Controller和PHY谁管谁都搞不清楚。这不行。你得先知道整个系统长什么样,才能理解初始化时每个模块在干嘛。
2.1 三大核心模块:Controller、PHY、Channel
DDR子系统说白了就三块:Controller(控制器)、PHY(物理层)、Channel(通道)。我习惯把它们比作「大脑、手脚、马路」。
Controller 是大脑,负责协议层的调度。它决定什么时候发ACT、什么时候发READ、什么时候刷新。你写的初始化序列,本质上就是给Controller下指令。
PHY 是手脚,负责把Controller的逻辑信号变成真正的电气信号。ODT配置、ZQ校准、DLL锁定,这些脏活累活全是PHY干的。
Channel 是马路,就是PCB上那几根走线。信号从PHY出发,经过PCB,到达DRAM颗粒。这条路好不好走,直接决定了你的系统能跑多快。
我遇到过不少工程师,调试初始化失败时只知道盯着寄存器看。其实很多时候问题出在PHY的延迟配置上,或者Channel上的信号反射太严重。嗯,这个后面会细说。
2.2 Controller与PHY的分工
这里有个容易混淆的点:初始化到底是谁在主导?
答案是:Controller主导流程,PHY负责执行。
举个例子。初始化第一步是复位和时钟稳定。Controller会先拉低RESET_n,等一段时间再拉高。但PHY这时候在干嘛?PHY在等它的PLL锁定。如果PHY的PLL还没锁好,Controller就算发了命令也没用。
我个人习惯把初始化分成两个阶段看:
- PHY准备阶段:PLL锁定、DLL复位、ZQ初始校准。这个阶段Controller基本在等待。
- Controller主导阶段:发送MRS命令、配置模式寄存器、执行ZQCL。这个阶段PHY只是忠实地转发信号。
避坑指南:我曾经在一个项目里发现初始化总是卡在DLL锁定这一步。查了两天才发现,PHY的参考时钟相位没调好,导致DLL一直锁不住。后来我在PHY的初始化序列里加了一个时钟相位扫描的步骤,问题就解决了。
2.3 Channel拓扑:Fly-by vs T型
Channel拓扑是个大话题。DDR3之后,Fly-by拓扑成了主流。DDR2时代用的T型拓扑基本被淘汰了。为什么?
你想想看,T型拓扑长什么样?它像一棵树,从树干分到树枝,再分到树叶。每个DRAM颗粒到Controller的走线长度不一样。这就导致了一个问题:信号到达每个颗粒的时间不同。
DDR2时代频率低,这个问题不明显。到了DDR3,频率上去了,时序窗口越来越窄,T型拓扑的走线长度差异就成了致命伤。
Fly-by拓扑就不一样了。它像一条链子,信号从Controller出发,依次经过每个DRAM颗粒。走线长度是递增的,但每个颗粒的负载是均匀的。信号质量好很多。
| 对比项 | T型拓扑 | Fly-by拓扑 |
|---|---|---|
| 走线方式 | 分支结构,类似树形 | 菊花链结构,类似串行 |
| 信号质量 | 反射严重,高频下差 | 反射小,适合高频 |
| 时序控制 | 需要等长布线,难度大 | 走线长度递增,靠Write Leveling补偿 |
| 适用场景 | DDR2及以下 | DDR3及以上 |
| PCB布线难度 | 高,需要大量蛇形走线 | 低,走线简单 |
但Fly-by也有代价。因为信号到达每个颗粒的时间不同,所以Write Leveling就成了必须的步骤。初始化时,Controller会通过Write Leveling来补偿每个颗粒的延迟差异。这个我们后面会专门讲。
注意:如果你用的是Fly-by拓扑,但初始化时没有正确执行Write Leveling,那DDR系统大概率跑不起来。我见过有人直接把DDR2的初始化代码搬到DDR3上,结果死活不工作。原因就是少了Write Leveling这一步。
2.4 知识体系总览
下面这张图是我画的DDR子系统架构总览。你可以把它当作本章的思维导图。
2.5 初始化时各模块的交互
搞清楚了架构,咱们再看看初始化时它们是怎么配合的。
我举个例子。DDR4初始化时,Controller会先发一个MRS命令来配置模式寄存器。这个命令从Controller发出,经过PHY的延迟链,再通过Channel到达DRAM颗粒。PHY的延迟链必须精确匹配,否则命令到达DRAM时已经不在正确的时钟沿上了。
这里有个关键点:PHY的延迟链是在初始化早期通过DLL校准来确定的。如果DLL没锁好,后面所有的MRS命令都是白搭。
核心要点:初始化时,Controller和PHY的交互顺序是固定的。先让PHY准备好(PLL、DLL、ZQ),再让Controller发命令。这个顺序不能乱。
2.6 拓扑选择对初始化的影响
最后聊聊拓扑选择对初始化流程的影响。
如果你用的是Fly-by拓扑,初始化时必须包含Write Leveling这一步。Write Leveling的目的是让每个DRAM颗粒的DQS信号与CK信号对齐。因为Fly-by拓扑下,CK和DQS的走线长度不同,到达时间也不同。
T型拓扑就不需要Write Leveling。因为T型拓扑下,CK和DQS的走线长度是匹配的。但T型拓扑的信号质量差,频率一高就扛不住。
所以你看,拓扑选择直接决定了初始化流程里要不要多一个步骤。这也是为什么DDR3之后的初始化流程比DDR2复杂的原因之一。
个人经验:我建议你在做PCB布局时,优先选Fly-by拓扑。虽然初始化时多了一步Write Leveling,但信号质量的提升是实实在在的。而且现在主流的DDR控制器IP都原生支持Write Leveling,你只需要在初始化序列里把它使能就行了。
公众号:蓝海资料掘金营,微信deep3321