串行存在檢測

串行存在檢測（serial presence detect，縮寫SPD）是一種訪問記憶體模塊有關資訊的標準化方式。早期的72 pin SIMM包括五個引腳，提供5位元並行存在檢測（PPD）數據，而168 pin DIMM標準更改為串行存在檢測，以編碼更多資訊。

在普通的現代電腦開機時，它將進行一次加電自檢（POST）。自從20世紀90年代中期以來，這個過程包括自動設定當前存在的硬體。SPD是一項記憶體硬體特性，可使電腦了解存在的記憶體以及訪問記憶體要使用的時序。

部分電腦可以完全自動地適應硬體變更。在大多數情況下，有一個特殊的可選步驟可以訪問BIOS參數，得以查看並可能更改相關設定。有些電腦可以控制如何使用SPD中存儲的數據——可以選擇性的修改記憶體時序，乃至完全覆蓋（忽視）SPD數據，詳見超頻。

## 存儲的資訊

對於支持SPD的記憶體模塊，JEDEC標準要求在記憶體模塊的一個EEPROM上的低128位元組中存有特定參數。這些字節包括模塊相關的時序參數、製造商、序列號及其他實用資訊。利用記憶體的設備可以讀取該資訊來自動確定模塊的關鍵參數。例如，SDRAM模塊上的SPD數據可能提供有關CAS潛伏時間的資訊，使系統可以自動配置而無需使用者干預。

SPD EEPROM採用SMBus訪問，這是I²C協議的一個變種。這將模塊上的通信引腳數量減少到兩個：時鐘信號和數據信號。EEPROM與RAM共享接地引腳，有自己的電源引腳，並有三個額外引腳（SA0-2）來標識該槽，用於將EEPROM分配到0x50-0x57範圍內的唯一地址。通信線路不僅可以在8個記憶體模塊之間共享，同一SMBus通常也用於主板上的系統健康監控任務，例如讀取電源電壓、CPU溫度和風扇速度。

（如果沒有防寫，SPD EEPROMs也響應I²C地址0x30–0x37。一個擴展使用0x18–0x1F地址訪問可選的晶片上溫度傳感器。）

### SDR SDRAM

第一個SPD規範由JEDEC發布，並由英特爾加強，作為其PC100記憶體規範的一部分。指定的大多數值為二進碼十進數形式。最重要的半字節可以包含10到15個值，並在某些情況下可以擴展到更高。在這種情況下， 1、2、3的編碼用於編碼16,17和18。最高的0的半字節被保留表示為「未定義」。

SPD ROM定義了最多三個DRAM時序，在字節18中用設置位指定了三個CAS延遲。首先是最高的CAS延遲（最快時鐘），然後是兩個降低時鐘速度的較低的CAS延遲。

### DDR2 SDRAM

DDR2 SPD標準做了一些修改，但大致同上。一個顯著變化是刪除混亂且很少使用的有兩個不同大小Rank的DIMM支持。

時間周期欄位（字節9、23、25和49）以二進碼十進數（BCD）編碼，一些額外編碼以十分位定義，以正確表示一些常見時序：

### DDR3 SDRAM

DDR3 SDRAM標準大幅修繕，簡化了SPD內容布局。取代多個BCD編碼的納秒欄位，一些「時基」單元被規定為高精度，並且各種時序參數被編碼為基本單元的倍數。此外，根據CAS延遲指定不同時序的做法已被刪除，現在只有一組時序參數。

修訂1.1使一些參數表示為「中等時基」值加上（帶符號，-128 +127）「精細時基」校正。通常來說，中等時基為1/8 ns（125 ps），精細時基為1、2,5或5 ps。為了與缺少校正的早期版本兼容，中等時間基數通常向上取整，並且校正為負。以這種方式工作的值為：

模塊的存儲容量可以從字節4、7和8計算。模塊寬度（字節8）除以每個晶片的位數（字節7）得出每個rank的晶片數量。然後可以乘以每個晶片的容量（字節4）和模塊上晶片的Rank數量（通常為1或2，從字節7）。

## 擴展

JEDEC標準僅規定了部分SPD字節。真正關鍵的數據放在了前64個字節，而其餘部分則由製造商標定。然而，通常提供的EEPROM為256位元組。剩餘空間目前已有一些用途。

### 增強性能配置（EPP）

記憶體通常在SPD ROM中附有保守的時序建議，以確保在所有系統上基本功能運行正常。愛好者通常會花費很多時間來手動調整記憶體時序以提高速度。

增強性能配置文件是一項SPD擴展，由Nvidia和Corsair開發，其中包含使DDR2 SDRAM以更高性能運行的額外資訊，例如JEDEC SPD規範中不包括的供電電壓和命令時序資訊。EPP資訊存儲在同一個EEPROM中，不過字節在99-127，屬於DDR2 SPD標準中的未使用區域。

