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 L | L 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 H | L L L L L L | 关掉当前行 |
| REF(刷新) | L H L L H H | L L L L L L | 定期刷新,不掉数据 |
| MPC(模式寄存器设置) | L H H L L L | op 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下典型值) | 时序窗口 | 影响因素 |
|---|---|---|---|
| tIS | 0.12 * tCK (≈56ps) | 时钟上升/下降沿前的窗口 | 控制器输出延迟、PCB长度、负载电容 |
| tIH | 0.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训练通过"都拿不到。
做CA训练时我习惯先调VREFCA,把信号电平中心找出来,然后再去调tIS/tIH的相位延迟。顺序反了,你先调相位,VREFCA改了又得重来。
3.4 tIS、tIH、tDS、tDH在训练中的实际意义
很多新入行的朋友会问:这些时序参数在软件层面怎么体现?
控制器的CA训练流程,其实就是扫描tIS/tIH的可用窗口。流程大致如下:
- 发送写命令到指定地址
- 等一小段时间(固定CL时序)
- 从同一地址读出数据
- 和写入数据比对
- 如果一致,说明当前CA时序可行
- 如果不一致,调整CA相位延迟,重试
每次调整步长我一般设为1/64个UI。4200Mbps下1个UI大约238ps,1/64约3.7ps。这个粒度够细,能帮你找到最优中心点。
我的做法:扫描完所有可用相位后,取窗口的左右边界,然后选中间点作为最终配置。左右余量各留10ps以上。这样即便温度漂移或电压波动,也能扛住。
至于tDS/tDH,更多是DQS训练阶段的事。但CA训练时其实也会间接用到它们——因为CA命令本身也受DQ信号影响,比如写操作完成后需要读取反馈。如果tDS/tDH窗口太小,读回来的数据就不可信。所以CA训练前,至少保证DQ基本通路是通的。
| 参数对 | 所属路径 | 调整目标 | 典型训练范围 |
|---|---|---|---|
| tIS / tIH | CA → CK | CA信号相对于CK的飞行时间 | ±1 UI |
| tDS / tDH | DQ → DQS | DQ信号相对于DQS的飞行时间 | ±0.5 UI |
注意:不要在低频下用单一的扫描结果直接推断高频行为。高频信号完整性问题可能只在高频段暴露。我建议每个频率点都单独跑一遍CA训练,至少确认一次边界。
OK,关于CA时序参数就说这么多。核心就几个点:记住命令编码规则,理清tIS/tIH和tDS/tDH的区别,用好VREFCA校准。后面再聊DQS训练时,你会看到这些参数是如何配合使用的。