ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

DDR调试必知:DQS数据选通信号为何不可或缺

DDR调试必知:DQS数据选通信号为何不可或缺 做DDR调试这些年我经常被刚入行的硬件工程师问到一个问题为什么DDR非要带一个DQS信号系统时钟不是已经送给控制器了吗为什么DDR颗粒还要一根专门的“数据选通”线这个问题看起来基础但真把它讲透彻能把DQS的来龙去脉捋清楚基本上对DDR的读写时序也就有了底。这篇文章我就从信号同步逻辑、读写时序、颗粒演进、PCB仿真几个角度把DQS为什么“非有不可”这件事讲明白。1. DDR之前单根时钟怎么走到尽头1.1 SDR时代靠CLK“一统天下”想要理解DQS的价值得先回头看DDR之前的同步方式。在SDR SDRAM时代内存颗粒和控制器之间只靠一根系统时钟CLK来对齐。控制器把数据和命令发出去颗粒在CLK的上升沿采样反过来颗粒回答数据也是在CLK的上升沿把数据推出来控制器同样用CLK上升沿去锁存。这套机制在低速时代没有大问题因为数据速率低信号在一个时钟周期里上升沿之后还有很长的稳定时间接收端只要在上升沿附近采样不管信号走线是长是短都能采到稳定的电平。哪怕是CLK和数据分别走不同的路径只要时钟裕量足够大就不会出错。但这里藏着一个致命约束CLK是全局同步信号它和数据信号是从不同的物理路径到达接收端的。走线长度不同板材介电常数有波动温度变化也会让传播延迟漂移。数据速率越高一个bit的周期越短时钟和数据到达时间的偏差——也就是skew——占整个bit周期的比例越来越大最终会把建立时间吃掉。1.2 DDR双倍速率把时钟裕量逼到墙角DDR的第一个本质变化是每个时钟周期要传两次数据一个周期里的上升沿和下降沿都要传输数据。这样一来数据有效窗口直接砍半。原本SDR在CLK上升沿采样数据在半个周期内保持稳定就够了DDR要求数据在四分之一个周期内保持稳定甚至更苛刻。举个例子DDR3-1600的时钟频率是800MHz一个时钟周期12.5ns但一个数据bit只有0.625ns。在这么短的时间里如果把数据和全局时钟分开走线任何一点不匹配都会让采样点飘出数据窗口。更麻烦的是DDR的数据总线是双向的读和写都要靠同一套引脚控制器和颗粒在同一个时钟域里来回切换等长约束、温度漂移、电压漂移全部叠加靠一根全局CLK去锁存双向数据只能“望洋兴叹”。所以行业里换了一个思路你数据走多远我就把锁存信号跟着数据走多远。数据从控制器到颗粒要走多少延迟选通信号也走多少延迟两者自然抵消接收端始终能在正确的时刻看到数据。这个“贴身跟随”的锁存信号就是DQS。1.3 DQS的定位数据的专用“向导”DQS的全称是Data Strobe数据选通信号。它不负责整个系统的时钟同步只负责一组DQ数据的传输对齐。DDR颗粒里通常按字节分组每组8个DQ配一个DQS在x8颗粒上就是8位DQ配一组DQSDQS告诉你“这8个数据现在可以采了”。你可以把DQS理解成一个本地向导系统时钟是火车时刻表告诉你列车什么时候发车DQS则是站台上的地勤直接领着这节车厢的人准确上车。时刻表是统一的但每个站台的情况不一样有了地勤每个站台都能独立应对自己的误差。2. DQS在读写两侧分别扮演什么角色2.1 读操作颗粒把DQS和数据打包送出DDR颗粒读数据时并不是只把DQ推出来就完事它会把DQS也一起推出来。控制器要做的就是根据DQS的边沿去锁存DQ的电平。读方向有一个关键细节DQS的跳变沿和DQ的数据中心是对齐的而不是和DQ的边沿对齐。这个叫“中心对齐”center aligned。也就是说颗粒输出的8位DQ在某个时刻稳定下来DQS正好在这个稳定窗口的中间跳变控制器用DQS的上升沿和下降沿去采样刚好采到DQ最稳定的一刻。为什么要设计成中心对齐因为在高速信号上数据跳变沿附近有振荡和过冲只要采到中间位置容错空间最大对建立时间和保持时间都最公平。DQS当然也不是从一开始就老老实实跳变。颗粒在进入读操作时会先输出一段低电平叫做读前导码Read Preamble然后DQS才开始翻转。数据读完之后DQS还会维持一段高电平或低电平的尾巴叫读后同步码Read Postamble。这两个窗口对控制器内部电路来说是一个“启动”和“收尾”的标志控制器必须在Preamble期间启动DQS锁存电路在Postamble期间放弃采样。如果没有这段前导/后导时间控制器根本不知道DQS什么时候真正开始有效尤其是在突发传输长度不够长时DQS会在短时间内反复开启关闭很容易把一些无效跳变误当成有效数据边沿。2.2 写操作控制器先送DQS颗粒照着采写数据时方向反过来控制器要把DQ和DQS都发给颗粒颗粒根据DQS的边沿采样写入数据这时的相位关系变成了“边沿对齐”edge aligned也就是DQS的跳变沿和DQ的跳变沿基本上同步。这带来一个问题DQS边沿刚好落在DQ跳变的位置而信号跳变时电平是不稳定的颗粒如果在这个瞬间采样大概率采到错误电平。解决方法是让颗粒内部自己做一次90度的延迟把DQS往后再移半个bit这样颗粒内部采样点就落在了DQ稳定窗口的中心。这个90度延迟电路在DDR控制器和颗粒内部都有MCU/FPGA里的DDR硬核会自动做这个相移。写方向还有一个很关键的参数tDQSS描述的是从写命令被颗粒接收到DQS第一个上升沿之间的时间差。DDR规范规定这个时间必须落在一定的窗口内通常是以时钟周期为单位的范围。如果控制器发出的DQS到达颗粒太早或太晚超出了tDQSS容限颗粒会认为这次写入没有对应的有效DQS窗口严重的情况下整次写操作会丢失。实际调板时如果发现颗粒的写数据偶尔出错但查不出其他原因先看tDQSS是不是超了往往是DQS比DQ提前或滞后太多。2.3 为什么不能把DQS直接并在系统时钟上有人可能会问既然DQS本质上也起着引导采样的作用为什么不直接把系统时钟引到颗粒旁边只对齐一次原因是DQS和系统时钟的“任务分工”完全不一样——系统时钟负责把读/写命令和地址送进颗粒而DQS负责具体某一组数据的传输。数据总线在一瞬间可能有多个DQ信号同时翻转比如从0xFF变成0x00这会产生巨大的同时开关噪声SSN导致DQ的信号边沿出现位移而DQS是独立信号不会同时受8个bit翻转的影响用它来采样天然能躲开数据总线自带的噪声尖峰。另外一个更实际的原因是DQS与DQ在PCB走线上是等长的等长约束把两者的延迟差控制在极小范围内。但地址、命令和系统时钟的走线通常会更长也可能穿层换参考平面。如果非要用系统时钟去锁存DQ那系统时钟走线就得跟每一组DQ都等长这几乎做不到因为控制器引脚分布和颗粒引脚分布完全不同。而每组DQ配一根DQS各组的DQS与自己的DQ做等长互不牵连PCB设计才可能实现。3. DQS在DDR3/DDR4/DDR5里的演进逻辑3.1 DDR2/DDR3差分DQS成为标配DDR2开始DQS从单端变成了差分对DQS_t和DQS_c也叫DQS和DQS#两根线一起走。为什么要差分高速单端信号的参考地是GND平面数据跳动时电流回流会产生压降这个压降在接收端会表现为参考电平的波动影响采样精度。差分信号则不同它靠两根线的电压差来体现逻辑接收端看到的是一对互补信号对地噪声有了天然的免疫力。DDR3时代差分DQS已经成为硬性要求并且带宽一路走高。DDR3-1600、DDR3-1866这些速率下单端DQS已经完全扛不住信号完整性要求。在PCB上差分DQS可以让串扰、共模噪声大幅下降走线阻抗也更容易控制。需要注意的是DQS差分对的等长和间距控制非常有讲究两根线的长度差直接影响差分信号的质量一般要求不超过5mil间距也要和差分阻抗目标匹配。3.2 DDR4DQS gate训练变得更重要DDR4的数据速率继续往上冲DQS对应的训练机制也在完善。DDR4里DQS的读前导码变成可配置的可以选1个时钟周期或者2个时钟周期多出来的时间给了控制器更多的余量去做DQS gate窗口校准。DQS gate校准是所有DDR控制器启动流程里的必修课因为颗粒空闲时DQS处于高阻状态外部噪声可能让DQS线上出现毛刺控制器内部的锁存器不能一直在跑它必须开一个“门”只在DQS真正有效的那段时间里接收信号。这个门开早了会把噪声采进来开晚了会丢掉有效的DQS边沿。DDR3以后控制器一般都需要做一次“读DQS门训练”训练结果会存成寄存器值。实际产品中如果更换了DDR颗粒批次或者PCB改版动了走线长度DQS gate窗口往往会偏移导致随机性读数据错误重新跑一次训练往往就恢复了。3.3 DDR5DQS数量翻倍时序粒度更细DDR5的一个大变化是引入了双32bit子通道架构每个通道被拆分成两个独立的子通道分别有自己独立的DQ和DQS。也就是说一个64bit的DDR5通道DQS数量比同宽度的DDR4增加了一倍。每个子通道的DQS负责自己的16bit或32bit数据命令和地址虽然仍然共享但读写数据完全独立训练。这带来的好处是DQS的负载变小每组DQS只需要照顾更少的DQ信号的偏斜更小训练更加灵活。但副作用也很明显控制器要管理更多的DQS通道PCB要走更多的差分对调试时要对每个子通道分别做训练和眼图测量。DDR5速率到4800MT/s以上时DQS信号的上升沿已经小于100ps采样窗口以几十皮秒计时序裕量变得极其珍贵。4. 板级设计里DQS的关键约束与仿真实战4.1 等长关系DQS与DQ同组同层走先给一组典型的等长约束参考值不同速率和要求下会有差异信号组等长关系常见约束DDR3-1600说明DQS差分对内部DQS_t与DQS_c之间±5mil以内差分对内等长保证差分质量DQS与同组DQDQS与DQ0~DQ7之间±20mil以内同字节组内对齐DQ组内DQ0~DQ7之间±20mil以内组内数据对齐各组DQS之间不同字节组的DQS互相对齐±50mil以内保证控制器锁存窗口统一DQS与CLKDQS与系统时钟靠训练补偿不要求绝对等长控制器会调PCB上最容易踩的坑是换层。DQS走线的参考平面如果被分割回流路径被迫绕行DQS到达接收端的时间会比DQ晚很多等长约束名存实亡。我见过一个案例DQS从顶层穿到底层结果底层对应区域被一根大电源线占据DQS差分对不得不绕着走比同组DQ长了近500mil最终读数据眼图几乎闭合。解决办法只能把DQS附近的平面层掏空补一个完整的GND参考岛并把过孔stub控制在最短。4.2 用IBIS模型做DQS时序仿真有了原理图和叠层参数之后PCB投板前最好先做一轮DDR时序仿真。常用的工具链是Sigrity配合颗粒厂家的IBIS模型。基本流程是这样从颗粒厂家官网下载对应型号的IBIS模型注意要集成了封装寄生参数的版本否则仿真结果和实测差别会很大。在Sigrity里搭建拓扑控制器输出→PCB走线→过孔→颗粒封装建立无源通道的S参数模型。把IBIS模型挂到通道两端设置驱动器的slew rate和输出阻抗设置接收端的参考电压和输入阈值。扫描DQS和DQ的相对时延跑出一组“数据有效窗口”的对比图观察是否满足颗粒spec里的tDS/tDH要求。我曾经拿到一颗新平台的DDR5内存做仿真发现读方向DQS的上升时间超过spec上限原因是控制器驱动强度挡位选得太大信号振铃严重。把IBIS模型里的drive strength调低一档之后眼图立刻打开这是纯粹靠仿真才能提前发现的问题。仿真虽然不能替代实测但能把“明显的坑”提前填掉。4.3 DQS与DQ的关系要当“时序组”对待很多工程师把DQS只当成“时钟”只关注它本身的阻抗和长度却忽略了它和同组DQ之间的相位关系。在设计阶段就要明确一点DQS不以系统时钟为参考而是以它对应的8个DQ为参考。也就是说DQS的等长对象是DQ不是CLK更不是地址线。这也是为什么DDR布线都是“分组管理”的原因每个字节通道是一个组byte lane组内有自己的DQ和DQSDQS必须位于组内所有DQ长度的中位数附近才能保证采样点在窗口中心。有的PCB工具支持“relative propagation delay”约束可以直接把所有DQ约束到DQS的±20mil区间比单独设置两两等长更合理。实际操作里我习惯先布DQS差分对把DQS的走线长度定下来然后让同组DQ去追DQS。这样做的原因是差分对的阻抗连续性和参考平面要求更高先保证DQS的质量再调整DQ的等长调整空间更大。如果反过来先布完DQ再布DQS往往会发现DQS差分对在狭小空间里绕来绕去阻抗不连续最终影响整组信号质量。5. DQS相关故障排查与经验速查5.1 读数据偶发错误的头号嫌疑人DQS gate踩过最多坑的是读DQS gate问题表现是系统能用但长时间跑memtest偶尔报一个bit错误或高低温环境下错误明显增多。这种问题用示波器单抓波形很难复现因为错误是概率性的可能几百万个周期才出现一个位翻转。排查思路是先做软件层面的事跑一遍控制器的DQS gate training观察训练结果是否落在寄存器范围的中间位置。如果训练结果接近边界说明DQS gate窗口本身就偏窄。再沿着PCB检查DQS走线是否被其他信号干扰特别是DQS旁边有没有跑过一根翻转频繁的控制信号线。DQS是差分信号抗干扰能力比单端强但如果周边噪声太大preamble时刻的抖动也会变大导致gate关错位置。5.2 写数据错误先查tDQSS和DQS相位写方向的问题通常不像读方向那样随机更多表现为某一段地址写入后读回来全是错。先用逻辑分析仪或FPGA调试工具抓写命令和DQS的关系重点看DQS第一个上升沿距离写命令的延迟如果这个值和控制器寄存器里配置的延迟值差太多优先怀疑DQS走线长度异常。我在某颗FPGA上调试DDR3时死活查不到写错误的原因后来发现DQS从FPGA引脚出来之后PCB上有一个过孔stub特别长导致DQS信号的上升沿出现回勾颗粒在采样时把回勾当成了一次额外边沿数据直接错位。把过孔改成背钻之后问题立刻消失。5.3 DQS与DQ等长偏差过大的真实案例一块两层板设计的DDR模块DQS和DQ的等长约束只做到了50mil一开始低速率测试没问题提到DDR3-1066之后读数据开始不稳定。测量DQS与DQ的相对延迟发现有一组DQ比DQS短了300多mil折算下来约180ps的skew这个时间在DDR3-1066下已经占了数据有效窗口的相当大比例。把DQ走线加长拉齐到DQS附近之后稳定通过高低温测试。这个案例给我们的启发是低速下可能看不出skew问题因为采样点即使偏离中心只要还在窗口里就不会出错但速率一旦提高窗口缩小skew的占比就急剧上升。最好在项目定义初期就定好DQS与DQ的等长规则按目标速率留足裕量。5.4 更换颗粒批次后重新训练的必要性还有一个小细节量产时如果更换了DDR颗粒品牌或批次DQS的封装参数、片内端接阻值都可能和旧批次有差异之前调好的训练参数未必继续有效。我见过一个产品在换了一批颗粒后低温和高温测试都有少量数据错误重跑一遍 DDR training之后恢复正常。这类问题不一定都是硬件损坏颗粒的时序特性变了之后控制器需要重新自适应校准。所以量产阶段如果动过BOM里的任何DDR相关物料务必回归跑一遍training和稳定性压力测试。6. 从DQS还要延伸理解的东西6.1 DQS能不能当作普通时钟来测去示波器上量DQS信号时不要按普通时钟信号的“占空比50%”去要求它。DQS在一次突发传输中翻转但在burst之间不一定有稳定的电平它可能长期保持高阻或某个固定电平。示波器上看到的DQS波形往往是一簇簇的脉冲每簇之间有大段的空闲区。如果看到DQS一直在连续翻转反而要怀疑控制器是不是处在异常状态或者DQS gate逻辑出了故障。量DQS差分对时要注意探头的地线尽量短差分探头直接顶到测量点附近。普通单端探头去测DQS_t看到的只是差分对的一半信号相位和幅度都可能失真容易误判。经验是先看DQS_t和DQS_c是否等幅反相再量差分电压(DQS_t - DQS_c)这个差分波形才是颗粒和控制器真正感知到的信号。6.2 DQS相关的训练项在启动流程里的顺序DDR控制器上电初始化时有一串训练动作顺序大致是ZQ校准、DQS gate训练、写均衡、读均衡、写DQS相位调整、读数据眼图训练。这些训练的顺序不能颠倒因为每一步都依赖于前一步的结果。例如DQS gate没对齐之前读数据根本采不到有效值后续的读均衡训练就无处做起。调试时可以打印训练各阶段的pass/fail结果观察卡在哪一步。实际项目里如果初始化失败最有价值的信息就是卡在哪个阶段。卡在DQS gate阶段大概率是PCB上DQS走线问题卡在读均衡阶段则要关注DQS与CLK之间的延迟差。6.3 对系统设计和芯片选型的启发理解DQS之后再看DDR控制器的选型就有了一种更清晰的视角主控芯片内部通常有专门的DDR PHY里面每一个字节通道都配有一组DQS接收/发送电路还有可编程延迟单元。选FPGA或处理器时不光要看接口速率还要看DQS的delay line调节范围和精度。调节范围太小就无法补偿更大的PCB走线偏差精度不够则无法应对DDR5这种动辄几十皮秒级别的窗口。这几年做高速DDR项目我的一个深刻体会是DQS是DDR系统里最容易被人忽视、却又贯穿始终的信号。它既不是纯时钟也不是纯数据它是一种把时序从“全局同步”变成“局部同步”的桥梁。搞懂了DQS你基本就弄懂了一半的DDR系统。
返回列表