内存容量自动识别
来自Jack's Lab
1 概述
现在内存条上皆有一个 8 针的 EEPROM 芯片(大约为 3mm x 2mm x 1.5mm)记录该内存条的一些参数信息,如工作频率,工作电压,行地址位宽,列地址位宽等等。一般称该芯片为 SPD (Serial Presence Detect) 芯片。
内存条上的 SPD 容量一般为 256 字节,使用 I2C 接口,因此要读取其中的信息,得先初始化好 I2C 总线控制器,欣慰的是 I2C 是一个很简单的总线。
2 SPD Table
一般称 256 字节的 SPD 数据位 SPD Table,其每一字节是为一个数据单位。择其要着,简述如下:
Byte 1: SPD 容量,常见的为 256B (0x08, 2^8),也有 128B (0x07, 2^7) Byte 3: 行地址位宽,0x0E (14 bits),0x0C (12 bits) Byte 4: 列地址位宽,0x0A (10 bits) Byte 5: Number of physical banks on DIMM,物理 bank 数,Module Bank 数,又称 rank 数。rank 的集合一般称为一个 module(相当于一个内存条) Byte 6: Module Width of this assembly,数据总线接口位宽,现在一般为 64 bit,ECC 的为 72 位。指的是一个 rank 的总线位宽,多个 rank 通过片选来切换,对外而言实际上就是 Module (rank 的集合)的数据位宽 Byte 7: Module Width of this assembly (high bits),数据总线接口位宽的扩展字节,用于 Byte 6 不够用的情形 Byte 11: DIMM Configuration Type,数据校验类型,有: ECC: 0x00,则 64 bit 之数据宽度还要加一个 8 bit,一共 72 bit。计算容量时要剔除这 8 bit Non ECC: 0x02 Byte 13: Primary SDRAM Width,芯片的位宽,一般为 8 bits 或 16 bits,此为单个内存颗粒 (chip) 内部 bank 的位宽,多个 bank 通过片选切换,因此亦可称其为单个 chip 的位宽。 Byte 17: Number of Banks on SDRAM Device,内存颗粒 (chip) 内部 bank 数,一般为 4
多个 bank 是为一个 chip,数据位宽为 sdram_width
多个 chip 组成一个 rank,数据位宽为 data_width
多个 rank 合为一个 Module (内存条),数据位宽仍为 data_width
因此: n_chips_per_rank = data_width / sdram_width
总 chips 数为: n_chips = n_chips_per_rank * n_ranks_per_module
每个 chips 的容量则为:chip_size = 2 ^ (n_cols + n_rows) * sdram_width * n_banks_per_chip
列地址位宽和行地址位宽是 chip 内之 bank 的参数
故内存总容量为:
memery_size = 2 ^ (n_cols + n_rows) * data_width * n_banks_per_chip * n_ranks_per_module
还有一个简化的计算方法:
Byte 31: Module Bank Density,每个 rank 的容量。其值含义为: 0x08 32 MB 0x10 64M 0x20 128MB 0x40 256MB 0x80 512MB
可以简化为 rank_density * 4MB
则另一个计算方法为:
memory_size = rank_density * 4MB * n_ranks_per_module