We’ve checked the family tree (Case 0.1), the ID card (Case 0.2), and the power substation (Case 0.3). Now the finer question: how do commands and data travel across this DIMM?
Before memory does anything, the controller has to give it orders — read, write, activate, refresh, which row, which column, which bank. Those orders ride the CA (Command/Address) bus, a bundle of parallel wires. The actual payload rides the DQ (data) lines. And the two take different roads: commands get shouted through an amplifier; data gets carried straight from the warehouse.
Two paths
Two kinds of signal, two different roads:
| Signal | What | Route |
|---|---|---|
| CA + CK | command/address + clock | through the RCD (to the RCD first, then fanned out to every die) |
| DQ + DQS | data + data strobe | straight to the dies (LRDIMM adds a DB to re-drive) |
Commands go through the amplifier; data goes straight.
Auto-plays · open full screen ↗
RCD: the amplifier
The RCD (Registering Clock Driver) (JESD82-513) is the chip on the command/address path. Its one job: take the host’s orders, amplify them, and broadcast to every die.
Picture a full orchestra. The conductor shouts, and fifty musicians all need to hear it. In a big hall you can’t do that with a bare throat — you need a PA system. The RCD is the PA.
Why RCD
Because the load got too big. An RDIMM carries multiple ranks and dozens of dies, every die’s command/clock pins wired up. The host’s drive strength can’t pull that many loads and keep the signal clean.
The RCD is the middle manager that takes the load off the boss: the host drives one chip (the RCD), the RCD re-drives every die, and all is well. But there’s a price — the RCD brings two things:
- Delay: every order takes a beat to enter and leave the RCD.
- Skew: the traces from RCD to each die aren’t the same length, so each die hears the order at a slightly different moment.
Finding the amplifier
Like the PMIC, the RCD hangs on the local bus behind the SPD Hub. To talk to it, the host goes through the Hub (same drill as Case 0.3).
Its address (JESD300-5 Table 5): LID (device type) = 1011, so 1011 + HID(slot) = 0x58 ~ 0x5F:
| DIMM | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| RCD addr | 0x58 | 0x59 | 0x5A | 0x5B | 0x5C | 0x5D | 0x5E | 0x5F |
And the whole bus side-by-side:
| Device | LID | Address |
|---|---|---|
| PMIC (substation) | 1001 |
0x48~0x4F |
| SPD Hub (front desk) | 1010 |
0x50~0x57 |
| RCD (messenger) | 1011 |
0x58~0x5F |
| Temp sensor TS0/TS1 | 0010/0110 |
0x10/0x30 |
Access is the same as the PMIC: the host sends 1011 + slot, each Hub compares the slot against its own, the matching one rewrites the local HID to 111, and its RCD raises its hand (JESD300-5 §2.6.6).
The soul: CA has no doorbell
The deepest difference between CA and DQ — and the reason CA needs its own training:
| clocked by | doorbell? | analogy | |
|---|---|---|---|
| DQ | DQS (one per lane, rides with the data) | yes | the courier follows the cargo; the bell rings when it arrives |
| CA | CK (a global clock, not its own) | no | the musician only follows the conductor’s baton |
DQ has DQS as a doorbell riding along, so its timing is self-aligning — DQS absorbs part of the timing problem.
CA has no bell; it only has the global CK. If the RCD mangles the CA↔CK timing (delay + skew), the dies hear the beat wrong — listening when they shouldn’t, deaf when they should.
That’s why DQ’s “follow the bell” trick can’t save CA. CA needs its own dedicated training.
CA training: de-skew for the command lines
One line: adjust each CA line’s delay, one by one, so every command/address line lands on CK’s beat at the die.
Same “sweep the delay, find the window” idea as de-skew:
- The controller sends a known set of CA orders.
- The dies (in training mode) report back over DQ whether they heard.
- The controller sweeps the CA delay and finds the window that “hears”.
- It locks each line to the center of the window.
The eye width is the intersection of every die’s “I can hear” window (the shortest stave of the barrel).
One more gotcha: the pass line is graded by pattern difficulty (normalized) — the pass line is the deviation from this pattern’s expected eye width, not an absolute width. A hard tune gets a lower bar; not everyone is a star vocalist, and if you hold a hard tune to the easy bar, the whole class fails.
CA vs DQ: how to tell them apart
| CA failed | DQ failed | |
|---|---|---|
| what happened | the order wasn’t heard | the order was heard, the cargo was dropped |
| symptom | won’t boot / POST hangs | boots, but data corrupts / blue screen / ECC errors |
| analogy | the conductor said “go” and nobody heard; everyone froze | they heard “go”, but someone played the wrong note |
Won’t boot, stuck early in training → suspect CA. Boots but data is wrong → look at DQ.
A case: CA training fails
The log prints “Best Eye Width … smaller than minimum critical margin” and the channel is disabled.
The CA eye width is the intersection of all CA signals’ “hear” windows; too small (below critical) and the channel is disabled.
One thing to remember: CA goes through the RCD and does not pass through DFE. CA (command direction) and DQ (data direction) are two separate paths; DFE is the echo canceller on the read-DQ path, and it can’t save CA. Using the wrong medicine is a classic blunder.
DIMM types
| Type | RCD | DB | CA/DQ route |
|---|---|---|---|
| UDIMM / SODIMM | no | no | CA straight to DRAM, no RCD |
| RDIMM | yes | no | CA through RCD, DQ direct |
| LRDIMM | yes | yes | CA through RCD + DQ through DB (“load-reduced”) |
| MRDIMM | yes | yes(+mux) | adds rank muxing |
DB (Data Buffer) — LRDIMM only — re-drives the DQ data.
DB: LRDIMM’s load reduction
The RCD took the CA/clock load off the host, but the DQ load is still on it. RDIMM stops there, so the rank count it can support is limited.
LRDIMM (Load-Reduced DIMM) goes one step further and adds another middle manager — the DB — to take the DQ/DQS load off too:
| CA/CK | DQ/DQS | ranks it can hold | |
|---|---|---|---|
| RDIMM | through RCD | direct | few |
| LRDIMM | through RCD | through DB | many (8~16) |
Now the boss only drives the RCD and the DB, and one channel can hold more ranks. The DB re-driving DQ/DQS brings its own delay and skew, so LRDIMM’s DQ training has to absorb the DB’s skew too.
Want to poke it yourself?
I wrote a UEFI Shell tool, RCDTest, that goes through the Hub and reads/writes the RCD’s control words (RW00~RWxx) — straight from JESD82-513. One more sibling in the repo: SpdTest reads the ID card, PmicTest reads/burns the substation, RCDTest reads/writes the messenger.
RCDTest.efi scan # probe 0x58~0x5F, list present RCDs
RCDTest.efi read -c <ctrl> -ch <ch> -d <dimm> # read all control words RW00~RW5F
RCDTest.efi read -c <ctrl> -ch <ch> -d <dimm> -r <reg> # read one control word
RCDTest.efi write -c <ctrl> -ch <ch> -d <dimm> -r <reg> -data <8hex> # write one control word
Expected output (I have no RDIMM to hand and no GNR server, so this is the shape, not a real dump):
===== RCD Scan (addresses 0x58..0x5F) =====
DIMM 0 (0x58): RCD present (RW00=0xXXXXXXXX)
Total: 1 RCD(s) present
=====================================
===== RCD Control Words (RW00~RW5F) =====
DIMM: Controller=0 Channel=0 Dimm=0 (SMBus 0xB0, 7-bit 0x58)
RW00 = 0xXXXXXXXX (Global Features)
RW05 = 0xXXXXXXXX (DIMM Operating Speed)
...
==========================================
The RCD isn’t a PMIC-style “write register address, read/write data” device — it uses a sideband control word protocol (JESD82-513 §7.5.7/7.5.8): block-write the command and setup, then block-read back Status + a DWord. And the command byte comes in two flavors — I2C (0xC2) and I3C (0xC0); RCDTest drives I2C, so it uses 0xC2.
The RCD’s revision is readable too — it lives in the paged control word PG[3]RW6E (Vendor Revision ID) (write RW5F to pick the page, then read RW6E). Real values from a server log: IDT = Rev 1.0x33, Montage = Rev 2.0x11.
Source: github.com/peterhu/ddr5-shellkit.
The golden rule
Commands go through the amplifier, data goes straight. Miss the command and nothing boots; mangle the data and it blue-screens.
CA is the order layer, DQ is the data layer. If CA dies, every die goes deaf and the machine won’t boot; if DQ dies, the orders were heard but the cargo was dropped — it boots, but the data is wrong. And CA is the hardest to train because a whole bundle of lines has to hit the beat together, it has no doorbell, and the RCD adds skew on top.