大内密探 · 案卷 0.3:PMIC是内存条的配电站

前面查了户口本、身份证。这一次咱们物业大队查查条子他们家的电?

奶牛要吃草,内存得吃电!DDR4的那个朝代,电是主板直供,电不稳就是板子的锅。到了DDR5,大人,时代不同了,规矩也得跟着变;板子只送一路 5V 总电,其余它不管,内存条要啥你自己动。内存条被逼无奈整了个PMIC(Power Management IC,电源管理芯片),来给自己配电,毕竟自己动手丰衣足食。主板送进来一路 5V 主电外加一路 3.3V 给配电站自己管理用,PMIC在条子上变出另外三路核心电压:

电压 数值 管什么 像什么
VDD 1.1V 存储阵列 + 颗粒内部逻辑 楼里的照明电
VDDQ 1.1V 数据接口 DQ/DQS 大门和电梯的电
VPP 1.8V 行激活的加压泵 地下室的水泵电

注意VDD和VDDQ数值都是1.1V,但是它们可不是一回事,而是各司其职,各扫门前雪。就像房间的灯泡和电梯都是 220V,电梯挂了,灯泡可不会灭。

VPP是DDR5的新玩意,DDR5读数据前得先激活一行,把字线电压泵到比VDD更高才能可靠打开存储单元,这个泵要单独一路 1.8V 供着。

一定要注意这个天坑:压眼图的是 VDDQ而不是VDD

眼图画的是DQ数据被DQS选通信号采样的画面。DQ和DQS都是接口引脚是VDDQ供的电。

所以当VDDQ 纹波大直接压眼图,眼图纵向被压、上下抖。

VDD不稳时颗粒内部逻辑晕头转向,读写都错,但是它不直接压眼图。

两者都能搞挂训练,但压数据眼图的那路电叫 VDDQ,不是 VDD。

条子为啥非要整PMIC?

其实也是无奈之举,因为DDR5频率更高、颗粒更多,需要的电流更大、电压轨更多更精------VDD 1.1V 核心、VDDQ 1.1V IO、VPP 1.8V 行激活泵。而板子供电根本就做不到这么细、这么大、这么多!

更关键的是PMIC离芯片近,供电更强。就像老式筒子楼是水厂管子直接接到每家每户,线路太长,等水送到家,水压早衰减了;新建的商品房那是每栋楼楼顶整上了二次加压泵站,离每户就又近水压又足。

配电站在哪里?怎么找到它?

DDR5的身份证SPD,不只是一颗存1024字节的EEPROM,它还是个Hub枢纽,JEDEC 型号 SPD5108 / SPD5118(JESD300-5)。

一根条子好比一栋楼,颗粒是住户,PMIC 是配电站、RCD 是扩音器、温度传感器是温度计,都是楼里的管理员。物业想找配电站问电压、找温度计问温度,得先找前台,让它再转接给楼里的各个管理员,要是一个个的找那还不得累死了,SPD Hub 就是那个前台。

所以Hub的主业是存身份证,内置温度计,还顺带记着整栋楼的邻居户口本,包括楼里配电站、温度计是谁家产的,SPD bytes 194~221小本本里都记着账呢。

副业就是当前台,把主机的一条总线,桥接成本地的一条总线。PMIC、RCD、温度传感器全挂在这条本地总线上,主机要跟它们说话,都得找Hub这个中间商。为啥子?JESD300-5 §1 原话:Hub 的作用是「isolation of a local bus from a Controller host bus」把本地总线和主机总线隔离开。说人话就是做好隔离,临时工出事不能牵扯到物业。

  • 隔离:本地器件出问题,不拖累主机总线;主机也不用管本地每个器件的细枝末节。
  • 转接:一条主机总线能带 8 根条子(8 个 Hub,地址 0x50~0x57),每根条子的本地总线各管各的,互不干扰。

配电站有三路电、一堆寄存器,那物业要找它,要先知道它的门牌号(JESD300-5 Table 5):

门牌号是7位,高4位表明你是哪个?低3位表示你在哪里混。

  • 高4位LID Local Device ID代表器件类型:PMIC = 1001,RCD = 1011,温度传感器 = 0010 / 0110
  • 低3位HID Host ID 代表条子槽号:000~111 = DIMM 0 ~ 7

注意HID有俩别搞混了,一个是前台SPD Hub自己的HID,靠 HSA 引脚电阻定死,决定它的地址 0x50~0x57;一个是配电站的 HID,默认 111,这个可以改。

所以PMIC的地址不是固定的,而是一根一个:

DIMM 槽 0 1 2 3 4 5 6 7
PMIC 地址 0x48 0x49 0x4A 0x4B 0x4C 0x4D 0x4E 0x4F

0x4F = 1001 111 = PMIC + DIMM 7。

注意每根条子的PMIC在本地都叫0x4F,低3位HID是前台Hub来处理的。当物业要找1001 + 槽号,每根条子的Hub拿槽号跟自己对,命中的那根把本地地址的低 3 位改写成 111,于是只有它的PMIC答应;没命中的装没听见(JESD300-5 §2.6.6)。