這些參數專為nForce 5、nForce 6和nForce 7晶片組上的記憶體控制器設計。Nvidia鼓勵在BIOS為其高端主板晶片組支持EPP。此能旨在提供「一鍵超頻」，以最小的努力取得更佳性能。

Nvidia為性能和穩定性得到認證的EPP記憶體提供的名稱是「SLI-Ready 記憶體」。術語「SLI-Ready 記憶體」引起了一些混亂，因為這與NVIDIA SLI無關。使用者可以使用單個影片卡（哪怕非Nvidia卡）搭配EPP/SLI記憶體，也可以在沒有EPP/SLI記憶體的情況下運行多卡SLI影片配置。

其擴展版本EPP 2.0則支持DDR3記憶體。

### Extreme Memory Profile（XMP）

與之類似的是，英特爾為DDR3 SDRAM DIMM開發了一個JEDEC SPD擴展。它使用JEDEC未分配的字節176-255來編碼更高性能的記憶體時序。中文也稱「擴展記憶體配置」

頭部包含的數據中最重要的是「中等時基」值MTB，它是一個合理的納秒（常用值為1/8、1/12和1/16 納秒）。之後的許多時序值都以整數個MTB單位表示。

頭部還包括該配置文件旨在支持的每個記憶體通道的DIMM數量；更多的DIMM可能無法正常工作。

AMD也開發了一個SPD擴充集名為AMP，功用與XMP一樣。

### 供應商指定記憶體

一種常見的濫用是將資訊寫入某些記憶體區域，以將特定供應商的記憶體模塊綁定到特定系統。已知富士通技術解決方案有這樣做。向系統添加不同的記憶體模塊通常會導致拒絕運行或其他反制措施（例如每次啟動時需按F1）。

```
02 0E 00 01-00 00 00 EF-02 03 19 4D-BC 47 C3 46 ...........M.G.F
53 43 00 04-EF 4F 8D 1F-00 01 70 00-01 03 C1 CF SC...O....p.....
```

這是一個美光科技512 MB記憶體模塊的輸出，它的品牌是富士通西門子，注意「FSC」字串。該系統BIOS拒絕從偏移128h開始沒有此資訊的記憶體模塊。

## 讀取和寫入SPD資訊

記憶體模塊製造商會將SPD資訊寫入模塊上的EEPROM。主板BIOS則讀取SPD資訊來配置記憶體控制器。在大多數（但不是所有）主板晶片組中，存在多個能讀取和修改SPD資訊的程序。

- dmidecode程序可以解碼記憶體（及其他）有關資訊，可以在Linux、FreeBSD、NetBSD、OpenBSD、BeOS、Cygwin和Solaris上運行。dmidecode不直接訪問SPD資訊；它會報告有關記憶體的BIOS數據。此資訊可能受限或不正確。
- 在Linux系統上，使用者空間程序decode-dimms可以以i2c-tools解碼和印出電腦中任何有SPD資訊的記憶體資訊。它需要內核中支持SMBus控制器、EEPROM內核驅動，並且SPD EEPROM已連接到SMBus。在舊的Linux發行版上，decode-dimms.pl作為lm_sensors的一部分可用。
- OpenBSD自4.3版本起包含驅動程序 spdmem(4)來提供有關記憶體模塊的資訊。該驅動程序從NetBSD移植（自5.0版本可用）。
- Coreboot讀取和使用SPD資訊來初始電腦中的所有記憶體控制器的時序、大小及其他屬性。
- Windows上使用如HWiNFO32、CPU-Z或Speccy軟體可以讀取和顯示SPD中的DRAM模塊資訊。

使用eeprom編程器硬體和軟體直接訪問記憶體的EEPROM，可以直接讀寫SPD資訊，而無需關心晶片組。

對於舊筆記型電腦來說，一種不太常見的用法是通用的SMBus讀取器，因為BIOS可以在讀取後禁用模塊上的內部EEPROM，因此總線基本上可以使用。所用方法是將A0、A1線拉低，使內部存儲器關閉，從而允許外部設備訪問SMBus。完成此操作後，定製的Linux版本或DOS應用程式就可以訪問外部設備。這樣做的一個常見目的是從LCD面板的記憶體晶片中恢復數據，將通用面板改裝為筆記型電腦專用。

## 在舊設備

部分較舊的設備必需使用具有並行存在檢測（常稱為簡單存在檢測，或縮寫PD）的SIMM。這些設備中部分使用非標準的PD編碼，尤其是如IBM電腦、惠普LaserJet，及其他一些印表機。

## 外部連結

- Serial Presence Detect Standard, General Standard
- SPD Rev1.0 for DDR SDRAM
- SPD Rev1.2 for DDR2 SDRAM
- SPD Rev1.3 for DDR2 SDRAM
- SPECIALITY DDR2-1066 SDRAM
- Linux軟體包 i2c-tools
- Instructions on how to use lm-sensors or i2c-tools to read the data
- Memory Performance: 16GB DDR3-1333 to DDR3-2400 on Ivy Bridge IGP with G.Skill – explanation of various timing values