
我们前面查了户口、身份证、配电站。接下来我们看看怎么发号施令。要想内存干活就得先给他下命令读、写、激活、刷新第几行第几列哪个bank。这套口令叫CACommand/Address命令/地址总线。下完命令真开始干活搬货的那又是DQ数据线。命令和数据走的不是一条路。命令是大喇叭喊的干活是从仓库里搬货的。两条路DDR5的内存条子上信号分两拨走不同的路。信号内容路线CA CK命令/地址 时钟穿过 RCD先到 RCD再由 RCD 扇出给每个颗粒DQ DQS数据 数据选通直连颗粒LRDIMM 才加 DB 重驱动发号施令要用大喇叭喊数据搬货走仓储专线。RCD是扩音器RCDRegistering Clock Driver寄存时钟驱动器JESD82-513命令/地址经过的那颗芯片它把老板送来的口令用大喇叭广播给所有颗粒。比如乐队表演交响乐指挥吼一嗓子全场几十个乐手都要听见场地一大就不能靠嗓了得大喇叭RCD就是大喇叭。为什么要有RCD因为条子的负载越来越大。RDIMM上有多个rank、几十颗颗粒每颗颗粒的CA时钟脚都要接。host那点驱动能力推不动这么多负载。RCD就是那个给老板分忧的中层host只驱动RCD一颗芯片RCD再重新驱动所有颗粒天下太平。但是有得必有失RCD 天生带来两件事延迟口令经RCD一进一出就慢半拍。skewRCD到不同颗粒走线参差不齐每颗颗粒听到口令的时刻就不一样。怎么找到这个大喇叭RCD跟PMIC一样也是挂在SPDHub背后。host要跟RCD说话也得先跟SPDHub打招呼穿Hub。RCD 的门牌号JESD300-5 Table 5LID器件类型1011地址 1011 HID(槽号)0x58 ~ 0x5FDIMM 槽01234567RCD 地址0x580x590x5A0x5B0x5C0x5D0x5E0x5F整体来看是这么个事器件LID地址PMIC配电站10010x48~0x4FSPD Hub前台10100x50~0x57RCD传令兵10110x58~0x5F温度传感器 TS0 / TS10010 / 01100x10 / 0x30 附近访问方式就是老板发1011 槽号每根条子的 Hub 拿槽号跟自己对命中的那根把本地 HID 改写111它的RCD举起手来JESD300-5 §2.6.6。注意CA没有贴身门铃CA和DQ最根本的区别是CA没有DQ的摇铃信号DQS。靠谁定时有没有贴身门铃类比DQDQS每lane一个跟数据同行有快递员跟着货走货到门铃响CACK全局时钟不是专属的没有乐手只听指挥的节拍DQ有DQS贴身门铃门铃跟着数据一起走天然对齐。所以DQ的时序被DQS自动兜住一部分。CA没有铃只能靠全局CK打拍子。RCD把CA和CK的时序关系没搞好颗粒就会听岔拍了。这就是为什么CA必须单独专门训练。给口令线做时序对齐训练de-skew训练就是逐根调整 CA 线的延迟让每一根命令/地址线都踩准CK的拍子到达颗粒。也就是扫延迟找窗口控制器发一组已知的CA口令颗粒训练模式下通过DQ回报听清没有控制器扫CA的延迟找到能听清的窗口取窗口中心逐根锁定眼宽是所有颗粒听清窗口的交集木桶最短的板。还有个坑及格线按pattern难度分档归一化——及格线是相对这首曲子的预期眼宽、不是绝对宽度。歌难唱大家本来眼就窄要求就得放低不能当大家都是歌神张学友否则一首难曲子全班翻车那还怎么玩CA还是DQ挂了CA 挂了DQ 挂了本质口令没听清口令听清了货搬错了症状开不了机 / POST 卡死能开机但数据错 / 蓝屏 / ECC 报错类比指挥喊开始乐手没听见全体愣住乐手听见了开始有人拉错了音看到开不了机、卡在训练早期先怀疑CA看到能开机但数据错才往DQ查。CA训练失败的例子CA训练失败打印警告”Best Eye Width … smaller than minimum critical margin”channel被禁用。CA训练的眼宽是所有CA信号听清窗口的交集眼宽太小小于临界值就禁channel。注意CA走RCD不经过DFECA命令方向和DQ数据方向是两条独立路径DFE是读DQ方向的回声消除器救不了CA用错药是硬伤。DIMM差异类型RCDDBCA/DQ 路线UDIMM / SODIMM无无CA 直连 DRAM无 RCDRDIMM有无CA 穿 RCDDQ 直连LRDIMM有有CA 穿 RCD DQ 穿 DB「减载」MRDIMM有有(mux)再加 rank 复用DBData Buffer数据缓冲LRDIMM 才有——重驱动 DQ 数据。DB是LRDIMM的减载RCD卸掉了CA/时钟的负载但DQ的负载还在host身上。RDIMM只到这一步能挂的rank有限。LRDIMMLoad-Reduced DIMM减载 DIMM再进一步又加了中层经理人DB把DQ/DQS的负载也卸下来CA/CKDQ/DQS能挂 rankRDIMM穿 RCD直连少LRDIMM穿 RCD穿 DB多8~16此时老板只对RCD、DB驱动一条channel就能挂更多rank了。加了DB以后重新驱动DQ/DQS同样带来延迟和偏移所以 LRDIMM 的 DQ 训练也得迁就 DB 引入的偏移。自己动手访问RCD我写了个跑在 UEFI Shell 里的工具 RCDTest照 JEDEC 公开规范JESD82-513通过 SMBus 穿 SPD Hub 访问 RCD 的控制字RW00~RWxx。同一个 repo 里的兄弟又多了一个SpdTest 读身份证PmicTest 读/烧配电站RCDTest 读/写传令兵。用法RCDTest.efi scan # 扫 0x58~0x5F列出在位的 RCD RCDTest.efi read -c ctrl -ch ch -d dimm # 读全部控制字 RW00~RW5F RCDTest.efi read -c ctrl -ch ch -d dimm -r reg # 读一个控制字 RCDTest.efi write -c ctrl -ch ch -d dimm -r reg -data 8hex # 写一个控制字输出大概长这样最近手上没有环境验证 RCD Scan (addresses 0x58..0x5F) DIMM 0 (0x58): RCD present (RW000xXXXXXXXX) Total: 1 RCD(s) present RCD Control Words (RW00~RW5F) DIMM: Controller0 Channel0 Dimm0 (SMBus 0xB0, 7-bit 0x58) RW00 0xXXXXXXXX (Global Features) RW05 0xXXXXXXXX (DIMM Operating Speed) ... RCD不是PMIC那种写寄存器地址去读写数据而是Sideband控制字的协议JESD82-513 §7.5.7⁄7.5.8。它是先block写命令和设置再block读回状态DWord。命令字节还分 I2C0xC2和 I3C0xC0两种RCDTest走的I2C所以用的是0xC2。RCD 的版本也能读出来——它在分页控制字 PG[3]RW6EVendor Revision ID里先写 RW5F 选页、再读 RW6E。log 里的真实值是IDT Rev 1.0x33、Montage Rev 2.0x11。源码在 http://github.com/peterhu/ddr5-shellkit。总之一句话命令走大喇叭数据走直线。命令错开不了机数据错会蓝屏。CA是口令、DQ是数据。CA挂了全体颗粒听不见口令直接开不了机DQ挂了口令听清了但货搬错了能开机但数据错。而CA之所以最难训是因为它要一帮兄弟同时踩中节拍、还没贴身门铃、又被RCD加了偏移。