注意上面这些 0x48~0x4F 是7位地址,真发到 SMBus 线上,地址得左移 1 位、最低位塞 1 位读写方向,凑成 8 位。比如0x48变成0x90、SPD的0x50 变成 0xA0。所以看到代码里PMIC 用 0x90而不是 0x48先别嚷嚷,都没错。同一个地址两种写法:7 位是身份证号,8 位是线上字节。

注意PMIC有可能使用I2C也有可能使用I3C。虽然I3C 有动态地址分配叫ENTDAA,host 现场发个新地址给器件。但 DDR5故意没用这套而是改用 SETAASA(Set All Addresses via Static Address,保留静态地址)。所以不管 I2C 还是 I3C,配电站的门牌号都是静态的 0x48~0x4F,从头到尾没变过。

注意SMBus和I2C是一家,SMBus是I2C的加严子集,I3C 是升级版、向后兼容。所以配电站上电默认 I2C 模式时,老SMBus能直接读;但是一旦被切进 I3C 模式,数据段换推挽+T 位,老SMBus就搞不定了。所以读它之前,先看它在哪个模式。

想自己动手玩玩PMIC?

我写了个跑在 UEFI Shell 里的工具 PmicTest,照 JEDEC 公开规范(JESD301-1 + JESD300-5)通过SMBus穿SPD Hub直接访问配电站,解锁读回NVM里的出厂配置、还能烧录。跟0.2的SpdTest是同一个 repo 里的兄弟:SpdTest 读身份证,PmicTest 整配电站。

用法三条命令:

复制代码
PmicTest.efi scan                                       # 扫 0x48~0x4F,列出在位的配电站
PmicTest.efi read -c <ctrl> -ch <ch> -d <dimm>          # 读回 R40~R6F + 解码电压
PmicTest.efi burn -c <ctrl> -ch <ch> -d <dimm> -b <blk> -data <32hex>  # 烧一个 block

scan 和 read 输出长这样:

复制代码
===== PMIC Scan (addresses 0x48..0x4F) =====
  DIMM 0 (0x48): PMIC present, hub mode=I2C
  DIMM 2 (0x4A): PMIC present, hub mode=I2C
  Total: 2 PMIC(s) present
=====================================

===== PMIC Vendor Region (R40~R6F, 48 bytes) =====
  DIMM: Controller=0 Channel=0 Dimm=0  (SMBus 0x90, 7-bit 0x48)
  Hub mode       : I2C
89 D9 00 00 00 78 63 00 00 78 63 78 63 80 88 00
CF 42 00 00 00 00 00 00 D2 DA 00 00 00 20 22 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  Voltage (decoded):
    VDD  (R45, SWA) : 1100 mV
    VDDQ (R49, SWC) : 1100 mV
    VPP  (R4B, SWD) : 1800 mV
===================================================

hub mode=I2C说明PMIC没切到I3C,配电站一直待在默认的I2C 模式所以SMBus直接就能读写。

源码在 github.com/peterhu/ddr5-shellkit

配电站有些啥?它是怎么工作的?

PMIC有自己的寄存器和脑子。MRC 开机第一件事不是训练,是先教配电站怎么干活。

① 上电时序:三路电不能同时上,有先后和间隔。但这顺序不是 JEDEC 写死的是厂商烧在 NVM 里的(R40~R43),不同厂可以不一样。我实测手上这根条子是 VPP 先上,R40 只开 VPP等 2ms,再 VDD+VDDQ 一起上R41。顺序错、间隔错,颗粒起不来,甚至伤颗粒。

② CAMP 信号:所有 DIMM 的 PMIC 用一根 CAMP 信号线串起来。谁上电失败谁就把这根线拉低;主机一看线还是低的就知道至少有一根条子的配电站没起来。然后挨个盘问每颗 PMIC 的状态寄存器,揪出那颗没起来的,把它 map out掉(JESD301 §2.13.1)。

③ 出厂记忆:NVM 里的三个 block

前面说的教全是每次上电现教,写进易失寄存器,掉电就忘。但 PMIC 还有一份掉电不忘的独家的记忆,存在它自己的 NVM 里,一共 3 个block、每个 16 字节、48 个字节:

block 寄存器 刻着啥
Block 40 R40~R4F 上电时序、各路电压/阈值、模式/开关频率
Block 50 R50~R5F 限流告警阈值、下电时序、软启动
Block 60 R60~R6F 保留

翻译成人话:Block 40 管它怎么醒(上电顺序、电压多少),Block 50 管它运行中怎么自保、收工怎么下电,Block 60 空着。

这3个block是按功能分区的三段配置上电、运行保护 + 下电、保留。编程是 block 级的,可以只烧 Block 40、不动 50/60(JESD301 §3.3.3)。

Block 40 里的电压就是 VDD/VDDQ/VPP 的出厂默认值

