신뢰성과 오류 정정
메모리는 완벽하지 않다. 우주에서 날아온 중성자가 비트를 뒤집고, DRAM 커패시터는 쉬지 않고 새며, 옆 로우를 두드리기만 해도 비트가 바뀐다. NAND는 쓸 때마다 닳고, 읽기만 해도 이웃이 흔들린다. 이 장에서는 메모리 오류가 어디서 오는지 물리적으로 이해하고, 그것을 수치(FIT, RBER, UBER)로 표현한 뒤, 패리티 한 비트에서 LDPC까지 오류 정정 부호(ECC)가 어떻게 수십억 개의 약한 셀을 믿을 수 있는 저장 장치로 바꾸는지 직접 계산하고 시뮬레이션해 본다.
- 소프트·하드·간헐 오류를 구분하고 FIT, MTBF, 배스터브 곡선으로 신뢰성을 정량화할 수 있다.
- DRAM 리텐션 꼬리 분포와 VRT, 로우 해머(HCfirst, TRR, RFM, PRAC)의 원리와 한계를 설명할 수 있다.
- NAND의 P/E 마모, 리텐션, 읽기·프로그램 디스터브가 Vt 분포와 RBER에 미치는 영향을 이해한다.
- 아레니우스 모델로 가속 계수를 계산하고 고온 시험 결과를 사용 조건으로 환산할 수 있다.
- 해밍(7,4)과 SECDED(72,64)의 인코딩·신드롬 디코딩을 손으로 할 수 있고, BCH·LDPC의 코드워드 실패 확률과 UBER를 추정할 수 있다.
오류의 종류와 신뢰성 지표
메모리 오류는 원인과 지속성에 따라 크게 셋으로 나뉜다. 소프트 에러(soft error)는 셀 자체는 멀쩡한데 저장된 값만 일시적으로 뒤집힌 것이다. 다시 쓰면 정상으로 돌아온다. 하드 에러(hard error)는 셀, 워드라인, 접점 같은 물리 구조가 망가져서 같은 위치에서 계속 반복되는 오류다. 그 사이에 간헐 오류(intermittent error)가 있다. 특정 온도, 전압, 데이터 패턴, 타이밍에서만 나타나는 오류로, 가변 리텐션(VRT)이나 약한 셀이 대표적이다. 재현이 어려워서 현장에서 가장 골치 아픈 부류다.
소프트 에러: 입자 하나가 비트를 뒤집는다
소프트 에러의 주범은 두 가지다. 첫째는 패키지·솔더·배선 재료에 극미량 섞인 우라늄·토륨이 붕괴하며 내놓는 알파 입자(~4~9 MeV)다. 둘째는 우주선이 대기와 충돌해 만든 고에너지 중성자다. 해수면 기준으로 10 MeV 이상 중성자가 약 13개/cm²·h 쏟아지고(JESD89 기준 뉴욕), 고도 10 km 비행기에서는 수백 배가 된다. 중성자는 전하가 없지만 실리콘 원자핵과 충돌해 2차 이온을 만든다. 이 이온들이 실리콘을 지나가면서 전자-정공 쌍(쌍당 약 3.6 eV)을 만든다. 5 MeV 알파 입자 하나가 만드는 전하는 약 140만 쌍, 즉 ~220 fC이다. 이 가운데 저장 노드 근처 공핍 영역으로 퍼널링(funneling)과 확산으로 모인 전하가 임계 전하 \(Q_{crit}\)를 넘으면 비트가 뒤집힌다.
DRAM 셀의 임계 전하는 대략 \(Q_{crit}\approx C_s\,\Delta V\)이다. \(C_s=10\) fF, 센싱 여유 0.5 V이면 약 5 fC, 전자 3만 개 정도다. 공정이 미세해지면서 셀당 \(Q_{crit}\)은 거의 그대로 유지됐다(4장의 실린더 커패시터 덕분이다). 반면 전하를 모으는 면적은 빠르게 줄었다. 그래서 DRAM의 비트당 소프트 에러율(SER)은 1990년대 이후 여러 세대에 걸쳐 1000배 이상 줄었고(Baumann, 2005), 칩·시스템당 SER은 대략 비슷하게 유지됐다. 대신 셀이 촘촘해지면서 입자 하나가 인접한 여러 비트를 함께 뒤집는 다중 비트 업셋(MBU)의 비중이 커졌다. 단일 비트 정정만으로는 부족해지는 이유다.
FIT, MTBF, 그리고 배스터브 곡선
반도체 신뢰성의 기본 단위는 FIT(Failures In Time)이다. 10억(10⁹) 소자·시간당 고장 수를 뜻한다. 고장률 \(\lambda\)가 시간에 따라 일정하다면(우발 고장 구간) 고장은 지수 분포를 따르고, 평균 고장 간격은 FIT의 역수가 된다.
숫자로 감을 잡아 보자. DRAM 칩 하나가 50 FIT이면 MTBF는 2×10⁷ 시간, 약 2,300년이다. 하지만 데이터센터 한 구역에 칩이 10만 개 있으면 시스템 FIT는 5×10⁶, MTBF는 200 시간이다. 여드레에 한 번씩 어딘가에서 메모리 오류가 난다는 뜻이다. 개별 칩은 충분히 튼튼해도 규모가 커지면 오류는 일상이 된다. 서버에 ECC가 필수인 이유가 여기 있다.
구글의 대규모 현장 연구(Schroeder 외, 2009)에서는 매년 DIMM의 약 8%가 정정 가능한 오류를 한 번 이상 겪었다. 오류의 대부분은 우주선이 아니라 같은 위치에서 반복되는 하드·간헐 오류에서 나왔다. 이후 여러 HPC 현장 연구도 칩 단위의 영구 고장(워드라인, 뱅크 단위 고장 포함)이 무시할 수 없는 비중을 차지한다고 보고했다. 칩 하나가 통째로 죽어도 버티는 칩킬이 서버 표준이 된 배경이다.
| 메모리 | 오류 메커니즘 | 성격 | 주요 대책 |
|---|---|---|---|
| 공통 | 알파 입자·중성자 소프트 에러 | 소프트, 무작위 | 저알파 재료, ECC, 스크러빙 |
| DRAM | 리텐션 실패(누설), VRT | 간헐·온도 의존 | 리프레시, 테스트 시 리페어, ECC |
| DRAM | 로우 해머 / RowPress | 접근 패턴 의존 | TRR, RFM, PRAC, ECC |
| DRAM | 셀·워드라인·TSV 영구 고장 | 하드 | PPR(패키지 후 리페어), 칩킬 |
| NAND | P/E 사이클 마모(산화막 트랩) | 누적·마모 | 웨어 레벨링, 강력한 ECC |
| NAND | 리텐션(전하 손실) | 시간·온도 의존 | 읽기 재시도, 데이터 리프레시 |
| NAND | 읽기·프로그램 디스터브 | 접근 패턴 의존 | 리드 리클레임, 프로그램 순서 최적화 |
DRAM 리텐션: 새는 커패시터와 꼬리 분포
4장에서 본 1T1C 셀은 수 fF짜리 커패시터에 전하를 담아 둔다. 이 전하는 여러 경로로 끊임없이 샌다. 셀이 값을 유지하는 시간, 즉 리텐션 시간(retention time)은 센스 앰프가 구분할 수 있는 전압 여유를 다 잃을 때까지 걸리는 시간이다.
누설 경로는 네 가지다. ① 저장 노드 pn 접합의 역방향 누설(SRH 생성, 트랩 보조 터널링), ② 게이트-드레인 겹침 영역의 GIDL(Gate-Induced Drain Leakage), ③ 액세스 트랜지스터의 서브스레숄드 누설, ④ 커패시터 유전막 누설이다(2장). 셀 대부분은 85°C에서도 수 초 이상 버틴다. 그런데 결함(트랩)이 접합 근처에 있는 극소수 셀은 누설이 수십~수백 배 커서 꼬리(tail)를 이룬다. 리프레시 주기를 정하는 것은 평균 셀이 아니라 이 꼬리다.
JEDEC 규격은 이 꼬리를 감안해 리프레시 창 \(t_{REFW}\)를 정한다. DDR4는 85°C 이하에서 64 ms, 그 이상에서 32 ms이다. DDR5는 기본이 32 ms(\(t_{REFI}=3.9\) µs)이고, 고온에서는 더 자주 리프레시한다(5장). 온도가 오르면 누설이 지수적으로 늘어나서, 리텐션 시간은 대략 10°C마다 절반으로 줄어든다. 제조사는 웨이퍼·패키지 테스트에서 고온·긴 주기로 약한 셀을 찾아 여분 로우·칼럼으로 리페어한다. 그렇게 해서 규격 주기에서는 실패 셀이 남지 않게 한다.
문제는 약한 셀을 한 번에 다 찾을 수 없다는 점이다. VRT 셀은 테스트하는 순간 높은 상태였다면 멀쩡해 보인다. 또 이웃 셀의 데이터에 따라 누설이 달라지는 데이터 패턴 의존성(DPD)도 있다. 그래서 출하 후에도 가끔 리텐션 오류가 나고, 이것을 ECC가 받아 준다.
리텐션 시간 분포와 리프레시 주기
셀마다 리텐션을 측정해서 약한 로우만 자주 리프레시하면 리프레시 전력을 크게 아낄 수 있다(RAIDR, 2012). 실제로 32 GB 시스템에서 256 ms 미만이 필요한 셀은 약 1000개에 불과하다는 분석도 있다. 하지만 VRT 때문에 오늘 강한 셀이 내일 약해질 수 있고, DPD 때문에 최악의 데이터 패턴을 모두 시험하기도 어렵다. 그래서 상용 DRAM은 여전히 보수적인 고정 주기를 쓰고, 셀 단위 최적화는 연구 주제로 남아 있다.
로우 해머: 이웃을 두드리면 비트가 바뀐다
2014년 Kim 외(ISCA)는 놀라운 사실을 보고했다. 한 로우를 리프레시 창 안에서 수십만 번 활성화(ACT)했다 닫기(PRE)를 반복하면, 한 번도 접근하지 않은 이웃 로우의 비트가 뒤집힌다. 이것이 로우 해머(RowHammer)다. 반복 활성화되는 로우를 공격자(aggressor), 비트가 뒤집히는 이웃을 희생자(victim)라 부른다. 원인은 워드라인이 반복해서 켜지고 꺼질 때 생기는 인접 셀과의 용량성 결합, 그리고 전자 주입·트랩 보조 누설의 증가다. 이 때문에 희생 셀의 전하가 리프레시가 돌아오기 전에 임계값 아래로 떨어진다. 로우 간격이 좁아질수록 결합이 강해진다.
공격자가 리프레시 창 안에 넣을 수 있는 활성화 횟수의 상한은 로우 사이클 시간 \(t_{RC}\)로 정해진다.
문제는 비트 하나를 처음 뒤집는 데 필요한 활성화 횟수 HCfirst가 공정 세대마다 빠르게 줄고 있다는 점이다. 아래는 공개 연구에서 측정된 최솟값이다(더블사이드, 공격자 로우당 횟수).
| DRAM 유형 (연구) | HCfirst (최소) | 비고 |
|---|---|---|
| DDR3 (Kim 외, 2014) | ~139K | 로우 해머 최초 보고 |
| DDR3 신형 (Kim 외, 2020) | ~22.4K | 같은 연구에서 1580개 칩을 측정. 세대가 내려갈수록 감소 |
| DDR4 구형 (Kim 외, 2020) | ~17.5K | |
| DDR4 신형 (Kim 외, 2020) | ~10K | |
| LPDDR4-1y (Kim 외, 2020) | ~4.8K | |
| 최신 DDR5·HBM (2024~) | 수천 이하(추정) | 제조사 공개 값이 거의 없고, 방어 설계는 ~1K 이하를 가정 |
로우 해머는 신뢰성 문제이면서 동시에 보안 문제다. 2015년 구글 Project Zero는 일반 사용자 프로그램이 로우 해머로 페이지 테이블 비트를 뒤집어 커널 권한을 얻는 공격을 시연했다. 이후 자바스크립트, 네트워크(RDMA), 모바일 GPU를 통한 공격이 잇따라 보고됐다.
방어 기법: TRR, RFM, PRAC
- TRR(Target Row Refresh): DRAM 내부에 소수의 카운터(샘플러)를 두고, 자주 활성화된 로우를 추적한다. 일반 REF 명령 때 그 이웃 로우를 추가로 리프레시한다. DDR4와 LPDDR4에 널리 들어갔다. 하지만 추적 테이블이 작아서, 공격자 로우 여러 개를 섞어 두드리는 다면(many-sided) 공격에 테이블이 넘쳐 무력화된다(TRRespass, 2020; Blacksmith, 2022).
- RFM(Refresh Management): DDR5·LPDDR5에서 도입됐다. 컨트롤러가 뱅크별로 활성화 횟수를 누적(RAA 카운터)하다가 DRAM이 알려 준 임계값에 이르면 RFM 명령을 보내 완화 시간을 준다. 어떤 로우를 리프레시할지는 여전히 DRAM 내부 판단에 맡긴다.
- PRAC(Per-Row Activation Counting): 2024년 JEDEC DDR5 규격 개정으로 도입됐다. 로우마다 활성화 카운터를 어레이 안에 두고, 프리차지 때마다 갱신한다. 어떤 로우든 임계값을 넘으면 DRAM이 Alert 신호(ABO, Alert Back-Off)를 올리고, 컨트롤러가 RFM으로 시간을 준다. 추적 누락이 원리적으로 없지만, 카운터 읽기·쓰기 때문에 \(t_{RP}\)·\(t_{RC}\)가 늘어나 성능과 면적 부담이 있다.
- ECC: 흩어진 단일 비트 플립은 막아 주지만, 한 워드에 여러 비트가 뒤집히면 뚫린다. ECC 메모리에서도 공격이 가능함이 시연됐다(ECCploit, 2019).
로우 해머 공격과 방어
RowPress(Luo 외, ISCA 2023)는 로우를 여러 번 여닫는 대신 오래 열어 두는 공격이다. 공격자 로우의 열림 시간(tAggON)이 길어지면 플립에 필요한 활성화 횟수가 수십 배까지 줄고, 극단적인 조건에서는 한 번의 긴 활성화로도 플립이 관측됐다. 활성화 횟수만 세는 방어는 이를 놓칠 수 있다. Half-Double(구글, 2021)은 두 칸 떨어진 로우를 두드리고, 그 와중에 TRR이 이웃을 리프레시하려고 활성화하는 동작까지 공격에 이용한다. 방어 기법 자체가 새로운 공격 표면이 될 수 있다는 뜻이다.
NAND의 마모, 리텐션, 디스터브
8장에서 본 것처럼 NAND 셀은 터널 산화막 너머 전하 저장층(플로팅 게이트 또는 차지 트랩)에 전자를 넣고 빼서 문턱 전압 \(V_t\)를 바꾼다. 이 방식에는 대가가 따른다. 쓰고 지울 때마다 약 10 MV/cm의 강한 전기장으로 전자를 산화막 너머로 밀어 넣는데, 이것이 산화막을 조금씩 손상시킨다. NAND 신뢰성 문제는 거의 모두 \(V_t\) 분포가 움직이고 넓어져서 인접 상태와 겹치는 것으로 요약된다. 겹친 부분만큼 비트 오류가 생기며, 이 비율이 RBER(Raw Bit Error Rate, ECC 이전 비트 오류율)이다.
- P/E 사이클 마모: FN 터널링을 반복하면 산화막 안에 전자 트랩과 계면 결함이 쌓인다. 트랩에 갇힌 전하는 \(V_t\)를 흔들고, 결함을 통한 누설(SILC, 스트레스 유도 누설 전류)을 늘린다. 프로그램·소거 속도도 변해 분포가 넓어진다. 대략적인 정격 수명은 SLC 수만~10만 회, MLC ~3K~10K회, TLC ~1K~3K회, QLC ~0.5K~1.5K회다(2024년 기준).
- 리텐션: 시간이 지나면 저장된 전자가 빠져나와 프로그램 상태의 \(V_t\)가 아래로 이동한다. 전자를 많이 담은 높은 상태일수록 더 많이 이동한다. 고온에서 가속되고, 마모된 셀일수록 빨라진다. 3D NAND의 차지 트랩은 프로그램 직후 수 초~수 시간 동안 빠른 초기 전하 손실과 층 방향 전하 이동을 겪는다(9장).
- 읽기 디스터브: 한 워드라인을 읽을 때 같은 스트링의 나머지 워드라인에는 셀을 모두 켜기 위한 통과 전압 \(V_{pass}\)(~6~7 V)를 건다. 이 전압이 수만 번 반복되면 소거 상태 셀에 약한 프로그램이 일어나 \(V_t\)가 위로 이동한다. 컨트롤러는 블록별 읽기 횟수를 세어 한계 전에 데이터를 다른 블록으로 옮긴다(리드 리클레임).
- 프로그램 디스터브: 같은 워드라인에 \(V_{pgm}\)(~20 V)이 걸리면, 쓰지 않을 셀(금지 스트링)은 채널 전위를 끌어올리는 셀프 부스팅으로 보호된다. 부스팅이 부족하면 원치 않는 프로그램이 일어난다. 선택 스트링의 다른 워드라인에 걸린 \(V_{pass}\) 스트레스(패스 디스터브)도 있다.
컨트롤러는 이 모든 변화를 소프트웨어로 보정한다(10장). 가장 중요한 도구가 읽기 재시도(read retry)와 기준 전압 최적화다. ECC가 실패하면 미리 정해 둔 전압 오프셋 표를 차례로 적용해 다시 읽는다. 최신 컨트롤러는 블록의 P/E 횟수, 경과 시간, 온도를 보고 최적 기준 전압을 예측하거나 추적한다. 여기에 웨어 레벨링(마모 분산), 리드 리클레임(읽기 디스터브), 백그라운드 데이터 리프레시(리텐션)를 더하면, 셀 단위로는 오류투성이인 NAND가 제품 수준에서는 UBER 10⁻¹⁵~10⁻¹⁷의 저장 장치가 된다.
NAND RBER: P/E 사이클·리텐션과 ECC 한계
가속 수명 시험과 아레니우스 모델
"이 SSD는 전원 없이 1년 동안 데이터를 보존한다"를 검증하려고 1년을 기다릴 수는 없다. 대신 온도를 올려 열화를 가속한다. 화학 반응, 확산, 전하 탈출처럼 에너지 장벽 \(E_a\)를 열로 넘어야 일어나는 과정은 속도가 \(\exp(-E_a/kT)\)에 비례한다(아레니우스 법칙). 두 온도에서의 속도 비가 가속 계수(Acceleration Factor)다.
예를 들어 NAND 리텐션에 흔히 가정하는 \(E_a = 1.1\) eV로 40°C 1년(8,760 시간)을 125°C 베이크로 재현해 보자. \(1/313.15 - 1/398.15 = 6.82\times10^{-4}\) K⁻¹이고, 여기에 \(E_a/k = 12{,}765\) K를 곱하면 8.70이다. 따라서 \(AF = e^{8.70}\approx 6{,}000\)이고, 125°C에서 약 1.5 시간이면 된다. 같은 방식으로 반도체 칩은 125°C, 1000 시간의 HTOL(고온 동작 수명) 시험으로 수년간의 사용을 대신하고, 초기 불량은 번인으로 걸러 낸다.
| 고장 메커니즘 | 대표 Ea (eV) | 비고 |
|---|---|---|
| NAND 데이터 리텐션(전하 손실) | ~1.1 | JESD218 SSD 내구성 시험의 기본 가정 |
| DRAM 리텐션(누설 전류) | ~0.6~0.8 | "10°C당 약 2배"에서 환산한 값. 누설 메커니즘에 따라 다르다 |
| 구리 배선 전자이동(EM) | ~0.8~0.9 | 계면 확산이 지배 |
| 게이트 산화막 TDDB | ~0.6~0.9 | 전계 모델에 따라 차이가 크다 |
| 이온 오염(이동성 이온) | ~1.0 | Na⁺ 등 |
SSD 내구성 규격 JESD218은 수명이 끝난 시점(정격 TBW를 모두 쓴 뒤)에 다음을 요구한다. 클라이언트 SSD는 30°C에서 전원 없이 1년 보관, UBER ≤ 10⁻¹⁵이다. 엔터프라이즈 SSD는 40°C에서 3개월 보관, UBER ≤ 10⁻¹⁶이다. 동작 온도 가정도 다르다(클라이언트 40°C·하루 8시간, 엔터프라이즈 55°C·24시간). 인증 시험은 이 조건을 아레니우스로 고온 베이크 시간으로 바꿔 수행한다.
아레니우스 가속 계수 계산기
아레니우스 외삽은 시험 온도와 사용 온도에서 같은 메커니즘이 지배할 때만 유효하다. 너무 높은 온도에서는 사용 조건에서는 일어나지 않는 메커니즘이 켜지거나, 반대로 NAND의 트랩이 열로 회복(어닐링)되어 결과가 낙관적으로 나올 수 있다. 여러 메커니즘이 섞이면 겉보기 Ea가 온도에 따라 달라진다. 그래서 신뢰성 엔지니어는 여러 온도에서 시험해 \(\ln t\)–\(1/T\) 그래프가 직선인지 먼저 확인한다.
ECC 기초: 패리티에서 해밍 코드까지
오류를 완전히 없앨 수 없다면 고칠 수 있게 만들면 된다. 오류 정정 부호(ECC)의 기본 발상은 중복이다. \(k\)비트 데이터에 \(r\)비트 패리티를 붙여 \(n=k+r\)비트 코드워드를 만든다. 가능한 \(2^n\)개 비트열 가운데 \(2^k\)개만 유효한 코드워드로 쓰면, 오류로 비트가 바뀌었을 때 "유효하지 않은 비트열"이 되어 들킨다.
가장 간단한 예는 패리티 비트다. 데이터의 1의 개수가 짝수가 되도록 1비트를 붙인다. 비트 하나가 뒤집히면 홀수가 되어 검출은 되지만, 어느 비트인지 모르니 정정은 못 한다. 두 비트가 뒤집히면 다시 짝수가 되어 검출도 못 한다.
해밍 거리와 정정 능력
두 비트열이 서로 다른 자리 수를 해밍 거리(Hamming distance)라 한다. 코드의 성능은 유효 코드워드 사이의 최소 거리 \(d_{min}\)로 정해진다. 오류 \(t\)개가 난 비트열이 여전히 원래 코드워드에 가장 가까우려면 코드워드 사이가 \(2t+1\) 이상 떨어져 있어야 한다.
해밍(7,4) 코드
1950년 리처드 해밍이 고안한 이 코드는 데이터 4비트(\(d_1\)~\(d_4\))에 패리티 3비트를 붙인다. 비트 위치를 1~7로 번호 매기고, 2의 거듭제곱 위치(1, 2, 4)에 패리티를 둔다. 순서는 \(p_1\,p_2\,d_1\,p_3\,d_2\,d_3\,d_4\)이다. 패리티 \(p_i\)는 위치 번호를 2진수로 썼을 때 해당 비트가 1인 위치들을 짝수 패리티로 묶는다.
이것이 해밍 코드의 우아한 점이다. 오류가 \(j\)번 위치에 나면 \(\mathbf{s}=\mathbf{H}\mathbf{e}^{\mathsf T}\)는 \(\mathbf{H}\)의 \(j\)번째 열, 즉 \(j\)의 2진수가 된다. \(r\)비트 패리티로 서로 다른 0이 아닌 신드롬을 \(2^r-1\)개 만들 수 있고, 이것이 \(n\)개 위치를 모두 가리켜야 하므로 해밍 한계 \(2^r\ge k+r+1\)이 나온다. \(k=64\)이면 \(r=7\)이면 충분하다.
해밍(7,4) 인코딩과 신드롬 디코딩
SECDED(72,64): 서버 메모리의 표준
데이터 64비트에 해밍 패리티 7비트, 그리고 전체 패리티 1비트를 더하면 72비트 코드워드가 된다. 이것이 SECDED(Single Error Correction, Double Error Detection) 코드이고, 오버헤드는 12.5%다. DDR4 ECC DIMM의 데이터 버스가 64비트가 아니라 72비트인 이유가 이것이다(x8 칩 9개 또는 x4 칩 18개). 디코딩 규칙은 간단하다. 신드롬이 0이 아니고 전체 패리티가 틀리면 홀수 개 오류이므로 1비트로 보고 정정한다. 신드롬이 0이 아닌데 전체 패리티가 맞으면 짝수 개, 즉 2비트 오류이므로 정정하지 않고 오류를 보고한다(머신 체크 예외). 실제 구현에서는 해밍 순서 대신 디코더 논리가 가벼워지도록 열을 고른 변형 코드(Hsiao 코드 등)를 많이 쓴다.
해밍 코드는 GF(2) 위의 선형 부호다. 인코딩은 생성 행렬 곱 \(\mathbf{c}=\mathbf{d}\,\mathbf{G}\)이고, 모든 코드워드는 \(\mathbf{H}\mathbf{c}^{\mathsf T}=\mathbf{0}\)을 만족한다. 두 코드워드의 XOR도 코드워드이므로 \(d_{min}\)은 0이 아닌 코드워드의 최소 무게(1의 개수)와 같다. 이 틀을 유한체 GF(2m)로 넓히면 여러 비트를 정정하는 BCH 코드와 바이트(심볼) 단위로 정정하는 리드-솔로몬 코드가 되고, \(\mathbf{H}\)를 아주 크고 성기게(sparse) 만들면 LDPC 코드가 된다.
DRAM 시스템의 ECC: 온다이, 사이드밴드, 칩킬
현대 DRAM 시스템은 ECC를 여러 겹으로 쌓는다. 각 층은 보호하는 범위와 목적이 다르다.
DDR5 온다이 ECC
DDR5는 모든 칩 내부에 ECC를 넣었다. 128비트 데이터마다 8비트 패리티를 붙인 (136,128) SEC 코드로 어레이에 저장하고, 읽을 때 칩 안에서 1비트 오류를 고친 뒤 내보낸다. 목적은 시스템 신뢰성보다는 미세화에 따른 셀 불량을 흡수하는 것이다. 셀이 작아져 약한 셀(리텐션 꼬리, VRT)이 늘어도 수율과 리프레시 주기를 지킬 수 있다. 호스트는 이 과정을 보지 못한다. 또 온다이 ECC에는 한계가 있다. ① 칩과 컨트롤러 사이 버스에서 난 오류는 막지 못한다. ② SEC 코드라서 한 코드워드에 2비트 오류가 나면 엉뚱한 비트를 고쳐 3비트 오류로 만들 수 있다(위 시뮬레이터 ②에서 본 현상). 그래서 서버는 온다이 ECC가 있어도 호스트 쪽 ECC를 따로 둔다. DDR5에는 칩이 스스로 어레이를 훑으며 오류를 고치고 개수를 보고하는 ECS(Error Check and Scrub)도 있다.
사이드밴드 ECC와 칩킬
메모리 컨트롤러가 데이터와 함께 ECC 비트를 별도 칩에 저장하는 방식이 사이드밴드 ECC다. DDR4 ECC DIMM은 72비트 폭(64+8)이다. DDR5 DIMM은 32비트 서브채널 두 개로 나뉘고, 서브채널마다 8비트 ECC를 붙여 40비트씩, 모두 80비트다(6장). 서버는 여기서 한 단계 더 나아가 칩킬(Chipkill, 인텔은 SDDC)을 쓴다. x4 칩 하나가 한 번의 접근에서 내보내는 비트들을 하나의 심볼로 묶고, 리드-솔로몬 같은 심볼 단위 부호로 보호한다. 그러면 칩 하나가 통째로 죽어 그 칩의 비트가 전부 틀려도 데이터를 복원할 수 있다. 현장 오류의 상당 부분이 칩 단위 고장이라는 점을 생각하면 SECDED보다 훨씬 강력하다.
HBM, LPDDR, 그리고 스크러빙
HBM은 AI 가속기에서 수 TB/s로 동작하고 다이를 여러 층 쌓기 때문에(7장) 신뢰성 요구가 높다. HBM2/2E는 채널마다 여분 비트를 ECC에 쓸 수 있었고, HBM3부터는 온다이 ECC와 ECS, 오류 심각도 보고가 규격에 들어갔다. 모바일·차량용 LPDDR은 버스 폭을 늘릴 여유가 없다. 그래서 컨트롤러가 ECC를 같은 DRAM의 일부 영역에 저장하는 인라인 ECC를 쓰기도 한다. 용량과 대역폭을 조금 희생하는 방식이다. LPDDR5에는 고속 링크 오류를 잡는 링크 ECC 옵션도 있다. 마지막으로, 소프트 에러가 한 워드에 두 개 쌓이면 SECDED도 못 고치므로 컨트롤러는 한가할 때 메모리 전체를 주기적으로 읽고 고쳐 쓰는 패트롤 스크러빙을 돌린다. 같은 위치에서 계속 오류가 나면 하드 오류로 판단해 PPR(Post-Package Repair)로 여분 로우에 재배치한다.
| 방식 | 부호 (예) | 오버헤드 | 정정 능력 | 적용 |
|---|---|---|---|---|
| 패리티 | 짝수 패리티 | 1/8 ~ 1/64 | 1비트 검출 | 캐시 태그, 버스 |
| SECDED | (72,64) 해밍/Hsiao | 12.5% | 1비트 정정, 2비트 검출 | DDR4 ECC DIMM, SRAM 캐시 |
| 온다이 ECC | (136,128) SEC | 6.25% | 코드워드당 1비트 정정 | DDR5, LPDDR5, HBM3 |
| 칩킬 / SDDC | 리드-솔로몬(심볼) | 12.5 ~ 25% | 칩 1개 전체 정정 | 서버 RDIMM |
| NAND BCH | BCH, 1 KB, t = 40 ~ 72 | ~7 ~ 12% | 코드워드당 t비트 | 2D NAND 시대 SSD |
| NAND LDPC | QC-LDPC, 2 ~ 4 KB | ~10 ~ 15% | RBER ~10⁻² 수준(소프트) | 현대 SSD, UFS |
NAND의 강력한 ECC: BCH에서 LDPC까지
DRAM의 원시 오류율이 10⁻¹² 이하인 것과 달리, 마모되고 오래 보관된 TLC·QLC NAND의 RBER은 10⁻³~10⁻²까지 올라간다. 1000비트 중 몇 개가 틀린다는 뜻이다. 이것을 UBER 10⁻¹⁵ 이하로 끌어내리려면 SECDED와는 차원이 다른 부호가 필요하다. 그래서 NAND ECC는 긴 코드워드(512 B~4 KB)에 많은 패리티를 붙인다. 긴 코드워드일수록 오류 개수가 평균 근처에 몰리므로(큰 수의 법칙) 같은 오버헤드로 더 높은 RBER을 견딘다.
코드워드 실패 확률과 UBER
각 비트가 독립적으로 확률 \(p\)(=RBER)로 틀린다고 하자. \(n\)비트 코드워드에서 오류 개수는 이항 분포를 따른다. \(t\)비트까지 정정하는 부호라면 오류가 \(t\)개를 넘을 때 실패한다.
BCH 코드는 오류 위치를 대수적으로 정확히 찾는다(신드롬 → 벌리캠프-매시 알고리즘 → 치엔 탐색). 정정 능력 \(t\)가 확정적이고 에러 플로어가 없다. 하지만 RBER이 높아지면 \(t\)와 패리티가 선형으로 늘고, 디코더 복잡도는 더 빠르게 늘어난다. 3D NAND와 TLC가 등장한 2010년대 중반부터 SSD는 LDPC(Low-Density Parity-Check)로 넘어갔다. LDPC는 크고 성긴 패리티 검사 행렬을 쓰고, 변수 노드와 검사 노드 사이에 확률 메시지를 반복해서 주고받는 빌리프 전파(belief propagation)로 디코딩한다. 이론 한계(섀넌 한계)에 가깝게 동작한다.
LDPC의 진가는 소프트 디시전에서 나온다. 하드 디시전 디코딩으로 대략 RBER ~4×10⁻³, 소프트 디시전으로 ~10⁻² 수준까지 다룰 수 있다(부호율 약 0.88~0.9, 설계에 따라 다름). 그래서 SSD 컨트롤러의 읽기 경로는 계단식이다. ① 빠른 하드 디코딩 → ② 실패하면 읽기 재시도(기준 전압 변경) → ③ 그래도 실패하면 여러 번 읽어 소프트 디코딩 → ④ 최후에는 칩 간 RAID 패리티(다이 하나를 잃어도 복원)를 쓴다. 대부분의 읽기는 ①에서 끝나지만 마모된 SSD일수록 ②~③이 늘어나 꼬리 지연이 길어진다(10장).
코드워드 실패 확률: 길이, 정정 능력, RBER
10⁻¹⁵은 1 PB(8×10¹⁵ 비트)를 읽을 때 정정 불가 오류가 약 8비트라는 뜻이다. 매일 1 TB씩 읽는 클라이언트 SSD라면 넉 달가량(125 TB, 10¹⁵비트) 읽어야 평균적으로 정정 불가 비트 하나를 만난다. 원시 RBER 10⁻³인 셀에서 여기까지 끌어내리는 것은 무려 12자릿수의 개선이다. 그리고 그 대가는 패리티 10~15%와 컨트롤러의 디코더 실리콘뿐이다. 오류 정정은 메모리 역사상 가장 효율적인 투자 중 하나다.
핵심 정리
- 메모리 오류는 소프트(일시적 반전), 하드(물리적 고장), 간헐(조건 의존) 오류로 나뉜다. 신뢰성은 FIT(10⁹ 소자·시간당 고장)와 MTBF = 10⁹/FIT로 표현하며, 시스템 FIT는 부품 FIT의 합이다.
- 소프트 에러는 알파 입자·중성자가 만든 전하가 \(Q_{crit}\approx C\Delta V\)를 넘을 때 생긴다. 비트당 SER은 줄었지만 다중 비트 업셋의 비중이 커졌다.
- DRAM 리텐션은 소수의 결함 셀로 이루어진 꼬리 분포가 좌우한다. 리텐션 시간은 10°C마다 약 절반으로 줄고, VRT·DPD 때문에 테스트만으로 약한 셀을 모두 찾기 어렵다.
- 로우 해머는 이웃 로우의 반복 활성화로 비트가 뒤집히는 현상이다. HCfirst는 139K(2014)에서 수천 수준으로 줄었다. TRR은 다면 공격에 뚫렸고, DDR5는 RFM과 PRAC으로 대응한다. RowPress처럼 열림 시간을 이용하는 변종도 있다.
- NAND는 P/E 마모(산화막 트랩), 리텐션(전하 손실, 온도 가속), 읽기·프로그램 디스터브로 Vt 분포가 이동하고 넓어지며, 이것이 RBER을 올린다. 컨트롤러는 읽기 재시도, 리드 리클레임, 웨어 레벨링으로 보정한다.
- 아레니우스 가속 계수 \(AF=\exp[\frac{E_a}{k}(\frac1{T_u}-\frac1{T_s})]\)로 고온 시험을 사용 조건으로 환산한다(Ea = 1.1 eV, 40→125°C에서 AF ≈ 6000). 같은 메커니즘이 지배한다는 가정이 필수다.
- \(d_{min}\ge2t+1\)이면 t비트를 정정할 수 있다. 해밍(7,4)의 신드롬은 오류 위치를 2진수로 가리키고, SECDED(72,64)는 전체 패리티를 더해 2비트 오류를 검출한다.
- DDR5는 온다이 ECC(136,128)로 셀 불량을 흡수하고, 서버는 사이드밴드 ECC와 칩킬로 칩 전체 고장까지 막는다. NAND는 긴 코드워드의 BCH에서 소프트 디시전 LDPC로 진화해 RBER ~10⁻²에서도 UBER 10⁻¹⁵~10⁻¹⁷을 달성한다.
확인 퀴즈
DRAM 칩 하나의 고장률이 20 FIT이다. 이 칩 50,000개로 구성된 시스템의 MTBF는?
TRR이 장착된 DDR4에서 로우 해머 공격이 여전히 성공할 수 있는 대표적인 방법은?
오래 보관한 NAND에서 프로그램 상태 Vt 분포가 주로 어떻게 변하고, 컨트롤러는 어떻게 대응하는가?
Ea = 1.1 eV인 메커니즘을 사용 온도 40°C에서 시험 온도 125°C로 가속하면 AF는 대략 얼마인가?
해밍(7,4) 수신 워드 0110111(위치 1→7)의 오류 위치는? (p₁: 1,3,5,7 / p₂: 2,3,6,7 / p₃: 4,5,6,7)
DDR5에 온다이 ECC가 있는데도 서버가 사이드밴드 ECC(칩킬)를 따로 쓰는 이유로 틀린 것은?