CA总线协议与时序参数

好,我们进入第3章。

CA总线,说白了就是控制器和DRAM之间的指挥通道。命令、地址、bank信息,全得靠它传过去。如果CA训练没调好,后面DQS训练做得再漂亮也白搭。我在第一颗LPDDR4项目上就吃过这个亏,CA时序歪了一点点,整板子只能跑800Mbps,怎么也上不去。

3.1 CA命令编码

LPDDR4的CA总线一共6根:CA0到CA5。你可能觉得6根线能传的东西不多,但配合时钟沿的区分,它能表达的命令非常丰富。

一个CA命令占用2个时钟周期,也就是4个UI(Unit Interval)。控制器在第一个时钟的上升沿送CA[5:0],在下降沿再送一组,第二个时钟的上升沿和下降沿继续。总共4组×6bit = 24bit信息。注意,这24bit不全是命令,有一部分是bank地址和row/column地址。

我整理了一张常用命令编码表,你可以对照看:

命令CA0~CA5(第1拍上升沿)CA0~CA5(第1拍下降沿)说明
DES(空操作)L L L L L LL L L L L L啥也不干,省功耗用的
ACT(激活)L H L L L L[row address bits]打开一行,后面跟bank地址
WR(写)L H L L H L写突发,记得配BL
RD(读)L H L H L L读突发
PRE(预充电)L H L L L HL L L L L L关掉当前行
REF(刷新)L H L L H HL L L L L L定期刷新,不掉数据
MPC(模式寄存器设置)L H H L L Lop code配置MR值

一个小经验:调试初期我喜欢用DES命令确认CA基本通路。如果DES都能解出错误,那DRAM颗粒可能就没焊好,或者参考电压VREFCA没设对。

CA线是单端信号,不是差分。每一根线都配了独立的VREFCA。你想想看,六根线,六组参考电压,分别校准。这也是为什么CA训练比DDR3/DDR4复杂得多的原因之一。

命令编码里最值得关注的是读写命令发出的时机。LPDDR4里读和写的CAS延迟是独立配置的,不像DDR4强制要求CL=RCD。我个人习惯在调DQS训练前,先用读写命令确认CL时序能抓到正确输出。

3.2 时序参数tIS与tIH

tIS和tIH是输入建立时间和保持时间,专门用来衡量控制器发送CA信号的质量。先看定义:

  • tIS(Input Setup Time):CA信号在时钟沿到来之前必须有效的最小前置时间。单位是ps。
  • tIH(Input Hold Time):CA信号在时钟沿之后必须保持有效的最小后置时间。单位也是ps。

LPDDR4 JEDEC标准对tIS和tIH有明确的标量要求。不同速度等级(比如3200Mbps vs 4266Mbps)对应的值不一样。你得查颗粒的数据手册,或者直接在JESD209-4里翻。

关键点:tIS/tIH不是控制器单方面能做到的。它们是控制器输出驱动、PCB走线长度、颗粒接收端负载共同作用的结果。

我曾经在一个项目上遇到tIS不够导致高频下读操作偶尔失败。查了半天,发现是控制器CA信号的 slew rate 偏慢,加上PCB上CA走线绕了7mm。后来把驱动强度从30Ω改到24Ω,tIS才满足。

参数标量(4266Mbps下典型值)时序窗口影响因素
tIS0.12 * tCK (≈56ps)时钟上升/下降沿前的窗口控制器输出延迟、PCB长度、负载电容
tIH0.12 * tCK (≈56ps)时钟上升/下降沿后的窗口时钟抖动、时钟偏斜

实际做训练时,控制器内部有专门的CA训练逻辑。它会发送一组已知码型的CA命令,然后调整每根CA线的相位延迟,直到接收端反馈正确。你每次调整的步长建议不超过10ps。调太快容易直接跳过收敛区,调太慢又浪费时间。

注意:如果tIS/tIH的余量小于10ps,建议检查PCB阻抗和参考电压VREFCA。VREFCA和CA信号自己的电平中心对不齐时,任何延迟调整都救不回来。

3.3 时序参数tDS与tDH

和tIS/tIH对应的是数据路径上的tDS和tDH。它们的定义非常相似:

  • tDS(DQ Setup Time):DQ信号在DQS时钟沿之前必须有效的最小时长。
  • tDH(DQ Hold Time):DQ信号在DQS时钟沿之后必须保持有效的最小时长。

但别搞混。tIS/tIH是CA路径的,tDS/tDH是DQ路径的。LPDDR4里CA用CK_t/CK_c差分时钟,DQ用DQS_t/DQS_c差分时钟。两个时钟域完全独立。调CA时序时动的是CK相关的相位,调DQ时序时动的是DQS相关的相位。不能混淆。

我记得有个刚入行的同事把一个X8颗粒的CA和DQ都用一个训练流程做,结果DQ调好了CA就歪了,相互扯皮。后来帮他分开两个独立闭环才解决。

下面这张SG图展示了CA训练的核心流程:

CA训练时序参数与流程 CA训练时序参数与流程 差分时钟 CK_t/CK_c CA[5:0] × 4拍 命令编码:ACT/WR/RD/MPC ✨ tIS / tIH 设定时间窗口 建立窗口(tIS) + 保持窗口(tIH) ✨ tDS / tDH 设定时间窗口 DQ建立窗口(tDS)+ 保持窗口(tDH) VREFCA 参考电压校准 CA训练通过

从这张图可以清楚看到,CA训练分成几大块:时钟基础、命令编码、时序窗口、参考电压。任何一块出了偏差,最后的"CA训练通过"都拿不到。

做CA训练时我习惯先调VREFCA,把信号电平中心找出来,然后再去调tIS/tIH的相位延迟。顺序反了,你先调相位,VREFCA改了又得重来。

3.4 tIS、tIH、tDS、tDH在训练中的实际意义

很多新入行的朋友会问:这些时序参数在软件层面怎么体现?

控制器的CA训练流程,其实就是扫描tIS/tIH的可用窗口。流程大致如下:

  1. 发送写命令到指定地址
  2. 等一小段时间(固定CL时序)
  3. 从同一地址读出数据
  4. 和写入数据比对
  5. 如果一致,说明当前CA时序可行
  6. 如果不一致,调整CA相位延迟,重试

每次调整步长我一般设为1/64个UI。4200Mbps下1个UI大约238ps,1/64约3.7ps。这个粒度够细,能帮你找到最优中心点。

我的做法:扫描完所有可用相位后,取窗口的左右边界,然后选中间点作为最终配置。左右余量各留10ps以上。这样即便温度漂移或电压波动,也能扛住。

至于tDS/tDH,更多是DQS训练阶段的事。但CA训练时其实也会间接用到它们——因为CA命令本身也受DQ信号影响,比如写操作完成后需要读取反馈。如果tDS/tDH窗口太小,读回来的数据就不可信。所以CA训练前,至少保证DQ基本通路是通的。

参数对所属路径调整目标典型训练范围
tIS / tIHCA → CKCA信号相对于CK的飞行时间±1 UI
tDS / tDHDQ → DQSDQ信号相对于DQS的飞行时间±0.5 UI

注意:不要在低频下用单一的扫描结果直接推断高频行为。高频信号完整性问题可能只在高频段暴露。我建议每个频率点都单独跑一遍CA训练,至少确认一次边界。

OK,关于CA时序参数就说这么多。核心就几个点:记住命令编码规则,理清tIS/tIH和tDS/tDH的区别,用好VREFCA校准。后面再聊DQS训练时,你会看到这些参数是如何配合使用的。