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子系统架构总览。你可以把它当作本章的思维导图。

DDR子系统架构总览 Controller PHY Channel 命令调度器 时序控制器 刷新控制器 PLL/DLL ZQ校准 ODT控制 Write Leveling Fly-by拓扑 T型拓扑 信号完整性 初始化流程中,Controller负责协议调度 PHY负责电气特性,Channel决定信号质量 三者缺一不可

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