Hamming Code
๊ฐ์
Hamming Code๋ ๋ฐ์ดํฐ์ ์ฌ๋ฌ ๊ฐ์ parity bit๋ฅผ ์ฝ์ ํ๊ณ , ๊ฐ parity๊ฐ ์๋ก ๋ค๋ฅธ ์์น ์งํฉ์ ๊ฒ์ฌํ๋๋ก ๋ง๋ binary linear block code์ ๋๋ค. ์์ ์ธก์ parity ๊ฒ์ฌ ๊ฒฐ๊ณผ๋ฅผ syndrome์ผ๋ก ๋ฌถ์ด ์ค๋ฅ๊ฐ ๋ bit์ ์์น๋ฅผ ๊ณ์ฐํ ์ ์์ต๋๋ค. ์ผ๋ฐ Hamming code์ ์ต์ ๊ฑฐ๋ฆฌ๋ 3์ด๋ฏ๋ก single-bit error๋ฅผ ์ ์ ํ๊ณ double-bit error๋ฅผ ๊ฒ์ถํ ์ ์์ง๋ง, ์ ์ ์ ์ํํ๋ decoder๊ฐ double-bit error๋ฅผ ํญ์ ๊ตฌ๋ถํ ์๋ ์์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ ์์คํ ์์๋ Hamming code์ ์ ์ฒด parity bit๋ฅผ ํ๋ ๋ํ extended Hamming code๊ฐ ๋๋ฆฌ ์๋ ค์ง SECDED(Single-Error Correction, Double-Error Detection) ๋ชจ๋ธ์ ์ด๋ฃน๋๋ค. ์๋ฅผ ๋ค์ด 64-bit data word์ 7๊ฐ์ ์์น parity์ 1๊ฐ์ overall parity๋ฅผ ๋ํ๋ฉด 72-bit codeword๊ฐ ๋๋ฉฐ, ์ด๋ ์ ํต์ ์ธ ECC DIMM์ 64+8 ๊ตฌ์ฑ๊ณผ ์ฐ๊ฒฐ๋ฉ๋๋ค. ๋ค๋ง ์ค์ ์๋ฒ controller๋ Hamming๊ณผ ๋๋ฑํ ํ์ฅ ์ฝ๋, Hsiao Code, symbol-based ECC ๋ฑ์ ์ ํํ ์ ์์ผ๋ฏ๋ก "ECC DIMM = ํญ์ ๋์ผํ Hamming ํ๋ ฌ"๋ก ํด์ํ๋ฉด ์ ๋ฉ๋๋ค.
๊ทธ๋ฆผ 1. Hamming(7,4)์ ์์น parity์ overall parity๋ฅผ extended codeword๋ก ํ์ฅํ ์์
๋๋ค. ์์น parity์ ๊ฒ์ฌ ๊ฒฐ๊ณผ๋ syndrome์ ๋ง๋ค๊ณ , overall parity๋ single-bit์ double-bit ์ค๋ฅ๋ฅผ ๊ตฌ๋ถํ๋ ์ถ๊ฐ ์ ๋ณด๊ฐ ๋ฉ๋๋ค.
ํต์ฌ ๊ฐ๋
์ฝ๋ ํ๋ผ๋ฏธํฐ์ Hamming distance
[n, k, d] ํ๊ธฐ์์ n์ codeword ์ ์ฒด bit ์, k๋ data bit ์, d๋ codeword ์ฌ์ด์ ์ต์ Hamming distance์
๋๋ค. parity bit๊ฐ r๊ฐ์ผ ๋ ์์์ single-bit error ์์น์ no-error ์ํ๋ฅผ ๊ตฌ๋ณํ๋ ค๋ฉด ๋ค์ ์กฐ๊ฑด์ด ํ์ํฉ๋๋ค.
2^r >= k + r + 1
์ผ๋ฐ์ ์ธ ์์ Hamming code๋ n = 2^r - 1, k = 2^r - r - 1, d = 3์ธ ํํ์
๋๋ค. ์ฌ๊ธฐ์ codeword ์ ์ฒด๋ฅผ ํ ๋ฒ ๋ ๊ฒ์ฌํ๋ overall parity bit๋ฅผ ์ถ๊ฐํ๋ฉด ์ต์ ๊ฑฐ๋ฆฌ๊ฐ 4๊ฐ ๋์ด extended Hamming code๊ฐ ๋ฉ๋๋ค.
| ๊ตฌ์ฑ | data k |
์์น parity r |
overall parity | ์ ์ฒด n |
์ต์ ๊ฑฐ๋ฆฌ | ๋ณด์ฅ ๋ฒ์ |
|---|---|---|---|---|---|---|
| Hamming(7,4) | 4 | 3 | ์์ | 7 | 3 | 1-bit ์ ์ , 2-bit ๊ฒ์ถ ๋๋ ์ ์ ํ์ง ์๋ ๊ฒ์ถ |
| Extended Hamming(8,4) | 4 | 3 | 1 | 8 | 4 | 1-bit ์ ์ , 2-bit ๊ฒ์ถ |
| ECC word ์์ | 32 | 6 | 1 | 39 | 4 | SECDED |
| ECC word ์์ | 64 | 7 | 1 | 72 | 4 | SECDED |
์ต์ ๊ฑฐ๋ฆฌ 4๋ ๋ bit ์ค๋ฅ์ ํ bit ์ค๋ฅ๋ฅผ decoder๊ฐ ๊ตฌ๋ถํ ์ ์๊ฒ ํด ์ค๋๋ค. ๋จ, ์ธ bit ์ด์ ์ค๋ฅ๊น์ง ํญ์ ๊ฒ์ถํ๊ฑฐ๋ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ ํ๋ค๋ ๋ป์ ์๋๋๋ค. ์ผ๋ถ ์ธ bit ์ค๋ฅ๋ single-bit ์ค๋ฅ์ฒ๋ผ ๋ณด์ผ ์ ์์ผ๋ฏ๋ก, SECDED์ ๋ณด์ฅ ๋ฒ์๋ฅผ ๋์ด์๋ ์ค๋ฅ ๋ชจ๋ธ์๋ ๋ณ๋ code๋ retry ์ ์ฑ ์ด ํ์ํฉ๋๋ค.
์์น parity์ ๊ฒ์ฌ ๋ฒ์
bit ์์น๋ฅผ 1๋ถํฐ ์ธ๊ณ , 2์ ๊ฑฐ๋ญ์ ๊ณฑ์ธ ์์น๋ฅผ parity bit๋ก ์์ฝํฉ๋๋ค. ๋ฐ๋ผ์ Hamming(7,4)์ ๋ฐฐ์น๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์์น 1 2 3 4 5 6 7
๋ด์ฉ p1 p2 d1 p4 d2 d3 d4
์ด์ง ์์น 001 010 011 100 101 110 111
๊ฐ parity bit๋ ์์ ์ ์์น bit๊ฐ 1์ธ ๋ชจ๋ ์์น๋ฅผ ๊ฒ์ฌํฉ๋๋ค.
| parity | ๊ฒ์ฌ ์์น | ์๋ฏธ |
|---|---|---|
p1 |
1, 3, 5, 7 | ์์น ์ด์ง ํํ์ ์ตํ์ bit๊ฐ 1 |
p2 |
2, 3, 6, 7 | ์์น ์ด์ง ํํ์ ๋ ๋ฒ์งธ bit๊ฐ 1 |
p4 |
4, 5, 6, 7 | ์์น ์ด์ง ํํ์ ์ธ ๋ฒ์งธ bit๊ฐ 1 |
p0 |
1~7 ๋ฐ p0 |
codeword ์ ์ฒด์ overall parity |
์ด ๋ฐฐ์น์์๋ ๊ฐ codeword bit๊ฐ ๊ณ ์ ํ parity ์กฐํฉ์ ์ฐธ์ฌํฉ๋๋ค. ๋ฐ๋ผ์ ๊ฒ์ฌ ์คํจ๊ฐ p1๊ณผ p4์์ ๋ฐ์ํ๋ฉด 1 + 4 = 5๋ก bit 5๋ฅผ ๊ฐ๋ฆฌํค๋ ์์ผ๋ก ์ค๋ฅ ์์น๋ฅผ ์ซ์๋ก ๋ณต์ํ ์ ์์ต๋๋ค. ์ค์ ๊ตฌํ์์๋ ์ด ๊ณผ์ ์ parity-check matrix H์ XOR ๋คํธ์ํฌ๋ก ํํํฉ๋๋ค.
ํจ๋ฆฌํฐ ๋ฐฉ์๊ณผ ํ๋ ฌ
์ด ๋ฌธ์์ ์๋ even parity๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฐ ๊ฒ์ฌ ์งํฉ์ 1์ ๊ฐ์๊ฐ ์ง์๊ฐ ๋๋๋ก parity bit๋ฅผ ์ค์ ํ๋ฉฐ, odd parity๋ฅผ ์ฌ์ฉํด๋ encoder์ decoder๊ฐ ๊ฐ์ ๊ท์น์ ๋ฐ๋ฅด๋ฉด ๊ธฐ๋ฅ์ ๋์ผํฉ๋๋ค.
์์ vector๋ฅผ r์ด๋ผ ํ ๋ syndrome์ ๋ค์์ฒ๋ผ ๊ณ์ฐํฉ๋๋ค.
s = H * r^T (์ฐ์ฐ์ GF(2), ์ฆ XOR)
์ ์ codeword๋ s = 0์
๋๋ค. ํ bit ์ค๋ฅ๊ฐ ์์น i์์ ๋ฐ์ํ๋ฉด syndrome์ parity-check matrix์ i๋ฒ์งธ ์ด์ด ๋๋ฉฐ, ํ์ค ์์น ๋ฐฐ์น์์๋ ๊ทธ ์ด์ ์์น i์ ์ด์ง ํํ์ผ๋ก ์ฝ์ ์ ์์ต๋๋ค. ๋ ๊ฐ ์ด์์ ์ค๋ฅ์์๋ ์ฌ๋ฌ ์ด์ XOR๊ฐ ๋๋ฏ๋ก single-bit ์์น๋ก ๋จ์ ํ๋ฉด ์ ๋ฉ๋๋ค.
Systematic form์์๋ data์ parity๋ฅผ ๋๋์ด ๋ค์์ฒ๋ผ ํํํ ์ ์์ต๋๋ค.
H = [ A | I_r ]
P = A * D^T
A๋ data bit๊ฐ ๊ฐ parity ์์ ์ฐธ์ฌํ๋ ์ฐ๊ฒฐ์ ๋ํ๋ด๊ณ I_r์ parity bit ์์ ์ ๊ฒ์ฌํ๋ ํญ์
๋๋ค. Hamming์ ํ์ค ์์น ๋ฐฐ์น๋ ์ค๋ช
๊ณผ ์์ฑ์ด ์ฝ๊ณ , Hsiao Code๋ ๊ฐ์ SECDED ๋ชฉํ๋ฅผ ๋ ๋ฎ์ XOR ์ฐ๊ฒฐ ์์ ๊ท ํ ์กํ ํ๋ ฌ๋ก ๊ตฌํํ๋ ค๋ ๋ณํ์
๋๋ค.
Syndrome๊ณผ ์ค๋ฅ ๋ชจ๋ธ
syndrome์ ์ค๋ฅ๊ฐ ์๋ค๋ ์ฌ์ค๋ณด๋ค ์ค๋ฅ ์์น๋ฅผ ํํํ๋ ์ ๋ณด์ ๋๋ค. ๋ค๋ง syndrome๋ง์ผ๋ก๋ ์ค๋ฅ ๊ฐ์๊ฐ single์ธ์ง double์ธ์ง ์ ์ ์๊ธฐ ๋๋ฌธ์ extended Hamming์์๋ overall parity ๊ฒฐ๊ณผ๋ฅผ ํจ๊ป ์ฌ์ฉํฉ๋๋ค.
positional syndrome S |
overall parity P0 |
SECDED ํด์ | ์ฒ๋ฆฌ |
|---|---|---|---|
| 0 | 0 | ์ค๋ฅ ์์ | data ํต๊ณผ |
| 0์ด ์๋ | 1 | 1-bit ์ค๋ฅ๊ฐ ์์น parity/data ์์น์ ์์ | S ์์น์ bit ๋ฐ์ , CE ๊ธฐ๋ก |
| 0 | 1 | overall parity bit ์์ฒด์ ์ค๋ฅ | p0 ๋ฐ์ , data ํต๊ณผ |
| 0์ด ์๋ | 0 | 2-bit ์ค๋ฅ์ ์ ์ ๋ถ๊ฐ ํจํด | ์ ์ ํ์ง ์๊ณ UE/UCE ์ฒ๋ฆฌ |
์ด ํ๋ ์ต๋ ๋ bit ์ค๋ฅ๋ผ๋ ๊ฐ์ ์์์ SECDED ํ์ ํ์
๋๋ค. S != 0, P0 = 0์ ๋ชจ๋ ๋ค์ค ์ค๋ฅ์ ์ ํํ ์ง๋จ์ผ๋ก ํ๋ํ๋ฉด ์ ๋๋ฉฐ, ์ธ bit ์ด์ ์ค๋ฅ์ ๋ํด์๋ miscorrection ๊ฐ๋ฅ์ฑ์ด ๋จ์ต๋๋ค.
๋น๊ต/๋ถ์
ECC ๋ฐฉ์ ๋น๊ต
| ๋ฐฉ์ | ๊ธฐ๋ณธ ์ค๋ฅ ๋จ์ | ๋ํ ๊ธฐ๋ฅ | ์ฅ์ | ํ๊ณ | ๋ฉ๋ชจ๋ฆฌ ์ญํ |
|---|---|---|---|---|---|
| ๋จ์ parity | bit | ์ค๋ฅ ๊ฒ์ถ | ๊ฐ์ฅ ๋ฎ์ ๋น์ฉ | ์์น๋ฅผ ์ฐพ๊ฑฐ๋ ์ ์ ํ์ง ๋ชปํจ | command/address ๋๋ link ๊ฒ์ฌ ์ผ๋ถ |
| Hamming(7,4) | bit | 1-bit ์ ์ , 2-bit ๊ฒ์ถ | ์งง์ XOR ๊ฒฝ๋ก, ์ค๋ช ์ด ์ฌ์ | double-bit๋ฅผ single-bit์ ๊ตฌ๋ถํ์ง ๋ชปํ ์ ์์ | ์ํ ECC, ์ด๋ก ์ ๊ธฐ๋ณธ ๋ชจ๋ธ |
| Extended Hamming SECDED | bit | 1-bit ์ ์ , 2-bit ๊ฒ์ถ | overall parity๋ก ์ค๋ฅ ๋ถ๋ฅ | chip failure์ ๋ค์ค ์ค๋ฅ์ ์ฝํจ | 64+8 ์ธ๋ถ ECC์ ๊ธฐ๋ณธ ๋ชจ๋ธ |
| Hsiao SECDED | bit | SECDED | XOR fan-in, ๋ฐฐ์ ๊ณผ ์ง์ฐ ์ต์ ํ ์ฌ์ง | ๋ณด์ฅ ๋ฒ์๋ SECDED์ ๋์ผ | ๋ฉ๋ชจ๋ฆฌ controller ๊ตฌํ ์ ํ |
| Reed-Solomon | symbol | symbol ์ค๋ฅ์ erasure ์ ์ | burst์ device ๋จ์ ์ค๋ฅ์ ๊ฐํจ | GF ์ฐ์ฐ๊ณผ decoder๊ฐ ๋ณต์กํจ | symbol-based ECC, Chipkill ์ค๊ณ |
| BCH/LDPC | bit ๋๋ soft information | ๋ค์ค ์ค๋ฅ ์ ์ | ๋์ ์ค๋ฅ์จ ์ฑ๋์ ๊ฐํจ | ํฐ decoder์ latency | NAND ๋ฐ ๊ณ ์ค๋ฅ ์ ์ฅ ์ฑ๋ |
Hamming๊ณผ Hsiao์ ์ฐจ์ด
Hamming code์ Hsiao Code๋ ๋ชจ๋ SECDED์ ์ํ์ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ ์ ์์ง๋ง parity-check matrix๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ด ๋ค๋ฆ ๋๋ค. ํ์ค Hamming์ ์์น์ ์ด์ง ํํ์ ์ด๋ก ์ฌ์ฉํ๋ฏ๋ก ๊ท์น์ฑ์ด ์ข์ต๋๋ค. Hsiao๋ ์๋ก ๋ค๋ฅธ odd-weight ์ด์ ์ ํํด ๊ฐ์ data ํญ์์ XOR ์ฐ๊ฒฐ ์์ fan-in์ ์ค์ด๋ ๋ฐฉํฅ์ ์ทจํฉ๋๋ค.
| ํญ๋ชฉ | ํ์ค ์์น Hamming | Hsiao Code |
|---|---|---|
| ์ด ๊ตฌ์ฑ | bit ์์น์ ์ด์ง ํํ | ์๋ก ๋ค๋ฅธ odd-weight vector |
| SECDED ๊ธฐ๋ฅ | ๊ฐ๋ฅ | ๊ฐ๋ฅ |
| ์ค๊ณ ๋ชฉํ | ๋จ์ํ ์์ฑยท์ค๋ช | ํ๋์จ์ด ์ฐ๊ฒฐ๊ณผ ์ง์ฐ ์ต์ ํ |
| ์ค๋ฅ ์ ์ ๋ฒ์ | 1-bit ์ ์ , 2-bit ๊ฒ์ถ | ๋์ผํ ๊ธฐ๋ณธ ๋ณด์ฅ |
| ์ฃผ์์ | parity ์์ fan-in์ด ์ปค์ง ์ ์์ | ํ๋ ฌ ์์ยทrow balanceยท๋ฌผ๋ฆฌ ๋งคํ ๊ฒ์ฆ ํ์ |
Hsiao์ ์์ธ ํ๋ ฌ ์ ํ์ Hsiao Code ๋ฌธ์์์ ๋ค๋ฃน๋๋ค. Hsiao๋ก ๋ฐ๊พผ๋ค๊ณ chip-level failure๋ burst error๊ฐ ์๋์ผ๋ก ์ ์ ๋๋ ๊ฒ์ ์๋๋ฉฐ, ์ด๋ฐ ์ค๋ฅ์๋ symbol mapping๊ณผ ๋ ๊ฐํ code๊ฐ ํ์ํฉ๋๋ค.
DRAM ECC ๊ณ์ธต ๋น๊ต
| ๊ณ์ธต | ๋ณดํธ ๋์ | ECC ์์น | controller ๊ด์ฐฐ์ฑ | Hamming๊ณผ์ ๊ด๊ณ |
|---|---|---|---|---|
| ์ธ๋ถ side-band ECC | controller-DIMM ๋ฐ์ดํฐ ๋ฐ DRAM ์ ์ก ๋จ์ | memory controller์ ๋ณ๋ ECC device | CE/UE์ syndrome ๋ณด๊ณ ๊ฐ๋ฅ | 64+8 SECDED์ ๋ํ ์ ์ฉ |
| DRAM on-die ECC | DRAM die ๋ด๋ถ cell ์ ์ฅ | DRAM die ๋ด๋ถ | ์ผ๋ฐ์ ์ผ๋ก ๋ด๋ถ correction์ด controller์ ํฌ๋ช | ๋ด๋ถ ๊ตฌํ code๋ ๊ณต๊ฐ/๊ณ ์ ๋์ง ์์ ์ ์์ |
| Link ECC | controller์ DRAM ์ฌ์ด ์ ์ก | link layer ์๋จ | link ์ค๋ฅ ์ํ๋ฅผ ๋ณ๋ ๋ณด๊ณ | Hamming ๊ณ์ด ๋๋ ๋ค๋ฅธ link code ๊ฐ๋ฅ |
| Chipkill/symbol ECC | DRAM device ๋๋ symbol ๋จ์ ์ฅ์ | controller์ device ๋ฐฐ์น ์ ์ฒด | device ์์นยทRAS์ ๊ฒฐํฉ | Hamming๋ง์ผ๋ก ๋ถ์กฑ, RS ๋ฑ๊ณผ ์กฐํฉ |
Linux EDAC ๋ฌธ์๋ ์ผ๋ฐ์ ์ธ memory stick์ด controller๊ฐ ๊ธฐ๋ํ๋ 64-bit data์ 8-bit ECC๋ฅผ ๋ํด 72-bit ํญ์ ๊ตฌ์ฑํ๋ค๊ณ ์ค๋ช ํฉ๋๋ค. ์ด๋ ๋ฌผ๋ฆฌ์ ์ธ x4/x8 device ๊ทธ๋ฃนํ์ ์ฐ๊ณ๋์ง๋ง, DDR ์ธ๋์ controller์ ์ค์ mapping์ด ๋ชจ๋ ๊ฐ๋ค๋ ์๋ฏธ๋ ์๋๋๋ค. DDR5 on-die ECC ์ญ์ ์ธ๋ถ side-band ECC์ ๋ณดํธ ์์น๊ฐ ๋ค๋ฅด๋ฏ๋ก ๋ ๊ณ์ธต์ ํ๋์ Hamming decoder๋ก ๊ฐ์ฃผํ๋ฉด ์ ๋ฉ๋๋ค.
์ค๋ฒํค๋์ ์ ์ฉ ๊ธฐ์ค
64-bit data์ 8-bit check๋ฅผ ์ถ๊ฐํ๋ ๋ํ ๊ตฌ์ฑ์ raw storage ์ค๋ฒํค๋๋ 8/64 = 12.5%์
๋๋ค. ์ค์ ์ฑ๋ฅ ์ํฅ์ ECC bit ์ ์ก ํญ, controller pipeline, ์ค๋ฅ๊ฐ ์๋ fast path, scrub ๋ฐ retry ์ ์ฑ
์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ฏ๋ก "ECC๋ ํญ์ 12.5% ์ฑ๋ฅ ์ ํ"๋ผ๊ณ ํด์ํ๋ฉด ์ ๋ฉ๋๋ค.
| ์ ํ ๊ธฐ์ค | Hamming/SECDED๊ฐ ์ ํฉํ ๊ฒฝ์ฐ | ๋ ๊ฐํ code๊ฐ ํ์ํ ๊ฒฝ์ฐ |
|---|---|---|
| ์ค๋ฅ ์ ๋ | ๋๋ฌธ single-bit upset | ์ฌ๋ฌ bit๊ฐ ํจ๊ป ์์๋๋ burst |
| latency | ์งง์ XOR ๊ธฐ๋ฐ read path๊ฐ ์ค์ | ์ฌ๋ฌ cycle decoder๋ฅผ ํ์ฉํ ์ ์์ |
| ์ฅ์ ๋ชจ๋ธ | bit ๋๋ ์์ bit ์ค๋ฅ | x4/x8 device failure, symbol erasure |
| ๊ตฌํ ์์ | ์์ ์กฐํฉ ๋ ผ๋ฆฌ์ ๋ฎ์ ์ ๋ ฅ | GF multiplier, soft information, ํฐ buffer |
| ์ด์ ์ ์ฑ | CE/UE์ patrol scrub์ผ๋ก ๊ด๋ฆฌ | retry, page offlining, device sparing๊น์ง ํ์ |
๋์ ์๋ฆฌ
๊ทธ๋ฆผ 2. ๋ฉ๋ชจ๋ฆฌ controller์ ๋ํ์ ์ธ ์ธ๋ถ SECDED ๊ฒฝ๋ก์ ๋๋ค. write path์์๋ data์์ check bit๋ฅผ ๋ง๋ค๊ณ , read path์์๋ syndrome๊ณผ overall parity๋ฅผ ๊ณ์ฐํ ๋ค ์ ์ ๋๋ UE ๊ฒฝ๋ก๋ฅผ ์ ํํฉ๋๋ค.
Hamming(7,4) ์ธ์ฝ๋ฉ
[p1, p2, d1, p4, d2, d3, d4] ์์์ even parity๋ฅผ ์ฌ์ฉํ๋ฉด parity ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
p1 = d1 XOR d2 XOR d4
p2 = d1 XOR d3 XOR d4
p4 = d2 XOR d3 XOR d4
์๋ฅผ ๋ค์ด data๊ฐ d1 d2 d3 d4 = 1 0 1 1์ด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ณ์ฐ๋ฉ๋๋ค.
p1 = 1 XOR 0 XOR 1 = 0
p2 = 1 XOR 1 XOR 1 = 1
p4 = 0 XOR 1 XOR 1 = 0
Hamming(7,4) codeword = 0 1 1 0 0 1 1
overall parity p0 = 0
Extended codeword = 0 1 1 0 0 1 1 0
์ด ์์์ 7-bit Hamming codeword์ 1 ๊ฐ์๋ 4๊ฐ์ด๋ฏ๋ก overall parity๋ 0์ ๋๋ค. ์ค์ interface๋ bit๋ฅผ ์ง๋ ฌ๋ก ๋ณด๋ด๋์ง, byte/lane์ ์ด๋ค ์์๋ก ๋ฐฐ์นํ๋์ง์ ๋ฐ๋ผ ํ์ ์์๊ฐ ๋ฌ๋ผ์ง ์ ์์ผ๋ฏ๋ก, ์ค๊ณ ๋ฌธ์์์๋ ๋ ผ๋ฆฌ ์์น์ ๋ฌผ๋ฆฌ lane mapping์ ๊ตฌ๋ถํด์ผ ํฉ๋๋ค.
Syndrome ๊ณ์ฐ๊ณผ single-bit ์ ์
์์ ํ 7-bit ๋ถ๋ถ codeword๋ฅผ r1..r7์ด๋ผ ํ๋ฉด positional syndrome์ ์ธ bit๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
s1 = r1 XOR r3 XOR r5 XOR r7
s2 = r2 XOR r3 XOR r6 XOR r7
s4 = r4 XOR r5 XOR r6 XOR r7
S = s1 + 2*s2 + 4*s4
์์ ์ ์ codeword์์ bit 6์ด ๋ค์งํ๋ฉด ์์ ๊ฐ์ 0 1 1 0 0 0 1์ด ๋ฉ๋๋ค.
s1 = 0
s2 = 1
s4 = 1
S = 0b110 = 6
์ ์ฒด 8-bit๋ฅผ XORํ overall parity ๊ฒฐ๊ณผ๋ 1์
๋๋ค. ๋ฐ๋ผ์ S=6์ ์์น 6์ single-bit error๋ฅผ ๊ฐ๋ฆฌํค๊ณ , decoder๋ ํด๋น bit๋ฅผ ๋ฐ์ ํ ๋ค data 1011์ ๋ณต์ํฉ๋๋ค. ์ค๋ฅ๊ฐ p0์์๋ง ๋ฐ์ํ๋ฉด S=0, P0=1์ด๋ฏ๋ก data bit๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ overall parity bit๋ง ์์ ํฉ๋๋ค.
SECDED decoder ์์ฌ์ฝ๋
๋ค์์ ๋ ผ๋ฆฌ ๋์์ ๋ณด์ฌ์ฃผ๋ ์ค๋ช ์ฉ ์์ฌ์ฝ๋์ ๋๋ค. ์ค์ RTL์์๋ XOR tree์ fan-in, pipeline latency, bit ordering, CE/UE logging๊ณผ reset์ ๋ณ๋๋ก ์ค๊ณํด์ผ ํฉ๋๋ค.
decode(received[1..7], p0):
s1 = XOR(received[1], received[3], received[5], received[7])
s2 = XOR(received[2], received[3], received[6], received[7])
s4 = XOR(received[4], received[5], received[6], received[7])
syndrome = s1 | (s2 << 1) | (s4 << 2)
overall = XOR(received[1..7], p0)
if syndrome != 0 and overall == 1:
flip(received[syndrome]) # single-bit ์ค๋ฅ๋ฅผ ์ ์ ํ๊ณ CE ๊ธฐ๋ก
report_corrected()
elif syndrome == 0 and overall == 1:
flip(p0) # overall parity bit ์ค๋ฅ๋ฅผ ์ ์
report_corrected()
elif syndrome != 0 and overall == 0:
report_uncorrectable() # SECDED ๋ชจ๋ธ์์ ์ ์ ๋ถ๊ฐ ์ค๋ฅ ๋ณด๊ณ
else:
pass # ์ค๋ฅ ์์
syndrome != 0, overall == 0์ธ ๊ฒฝ์ฐ์๋ ์ค๋ฅ๊ฐ ๋ bit๋ผ๋ ํ์ ์ง๋จ๋ณด๋ค "SECDED๊ฐ ์ ์ ํ ์ ์๋ ์ค๋ฅ"๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์์ ํฉ๋๋ค. ์ ํํ ๋ bit ์ค๋ฅ๋ผ๋ ๊ฐ์ ์๋์์๋ double-bit error๊ฐ ์ฌ๊ธฐ์ ํด๋นํ์ง๋ง, ๋ ๋ง์ ์ค๋ฅ๊ฐ ๋ค์ด์ค๋ฉด ๊ฐ์ ํ์ ํจํด์ด ๋ค๋ฅธ ์ค๋ฅ ์กฐํฉ์์๋ ๋์ฌ ์ ์์ต๋๋ค.
64-bit DRAM ECC write/read ๊ฒฝ๋ก
64-bit data word์ ๋ํด r=7๊ฐ์ ์์น parity๊ฐ ์กฐ๊ฑด 2^7 >= 64+7+1์ ๋ง์กฑํฉ๋๋ค. ์ฌ๊ธฐ์ overall parity๋ฅผ ํ๋ ์ถ๊ฐํ๋ฉด 8๊ฐ์ check bit๊ฐ ํ์ํฉ๋๋ค.
Write path
- memory controller๊ฐ CPU/cache line์์ ๋ณดํธํ 64-bit data word๋ฅผ ๋ฐ์ต๋๋ค.
- parity-check matrix์ data ๋ถ๋ถ
A๋ฅผ ์ฌ์ฉํด 7๊ฐ positional parity๋ฅผ XOR ๊ณ์ฐํฉ๋๋ค. - data์ 7๊ฐ parity์ ์ ์ฒด XOR๋ก overall parity๋ฅผ ๊ณ์ฐํฉ๋๋ค.
64 data + 8 check = 72-bit๋ ผ๋ฆฌ codeword๋ฅผ DIMM์ data/ECC device ๊ทธ๋ฃน์ ๊ธฐ๋กํฉ๋๋ค.
Read path
- controller๊ฐ data์ check bit๋ฅผ ํจ๊ป ์ฝ์ด 72-bit ์์ word๋ฅผ ๋ง๋ญ๋๋ค.
- parity XOR network๊ฐ positional syndrome๊ณผ overall parity๋ฅผ ๋ณ๋ ฌ ๊ณ์ฐํฉ๋๋ค.
- syndrome์ด ํ ์์น๋ฅผ ๊ฐ๋ฆฌํค๊ณ overall parity๊ฐ odd์ด๋ฉด ํด๋น bit๋ฅผ ๋ฐ์ ํฉ๋๋ค.
- syndrome์ด 0์ด๊ณ overall parity๋ง odd์ด๋ฉด overall parity bit ์ค๋ฅ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
- double-bit๋ก ๋ถ๋ฅ๋๊ฑฐ๋ correction ๊ฒ์ฆ์ ์คํจํ๋ฉด data๋ฅผ ์ ์์ผ๋ก ์ ๋ฌํ์ง ์๊ณ UE/UCE, retry, poisoning ๋ฑ์ RAS ์ ์ฑ ์ผ๋ก ๋ณด๋ ๋๋ค.
- ์ ์ ๋ line์ CE counter์ ์ฃผ์ยทrankยทdevice ์์น๋ฅผ ๊ธฐ๋กํ๊ณ , patrol scrub์ผ๋ก ์ฌ๊ธฐ๋กํ ์ ์์ต๋๋ค.
DRAM ์ ์ฉ ์ ์ฃผ์์
Hamming code๊ฐ ์ ๊ณตํ๋ ๊ฒ์ ๋ ผ๋ฆฌ codeword ๋จ์์ ์ค๋ฅ ์ ์ ์ ๋๋ค. ๋ฌผ๋ฆฌ์ ์ธ DRAM device ๊ณ ์ฅ์ ์ ์ ํ๋ ค๋ฉด ๋ค์ ์์๋ฅผ ํจ๊ป ์ ์ํด์ผ ํฉ๋๋ค.
- device ํญ: x4 ๋๋ x8 device์ ํ ์ถ๋ ฅ์ด codeword์ ๋ช bit/symbol์ ๋งคํ๋๋๊ฐ
- codeword ๋ฒ์: ํ๋์ burst, cache line, rank ์ ๊ทผ ์ค ์ด๋๊น์ง๋ฅผ ํ codeword๋ก ๋ฌถ๋๊ฐ
- interleaving: ํ ๋ฌผ๋ฆฌ ์ฌ๊ฑด์ด ํ๋์ codeword์ ์ง์ค๋๋๊ฐ, ์ฌ๋ฌ codeword๋ก ๋๋๋๊ฐ
- ์ค๋ฅ ์์น ์ ๋ณด: controller๊ฐ device timeout์ด๋ link error๋ฅผ erasure ์์น๋ก ์ ์ ์๋๊ฐ
- RAS ์ฒ๋ฆฌ: CE/UE logging, scrub, retry, page offlining, spare device ์ ์ฑ ์ ์ด๋ป๊ฒ ์ฐ๊ฒฐํ๋๊ฐ
ํ x4 DRAM device์ ์ฌ๋ฌ ์ถ๋ ฅ์ด ํ๋์ codeword์ ํฌํจ๋๋ฉด ๋จ์ผ device failure๊ฐ ์ฌ๋ฌ bit ์ค๋ฅ๋ก ๋ํ๋ ์ ์์ต๋๋ค. ์ด ์ค๋ฅ๊ฐ SECDED์ ๋ bit ํ๊ณ๋ฅผ ๋์ผ๋ฉด Hamming code๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ symbol-based ECC, Reed-Solomon, Chipkill ๋๋ ๋ค์ฐจ์ parity๊ฐ ํ์ํ๋ฉฐ, ์ด๋ค ๊ธฐ๋ฒ์ ์ ํํ๋๋ผ๋ codeword์ device mapping์ ํจ๊ป ๋ถ์ํด์ผ ํฉ๋๋ค.
On-die ECC์ ์ธ๋ถ SECDED์ ๊ฒฝ๊ณ
DDR5 on-die ECC๋ DRAM die ๋ด๋ถ์ cell array ์ ์ฅ ์ค๋ฅ๋ฅผ ๋ด๋ถ์์ ์ฒ๋ฆฌํ๋ ๊ณ์ธต์ ๋๋ค. ๋ฐ๋ฉด ์ธ๋ถ side-band ECC๋ memory controller๊ฐ DIMM์์ ์์ ํ data์ check bit๋ฅผ ๊ฒ์ฌํด linkยทdeviceยทํจํค์ง ์์ค ์ค๋ฅ๋ฅผ ๋ค๋ฃจ๋ ๊ณ์ธต์ ๋๋ค. on-die correction์ ๋ด๋ถ syndrome๊ณผ ์ ์ ํ์๋ ์ผ๋ฐ์ ์ผ๋ก controller๊ฐ ์ง์ ๊ด์ฐฐํ๋ ์ธ๋ถ SECDED syndrome๊ณผ ๋ค๋ฆ ๋๋ค.
๋ฐ๋ผ์ ๋ค์ ๋ ๋ฌธ์ฅ์ ์๋ก ๋ค๋ฅธ ์ฃผ์ฅ์ ๋๋ค.
- "DRAM die ๋ด๋ถ์์ ์ผ๋ถ cell ์ค๋ฅ๋ฅผ on-die ECC๋ก ๋ณด์ ํ๋ค."
- "controller๊ฐ 64-bit data์ 8-bit check๋ฅผ ์ฌ์ฉํด ์ธ๋ถ codeword๋ฅผ SECDED๋ก ๊ฒ์ฌํ๋ค."
๋ ๊ณ์ธต์ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋ณดํธ ๋ฒ์๋ฅผ ๋ํ ์ ์์ง๋ง, on-die ECC๊ฐ ์ธ๋ถ ECC๋ฅผ ์๋์ผ๋ก ๋์ฒดํ๊ฑฐ๋ ์ธ๋ถ Hamming decoder๊ฐ on-die ์ค๋ฅ๋ฅผ ๋ชจ๋ ๋ณด๊ณ ํ๋ค๊ณ ๊ฐ์ ํ๋ฉด ์ ๋ฉ๋๋ค.
์ฅ๋จ์
| ์ฅ์ | ํ๊ณ์ ์ฃผ์์ |
|---|---|
| single-bit error์ ์์น๋ฅผ syndrome์ผ๋ก ๋ฐ๋ก ๊ณ์ฐ | ๊ธฐ๋ณธ Hamming code๋ง์ผ๋ก๋ double-bit miscorrection์ ๋ง๊ธฐ ์ด๋ ค์ |
| XOR ์ค์ฌ์ encoder/decoder๋ผ ์ ์ง์ฐ ๊ตฌํ์ด ๊ฐ๋ฅ | data ํญ์ด ์ปค์ง๋ฉด parity ์์ fan-in๊ณผ ๋ฐฐ์ ์ด ์ฆ๊ฐ |
| 64+8, 32+7์ฒ๋ผ power-of-two data ํญ์ ์ ์ฉํ๊ธฐ ์ฌ์ | 64+8์ 12.5% check storage ์ค๋ฒํค๋๊ฐ ์กด์ฌ |
| extended parity๋ฅผ ์ถ๊ฐํ๋ฉด SECDED ํ์ ๊ฐ๋ฅ | SECDED๋ ์ธ bit ์ด์ ์ค๋ฅ์ ์ ์ ยท๊ฒ์ถ์ ๋ณด์ฅํ์ง ์์ |
| CE/UE, syndrome, patrol scrub๊ณผ ์์ฐ์ค๋ฝ๊ฒ ์ฐ๊ณ | chip failure, burst, ๋ค์ค symbol ์ค๋ฅ์๋ ๋ณดํธ๊ฐ ๋ถ์กฑ |
| ํ์ค ์์น ๋ฐฐ์น๊ฐ ๊ต์กยท๊ฒ์ฆ์ ์ ๋ฆฌ | ์ค์ controller๋ Hsiao ๋๋ proprietary matrix๋ฅผ ์ฌ์ฉํ ์ ์์ |
Hamming/SECDED๋ ์ค๋ฅ๊ฐ ๋๋ฌผ๊ณ single-bit ์ค๋ฅ๊ฐ ์ฃผ๋ ๋ฉ๋ชจ๋ฆฌ read path์์ latency์ ํ๋ก ๋น์ฉ์ ๊ท ํ์ด ์ข์ต๋๋ค. ๋ฐ๋๋ก DRAM device ๋จ์ ์ฅ์ ๋ ๋์ ์ค๋ฅ์จ ์ฑ๋์ ๋ณดํธํ๋ ค๋ฉด code ๊ฐ๋๋ฟ ์๋๋ผ symbol mapping, interleaving, spare, retry๋ฅผ ํฌํจํ ์์คํ ์ค๊ณ๊ฐ ํ์ํฉ๋๋ค.
๊ด๋ จ ๊ธฐ์
๊ด๋ จ ๋ฌธ์
- ECC Error Correction: DRAM ECC ๊ณ์ธต, SECDED, scrubbing์ ๊ฐ์
- Hsiao Code: SECDED parity-check matrix์ ํ๋์จ์ด ์ต์ ํ
- Reed-Solomon Code: symbol ์ค๋ฅยทerasureยทChipkill ์ค๊ณ
- DRAM ํ ์คํธ/์ ๋ขฐ์ฑ: ECC, CE/UE, BIST์ scrub ์ด์
- DDR ๋ด๋ถ ๊ตฌ์กฐ: rankยทdeviceยทchannel ๋ฐ์ดํฐ ๊ฒฝ๋ก
- Linux Memory EDAC: Linux ๋ฉ๋ชจ๋ฆฌ ์ค๋ฅ ๊ด๋ฆฌ์ ๋ฐฐ๊ฒฝ
์ฐธ๊ณ ๋ฌธํ
| ๊ตฌ๋ถ | ์๋ฃ |
|---|---|
| ์ ๋ ผ๋ฌธ | R. W. Hamming, "Error Detecting and Error Correcting Codes", Bell System Technical Journal, 1950 |
| ์ ๋ ผ๋ฌธ ์ฌ๋ณธ | Hamming, Error Detecting and Error Correcting Codes, Naval Postgraduate School archive |
| DRAM ํ์ฅ ์ฐ๊ตฌ | B. Schroeder et al., "DRAM Errors in the Wild: A Large-Scale Field Study", SIGMETRICS, 2009 |
| ์ด์ ์ธํฐํ์ด์ค | Linux EDAC documentation: 72-bit ECC ๊ตฌ์ฑ, syndrome, CE/UE, scrub |
| ๋ฉ๋ชจ๋ฆฌ ํ์ค | JEDEC JESD79-5 DDR5 SDRAM |
| ํ๋ ฌ ์ต์ ํ | M. Y. Hsiao, "A Class of Optimal Minimum Odd-weight-column SEC-DED Codes", IBM Journal of Research and Development, 1970 |
Google์ ํ์ฅ ์ฐ๊ตฌ๋ ์๋ฐฑ๋ง DIMM-day ๊ท๋ชจ์ ๊ด์ธก์์ ์ฐ๊ฐ 8%๋ฅผ ๋๋ DIMM์ด ์ค๋ฅ๋ฅผ ๊ฒฝํํ๊ณ , ๊ด์ธก๋ ์ค๋ฅ์จ๊ณผ ์ค๋ฅ ์ ํ์ด ๋น์์ ๋จ์ํ soft-error ๊ฐ์ ๊ณผ ๋ค๋ฅผ ์ ์์์ ๋ณด๊ณ ํ์ต๋๋ค. ์ด ๊ฒฐ๊ณผ๋ Hamming code์ ์ํ์ ์ ์ ๋ฒ์์ ๋ณ๊ฐ๋ก, CE ๋์ ๊ด์ฐฐยทscrubยท๋ชจ๋ ๊ต์ฒด ๊ฐ์ RAS ์ด์์ด ํ์ํ ์ด์ ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
ํต์ฌ ์ ๋ฆฌ
Hamming Code๋ parity bit์ ๊ฒ์ฌ ๊ฒฐ๊ณผ์ธ syndrome์ผ๋ก single-bit ์ค๋ฅ ์์น๋ฅผ ๊ณ์ฐํ๋ binary linear block code์ ๋๋ค. ๊ธฐ๋ณธ Hamming code์ ์ต์ ๊ฑฐ๋ฆฌ๋ 3์ด๋ฉฐ, overall parity๋ฅผ ์ถ๊ฐํ extended Hamming code๋ ์ต์ ๊ฑฐ๋ฆฌ 4์ SECDED ๋์์ ์ ๊ณตํฉ๋๋ค. 64-bit data์ 7๊ฐ์ ์์น parity์ 1๊ฐ์ overall parity๋ฅผ ๋ํ 72-bit codeword๋ ์ ํต์ ์ธ ์ธ๋ถ DRAM ECC์ ๋ํ ๋ชจ๋ธ์ด์ง๋ง, ์ค์ controller๋ Hsiao๋ symbol-based ECC๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. Hamming/SECDED๋ง์ผ๋ก DRAM chip failure์ ๋ค์ค symbol ์ค๋ฅ๋ฅผ ํด๊ฒฐํ ์ ์์ผ๋ฏ๋ก device mapping, interleaving, RAS logging, scrub ๋ฐ ๋ ๊ฐํ ECC ๊ณ์ธต์ ํจ๊ป ๊ฒํ ํด์ผ ํฉ๋๋ค.