PMIC 的电压存了两份拷贝:NVM 份(Block 40 里的 R45/R47/R49/R4B)掉电不忘,是烧进去的出厂默认电压。运行份(R21/R23/R25/R27):易失,就是配电站现在真实用的电压。改电压改的是运行份重启就没;要永久生效得烧 NVM 份。

NVM(Block 40) 稳压器 对应轨 运行副本
R45 SWA VDD R21
R47 SWB VXX(第 4 路) R23
R49 SWC VDDQ R25
R4B SWD VPP R27

SWB的VXX是第 4 路开关稳压器,普通条子闲置不用;高密度条子上它跟 SWA 拼成双相 SWAB,给 VDD 供更大电流。

注意R45/R49/R4B 三个电压寄存器,VDD/VDDQ 的基准是 800mV,VPP 的基准是 1500mV。实测这三路寄存器里都写着 0x78,解出来却是 1.1V、1.1V、1.8V 三个不同电压。别拿一套基准解三路,VPP 会被解错成 1.1V。

注意上电的真相:PMIC 自己把 NVM 里的默认电压抄到运行寄存器里,先照默认档把三路电开起来(spec 原话 "at first power on, this register is automatically configured identically"------JESD301 Table 123 NOTE 1);之后 MRC 要超频,再在运行份上临时改,那个改掉电就没了,下次上电又回到 NVM 默认。DIMM厂商区R40~R6F默认锁死,要写要烧得先报密码,出厂默认 0x9473。

烧一页的流程:报密码 → 解锁 → 写 16 字节 → 下烧录命令(Block 40 用 0x81、Block 50 用 0x82、Block 60 用 0x85)→ 读回 0x5A 确认烧完 → 上锁(JESD301 §3.3.3,Table 146)。

地板 vs 画线

训练是在调"时间"和"电压"找最稳的采样点,而这一切都建立在一个假设上------供电这块"地板"是平的、稳的。

地板一抖,你画再直的线都白搭。

假设一根 DIMM,三个 phase 全报错:

复制代码
[Write Leveling]  TxDQS Delay ... more than ... failed
[Receive Enable]  Unable to find round trip latency
[2D Centering]    RxPerBitDeskew eye width is too small

等等------真实 log 里你根本看不到这一幕,因为第一个 phase 失败就被 map out 了,后面两个轮不到它跑。所以「三阶段一起挂」只存在于假设里。

一根条子能横跨三个互不相干的 phase 一起挂,问题还可能在哪个 phase 里?

答案只能是不在任何一个 phase 里,在它们共享的那一层------供电、时钟、温度,或者条子本身。三个候选,排第一的是 PMIC 供电不足:电压一低,所有信号边沿一起变慢。

供电 vs 走线:一眼嗅出是谁的锅

怎么分清这是供电问题不是走线问题?看失败的范围和一致性:

问题 特征
供电 全局 + 随机:所有 lane 都薄一点,而且每次重训最薄的位置还不一样
走线/颗粒 局部 + 固定:某个 bit/lane 固定薄,位置不变

一句话走线的问题长在某条线上,供电的问题长在整个电压平面上。

供电是地板,训练是画线。地板一抖,线画再直也白搭。

训练失败,别急着调参数,先看看地板平不平。供电问题长在整个电压平面上全局 + 随机;走线问题长在某条线上局部 + 固定。

相关推荐
思尔芯S2C1 个月前
思尔芯RCF RTL自动分割工具,助力大规模AI/HPC芯片原型验证
人工智能·fpga开发·内存模型·自动编译·ddr5·prototyping·原型验证
思尔芯S2C4 个月前
FPGA原型验证中的内存模型应用:基于DDR5的Linux系统启动与测试
fpga开发·内存模型·ddr4·ddr5·memory model·hbm3·prototyping
brave and determined1 年前
硬件-内存学习DAY20——GDDR6革命:显存技术如何重塑游戏与AI未来
嵌入式硬件·ddr·ddr4·ddr5·ddr6·内存原理·内存技术
千歌叹尽执夏1 年前
Quartus25.3:Agilex5A EMIF学习调用(DDR5)
fpga开发·1024程序员节·ddr5·agilex5·emif
chenlance1 年前
PCIE4.0/5.0/DDR4/DDR5使用以及布局布线规则-集萃
serdes·ddr4·ddr5·pcie4.0·pcie5.0
Tipriest_1 年前
如何判断自己的电脑或主机是否支持DDR5内存?
电脑·内存·ddr4·ddr5·主机检测工具
芯片SIPI设计2 年前
DDR5 Channel SI设计的挑战
信号完整性·ddr5
m0_290320272 年前
[深入理解DDR5] 2-1 封装与引脚
内存·ddr5
网易独家音乐人Mike Zhou3 年前
【TI毫米波雷达】上电时序、串口回环BUG及SOP模式不正常工作的解决方案(LP87524电源PMIC芯片的BUCK供电时序配置)
单片机·物联网·嵌入式·iot·电源·毫米波雷达·pmic