Chapter 03

SRAM과 캐시

CPU 다이 면적의 상당 부분은 연산기가 아니라 SRAM이다. 레지스터 파일, L1·L2·L3 캐시, TLB, 분기 예측기 — 모두 트랜지스터 6개짜리 셀 수억~수십억 개로 만든다. 이 장에서는 두 인버터가 서로를 붙잡는 '쌍안정 래치'에서 출발해, 읽기와 쓰기가 왜 서로 반대 방향의 설계를 요구하는지, 안정성을 어떻게 숫자(SNM)로 재는지, 그리고 그 셀들이 모여 어떻게 캐시가 되는지까지 따라간다.

왜 SRAM인가: 빠르지만 비싼 메모리

1장에서 본 메모리 계층의 맨 위, 프로세서 코어 바로 옆에는 SRAM(Static Random-Access Memory)이 있다. '정적(static)'이라는 이름은 전원이 켜져 있는 한 리프레시 없이 데이터를 유지한다는 뜻이다. 4장의 DRAM이 커패시터에 담긴 전하를 저장하고 그 전하가 새어 나가기 전에 주기적으로 다시 써 줘야 하는 것과 대조적이다. SRAM은 전하를 '담아 두는' 대신, 두 인버터가 서로의 출력을 끊임없이 되먹이며 논리값을 '붙잡아' 둔다.

그 대가로 셀 하나에 트랜지스터가 6개 필요하다. DRAM 셀(트랜지스터 1개 + 커패시터 1개)보다 면적이 10배 이상 크다. 대신 로직과 같은 공정으로 만들 수 있어 CPU·GPU 다이 안에 그대로 넣을 수 있고, 셀이 비트라인을 능동적으로 구동하므로 읽기가 빠르며(수백 ps~수 ns), 읽어도 데이터가 파괴되지 않는다.

항목SRAM (6T)DRAM (1T1C)
저장 원리교차 결합 인버터(래치)커패시터 전하
셀 면적 (최신 공정)약 0.02 µm² (≈ 100 F² 이상)약 0.0012~0.0013 µm² (6 F² 수준, 2024년 1b급)
리프레시불필요필요 (64 ms / 32 ms)
읽기비파괴, 셀이 BL을 방전파괴적 전하 공유 → 재기록
공정로직 공정과 동일 (임베디드)전용 공정 (별도 칩)
접근 시간L1 ~1 ns, L3 ~10 ns 수준수십 ns (tRCD + CL ≈ 30 ns)
주 용도레지스터 파일, 캐시, 버퍼메인 메모리, HBM

요즘 고성능 프로세서는 코어당 수십 KB의 L1, 1~3 MB의 L2, 칩 전체로 수십~수백 MB의 L3를 가진다. AMD의 3D V-Cache처럼 SRAM 다이를 따로 만들어 위에 쌓아(7장의 하이브리드 본딩) L3를 64 MB 더 얹는 제품까지 나왔다. SRAM은 이제 칩 면적과 전력 예산의 주인공 중 하나다.

쌍안정 래치와 6T 셀

인버터 두 개를 고리 모양으로 연결해 보자. 인버터 A의 출력이 인버터 B의 입력이 되고, B의 출력이 다시 A의 입력이 된다. 한쪽 노드 Q가 0이면 A가 QB를 1로 만들고, QB = 1은 B를 거쳐 다시 Q = 0을 만든다. 스스로 모순 없이 유지되는 상태다. Q = 1, QB = 0도 마찬가지로 자기 일관적이다. 이렇게 두 개의 안정 상태를 가진 회로를 쌍안정 회로(bistable circuit), 또는 래치(latch)라고 한다.

교차 결합 인버터 (cross-coupled) A B QB Q Q = 0 → QB = 1 → Q = 0 (자기 유지) Q = 1 → QB = 0 → Q = 1 (자기 유지) 두 곡선의 교점 = 평형점 안정 (Q=0) 안정 (Q=1) 준안정 V_Q → V_QB → A: QB=f(Q) B: Q=f(QB)
그림 3-1. 교차 결합 인버터(왼쪽)와 두 인버터의 전달 특성(오른쪽). 인버터 A의 곡선 QB = f(Q)와, 축을 바꿔 그린 인버터 B의 곡선 Q = f(QB)가 세 점에서 만난다. 양 끝 두 점은 안정, 가운데 점은 작은 교란에도 한쪽으로 굴러떨어지는 준안정점이다.

가운데 교점이 불안정한 이유는 인버터의 이득 때문이다. 전이 영역에서 인버터의 소신호 이득 \(|A_v|\)는 1보다 훨씬 크다. Q가 준안정점에서 \(\delta\)만큼 올라가면 QB는 \(|A_v|\delta\)만큼 내려가고, 이것이 다시 Q를 \(|A_v|^2\delta\)만큼 올린다. 루프 이득이 1보다 크면 교란은 기하급수적으로 커져 결국 한쪽 레일에 붙는다. 반대로 양 끝 안정점에서는 인버터가 포화되어 이득이 1보다 작으므로 교란이 줄어든다. 언덕 꼭대기(준안정)와 두 골짜기(안정)에 놓인 공을 떠올리면 된다. 이 '재생(regeneration)' 성질은 나중에 센스 앰프에서도 그대로 쓰인다.

6T 셀: 래치 + 문 두 개

래치만으로는 값을 읽거나 바꿀 수 없다. 여기에 NMOS 스위치 두 개를 달아 저장 노드 Q, QB를 각각 비트라인(BL, BLB)에 연결한 것이 표준 6T SRAM 셀이다. 스위치의 게이트는 행 방향으로 달리는 워드라인(WL)에 묶인다.

WL BL BLB V_DD PU1 PD1 PU2 PD2 PG1 PG2 Q QB 가운데 두 대각선은 교차만 할 뿐 연결되지 않는다
그림 3-2. 6T SRAM 셀. PU(풀업, PMOS)와 PD(풀다운, NMOS)가 인버터 두 개를 이루고, 서로의 출력을 게이트로 받는다(교차 결합). PG(패스게이트, 액세스 트랜지스터)는 WL이 켜질 때만 저장 노드 Q, QB를 비트라인 BL, BLB에 연결한다.

세 종류 트랜지스터의 역할을 정리하면 이렇다.

WL이 꺼져 있는 홀드(hold) 상태에서 셀은 바깥과 차단된 채 래치로 값을 유지한다. 이때 흐르는 전류는 트랜지스터의 서브문턱 누설뿐이다(2장). 셀당 수 pA~수십 pA라도 수억 개가 모이면 L3 캐시 하나의 대기 전력이 수십 mW에 이를 수 있어, 저전력 칩은 대기 중에 SRAM 전원을 낮추는(retention voltage) 기법을 쓴다.

읽기 동작과 읽기 교란

읽기는 네 단계로 진행된다. 셀이 Q = 0, QB = 1을 저장하고 있다고 하자.

  1. 프리차지: 비트라인 BL과 BLB를 둘 다 VDD로 충전하고 등화(equalize)한다. 두 선의 전압을 정확히 같게 맞춰야 작은 차이를 감지할 수 있다.
  2. WL 활성: 행 디코더가 한 워드라인을 올린다. 그 행의 모든 셀에서 PG가 켜진다.
  3. 차동 방전: Q = 0인 쪽에서 BL → PG1 → PD1 → 접지로 전류가 흘러 BL이 천천히 내려간다. QB = 1인 쪽은 양 끝이 모두 VDD라 전류가 흐르지 않는다. 결과적으로 BL과 BLB 사이에 작은 차 \(\Delta V\)가 생긴다.
  4. 센싱: \(\Delta V\)가 50~100 mV 정도 되면 센스 앰프를 켜(SAE) 이 차이를 풀 스윙 디지털 값으로 증폭한다. 곧바로 WL을 끄고 다시 프리차지한다.
① 프리차지 ② WL 활성 · 방전 ③ 센싱 ④ 복구(프리차지) PRE WL BL / BLB Q / QB SAE OUT BLB (그대로) BL (방전) ΔV ≈ 50~100 mV 읽기 교란: Q가 0에서 들뜸 QB = 1 OUT OUTB → 데이터 0
그림 3-3. 읽기 타이밍. 프리차지를 끈 뒤 WL을 올리면 '0'을 저장한 쪽 비트라인만 셀 전류로 방전된다. 차이가 충분히 벌어진 순간 SAE로 센스 앰프를 켜 풀 스윙으로 증폭하고, WL을 끄고 비트라인을 복구한다. 그 사이 셀 내부의 '0' 노드는 잠시 위로 들뜬다(읽기 교란).

비트라인 전압이 얼마나 빨리 벌어지는지는 셀 읽기 전류 \(I_{read}\)와 비트라인 커패시턴스 \(C_{BL}\)의 비로 정해진다.

$$\Delta V(t) \approx \frac{I_{read}\, t}{C_{BL}}, \qquad t_{BL} = \frac{C_{BL}\,\Delta V_{SA}}{I_{read}}$$
여기서 \(I_{read}\)는 PG와 PD의 직렬 경로가 흘릴 수 있는 전류(FinFET HD 셀에서 대략 20~40 µA @0.75 V), \(C_{BL}\)은 비트라인에 매달린 셀 수 × 셀당 접합·배선 용량(대략 0.1~0.2 fF/셀), \(\Delta V_{SA}\)는 센스 앰프가 믿고 판정할 수 있는 최소 차 전압이다.

예를 들어 비트라인에 셀 256개가 붙어 \(C_{BL} \approx 35\ \text{fF}\), \(I_{read} = 30\ \mu A\), \(\Delta V_{SA} = 80\ \text{mV}\)라면 \(t_{BL} \approx 35\text{f}\times0.08/30\mu \approx 93\ \text{ps}\)다. 셀 전류는 작고 비트라인은 길기 때문에, 비트라인을 끝까지 방전시키지 않고 작은 차이만 만든 뒤 센스 앰프에 맡기는 것이 SRAM 속도의 비결이다.

읽기 교란과 셀 비 β

문제는 3단계에서 생긴다. BL에서 흘러든 전류는 PG1을 통과해 Q 노드에 들어온 뒤 PD1로 빠져나간다. PG1과 PD1은 VDD(BL)와 접지 사이의 전압 분배기처럼 동작하므로 Q는 정확히 0 V에 머물지 못하고 \(\Delta V_Q\)만큼 떠오른다. 이 전압이 반대편 인버터(PU2/PD2)의 스위칭 문턱 \(V_M\)을 넘으면 QB가 내려가기 시작하고, 루프 이득 때문에 셀이 통째로 뒤집힌다. 읽다가 데이터를 지워 버리는 읽기 교란(read disturb, destructive read)이다.

읽기: PG ↔ PD 경쟁 BL = V_DD (프리차지) WL=1 PG Q: 0 → ΔV_Q QB=1 PD I_read PD가 PG보다 강할수록 ΔV_Q가 작다 → β↑ 쓰기: PU ↔ PG 경쟁 V_DD QB=0 PU Q: 1 → V_Q WL=1 PG BL = 0 (쓰기 드라이버) I_w PG가 PU보다 강해야 V_Q가 V_M 아래로 → PR↓
그림 3-4. 반쪽 회로로 본 두 가지 경쟁. 읽기 때는 PG가 BL 쪽으로 끌어올리고 PD가 접지로 붙잡는다(왼쪽). 쓰기 때는 PU가 1을 지키려 하고 PG가 쓰기 드라이버 쪽 0으로 끌어내린다(오른쪽). 같은 PG가 한쪽에서는 약해야, 다른 쪽에서는 강해야 한다.

교란의 크기를 정하는 것은 두 트랜지스터의 상대적 세기, 즉 셀 비(cell ratio, β ratio)다.

$$\beta \equiv CR = \frac{(W/L)_{PD}}{(W/L)_{PG}}, \qquad \Delta V_Q = (V_{DD}-V_{Tn})\,\frac{1+\beta-\sqrt{\beta(1+\beta)}}{1+\beta}$$
PG는 포화 영역(\(V_{GS}=V_{DS}=V_{DD}-\Delta V_Q\)), PD는 선형 영역에 있다고 보고 장채널 제곱 법칙으로 두 전류를 같게 놓아 푼 식이다(바디 효과·속도 포화 무시). 예: \(V_{DD}=0.8\) V, \(V_{Tn}=0.35\) V에서 \(\beta=1.2\)이면 \(\Delta V_Q \approx 0.12\) V, \(\beta=2\)이면 \(\approx 0.08\) V.

전통적인 평면 공정 설계 규칙은 \(\beta \gtrsim 1.2\sim2\)였다. PD 폭을 PG보다 넓혀 PD를 강하게 만드는 것이다. 그런데 β를 키우면 셀이 커지고, 뒤에서 볼 쓰기 능력은 PG의 세기에 달려 있으므로 PG를 마냥 약하게 할 수도 없다.

FinFET 시대의 β: 핀 개수로 양자화

FinFET·GAA에서는 트랜지스터 폭을 연속적으로 바꿀 수 없고 핀(또는 나노시트) 개수로만 정한다. 가장 작은 고밀도(HD) 셀은 PU:PG:PD = 1:1:1 핀(흔히 '111 셀')이라 기하학적 β가 1이다. 그래서 PG와 PD의 문턱 전압을 달리 주거나, 읽기 때 WL 전압을 살짝 낮추는(WL underdrive) 어시스트 회로(read/write assist)로 안정성을 확보한다. 고성능(HC) 셀은 PD 핀을 2개로 늘린 1:2:2 같은 구성을 쓴다.

반선택(half-select) 교란

WL은 한 행의 모든 셀을 동시에 연다. 컬럼 먹스로 일부 열만 쓰는 경우에도 같은 행의 나머지 셀들은 사실상 '읽기' 상태가 되어 읽기 교란을 똑같이 겪는다. 그래서 쓰기 동작 중에도 셀의 읽기 안정성이 필요하며, 이것이 8T 셀에서도 해결하기 까다로운 문제로 남는다.

쓰기 동작과 풀업비

Q = 1을 저장한 셀에 0을 쓴다고 하자. 쓰기 드라이버가 BL을 0 V로, BLB를 VDD로 강하게 구동한 뒤 WL을 올린다. 이제 Q 노드에서는 PU1(QB = 0이므로 켜져 있음)이 VDD로 끌어올리고, PG1이 BL = 0으로 끌어내린다(그림 3-4 오른쪽). PG1이 이겨서 Q를 반대편 인버터의 문턱 \(V_M\) 아래로 끌어내리면 QB가 올라가기 시작하고, 그 순간부터 래치의 재생이 도와 QB = 1, Q = 0으로 확정된다.

이 경쟁의 승패를 가르는 것이 풀업비(pull-up ratio, PR)다. 이 책에서는 PU의 세기를 PG로 나눈 값으로 정의한다(문헌에 따라 역수 PG/PU를 쓰기도 하니 방향을 꼭 확인하자).

$$PR = \frac{\mu_p (W/L)_{PU}}{\mu_n (W/L)_{PG}}, \qquad V_Q = (V_{DD}-V_{Tn}) - \sqrt{(V_{DD}-V_{Tn})^2 - PR\,(V_{DD}-|V_{Tp}|)^2}$$
PU는 포화, PG는 선형 영역이라고 보고 두 전류를 같게 놓은 결과다. 쓰기가 성공하려면 \(V_Q\)가 반대편 인버터가 반응할 만큼(대략 \(V_{Tn}\) 부근 이하) 내려가야 한다. \(V_{DD}=0.8\) V, \(V_T=0.35\) V라면 \(PR \lesssim 0.9\) 정도가 필요하다. 근호 안이 음수가 되면(PR이 너무 크면) PG가 포화되어 이 근사가 깨지고 Q는 높게 남는다.

정리하면 SRAM의 트랜지스터 세기 순서는 PD > PG > PU다. 읽기 안정성은 PD가 PG보다 강해야(β 큼), 쓰기 능력은 PG가 PU보다 강해야(PR 작음) 확보된다. PMOS는 정공 이동도가 낮아 같은 크기라도 약하므로 전통적으로 PR 조건을 맞추기 쉬웠다. FinFET에서는 PMOS 성능이 크게 좋아져(스트레인 SiGe 등) 오히려 PU가 너무 강해지는 문제가 생겼고, 음의 비트라인(negative BL) 같은 쓰기 어시스트가 표준이 됐다.

쓰기 마진(write margin)은 셀을 뒤집기 위해 BL을 얼마나 낮춰야 하는지(또는 WL을 얼마나 올려야 하는지)로 정의하는 경우가 많다. 예를 들어 BL 전압을 VDD에서 서서히 낮추며 셀이 뒤집히는 순간의 BL 전압을 쓰기 마진으로 삼는다. 이 값이 클수록 쓰기가 쉽다. 아래 시뮬레이터에서 PR을 키우거나 VDD를 낮추면 쓰기 시간이 길어지다가 결국 실패하는 것을 볼 수 있다.

SIMULATOR

6T 셀 읽기/쓰기 과도 응답

—
동작
저장값 Q
재생
셀 전류 Iread (최대)—
ΔV @SAE—
읽기 교란 ΔVQ 최대—
결과—
해볼 것: ① 읽기에서 β를 3 → 0.3으로 낮추면 '0' 노드의 들뜸(ΔVQ)이 수십 mV에서 수백 mV로 커진다. 이 모델의 대칭 셀은 버티지만, 문턱 전압 변동이 더해지면 실제로 뒤집힌다(아래 버터플라이 시뮬레이터에서 확인). ② 비트라인당 셀 수를 512로 늘리면 같은 SAE 시점의 ΔV가 절반으로 준다. ③ 쓰기에서 PR을 2.5 이상으로 키우면 PU가 PG를 이겨 쓰기가 실패한다. 파형 영역을 누르거나 끌면 시점을 옮길 수 있다.

버터플라이 곡선과 정적 잡음 여유

'이 셀은 얼마나 안정한가?'를 하나의 숫자로 답하는 표준 지표가 정적 잡음 여유(SNM, Static Noise Margin)다. 그림 3-1의 두 곡선을 겹친 그림은 나비 날개처럼 생겨서 버터플라이 곡선(butterfly curve)이라 부른다. 두 날개(로브) 안에 들어가는 가장 큰 정사각형의 한 변이 SNM이다(Seevinck, 1987).

왜 정사각형일까? 두 저장 노드에 크기가 같은 직류 잡음 전압 \(V_n\)이 반대 방향으로 직렬로 끼어든다고 하자. 이는 한 곡선을 오른쪽으로, 다른 곡선을 위쪽으로 \(V_n\)만큼 평행 이동시키는 것과 같다. 이동이 커져 두 곡선이 한 로브 안에서 서로 접하면 그 로브의 안정점이 사라지고 셀은 반대 상태로 넘어간다. 두 곡선이 접할 때까지 버틸 수 있는 최대 \(V_n\)이 바로 그 로브에 내접하는 정사각형의 변 길이다. 두 로브 중 작은 쪽이 셀의 SNM이다.

홀드 (WL = 0) 읽기 (WL = 1, BL = BLB = V_DD) V_Q (0 → 0.8 V) V_Q (0 → 0.8 V) SNM_hold ≈ 340 mV SNM_read ≈ 194 mV V_QB V_QB '0' 레벨이 들떠 날개가 좁아짐
그림 3-5. VDD = 0.8 V, β = 2, PR = 0.5인 셀의 버터플라이 곡선(이 장의 시뮬레이터와 같은 EKV 트랜지스터 모델로 계산). 읽기 상태에서는 PG가 '0' 노드를 끌어올려 곡선의 낮은 쪽 꼬리가 들리고, 날개에 들어가는 정사각형이 크게 줄어든다. 읽기 SNM이 홀드 SNM보다 훨씬 작은 것이 6T 셀의 근본 약점이다.

그림에서 보듯 SNM은 상태에 따라 세 가지로 나눠 본다.

곡선 좌표를 45° 회전시키면 정사각형 찾기가 간단해진다. 기울기 1인 직선 \(V_{QB} = V_Q + c\) 위에서 두 곡선과의 교점 사이 가로 거리 \(d(c)\)를 재면, 정사각형의 두 꼭짓점은 항상 이런 대각선 위에 놓이므로

$$\text{SNM} = \min\Big(\max_{c}\, d(c),\ \max_{c}\, \big[-d(c)\big]\Big), \qquad d(c) = x_A(c) - x_B(c)$$
\(x_A(c)\), \(x_B(c)\)는 직선 \(V_{QB}=V_Q+c\)가 곡선 A, B와 만나는 점의 \(V_Q\) 좌표. \(d>0\)인 구간이 한 날개, \(d<0\)인 구간이 다른 날개다. 아래 시뮬레이터가 이 방법으로 SNM을 계산한다.
SIMULATOR

버터플라이 곡선과 SNM

상태
SNM—
좌상 로브 (Q=0)—
우하 로브 (Q=1)—
판정—
해볼 것: ① 홀드 ↔ 읽기를 번갈아 눌러 날개가 얼마나 줄어드는지 보자. ② 읽기에서 β를 3 → 0.5로 줄이면 SNM이 감소한다. ③ σVt를 40 mV로 두고 '변동 샘플 뽑기'를 여러 번 누르면 두 날개가 비대칭이 되고, 가끔 한쪽 날개가 거의 사라지는 셀이 나온다 — 이것이 뒤의 Vmin 문제다. ④ '쓰기 0'에서 PR을 올리면 어느 순간 날개가 다시 생긴다(쓰기 실패).
SNM 말고 N-곡선

SNM은 전압만 보는 지표라, 셀을 뒤집는 데 필요한 전류에 대한 정보가 없다. 그래서 저전압 설계에서는 노드에 전압을 강제로 인가하며 흘러드는 전류를 재는 N-곡선(N-curve)을 함께 쓴다. N-곡선의 최대 전류(SINM)와 전압 폭(SVNM)은 읽기 안정성을, 쓰기 쪽 전류(WTI)는 쓰기 능력을 나타낸다. 측정도 단일 스윕으로 가능해 실리콘 특성화에 편리하다.

센스 앰프: 작은 차이를 디지털로

셀이 비트라인에 만든 수십 mV의 차이를 0 V / VDD의 디지털 값으로 바꾸는 회로가 센스 앰프(Sense Amplifier, SA)다. SRAM에서 가장 흔한 형태는 래치형 센스 앰프(latch-type SA)로, 구조가 SRAM 셀과 똑같은 교차 결합 인버터에 꼬리(tail) 트랜지스터를 단 것이다. 먼저 격리 스위치(ISO)를 통해 BL, BLB 전압을 내부 노드에 옮기고, 격리한 뒤 SAE로 꼬리 트랜지스터를 켜면 루프 이득이 작은 차이를 기하급수적으로 키운다. 그림 3-1에서 본 준안정점 근처의 '굴러떨어짐'을 일부러 이용하는 것이다.

V_DD OUT OUTB SAE ISO ISO BL BLB 재생: 차이가 지수적으로 성장 SAE ↑ ΔV_in t_d ≈ τ · ln(V_DD / (ΔV_in − V_os))
그림 3-6. 래치형 센스 앰프(왼쪽)와 재생 파형(오른쪽). 격리 스위치로 비트라인 전압을 내부 노드에 옮긴 뒤 SAE를 켜면, 교차 결합 인버터가 입력 차이를 \(e^{t/\tau}\)로 키운다. 입력보다 큰 오프셋이 있으면 반대로 판정한다.

재생 초기에는 두 노드가 준안정점 근처에서 선형 증폭기처럼 동작하므로 차이 전압은 다음처럼 자란다.

$$v_d(t) = (\Delta V_{in} - V_{os})\, e^{t/\tau}, \qquad \tau = \frac{C_{out}}{g_m}, \qquad t_d \approx \tau \ln\frac{V_{DD}}{|\Delta V_{in} - V_{os}|}$$
\(C_{out}\)은 출력 노드 용량, \(g_m\)은 교차 결합 트랜지스터의 트랜스컨덕턴스, \(V_{os}\)는 두 쪽 트랜지스터의 문턱 전압 불일치 등에서 오는 입력 환산 오프셋이다. 입력이 작을수록 결정 시간이 로그적으로 늘어나고, \(\Delta V_{in} < V_{os}\)이면 틀린 값으로 결정된다.

SA 오프셋은 트랜지스터 불일치에서 오는 확률 변수라, 칩의 수만 개 SA 모두가 올바로 판정하려면 \(\Delta V_{in}\)이 오프셋 표준편차 \(\sigma_{os}\)(보통 10~20 mV)의 5~6배는 되어야 한다. 그래서 50~100 mV가 전형적인 목표가 된다. ΔV를 키우려면 SAE를 늦춰야 하고(속도 손해), 오프셋을 줄이려면 SA 트랜지스터를 키워야 한다(면적 손해). 4장의 DRAM 비트라인 센스 앰프도 같은 교차 결합 구조지만, 셀이 스스로 비트라인을 구동하지 못하고 전하 공유만 하므로 신호가 훨씬 작다.

SIMULATOR

센스 앰프 차동 증폭과 오프셋

ΔV @SAE—
이 SA의 Vos—
판정 / 결정 시간—
오판정 확률 P(Vos > ΔV)—
해볼 것: ① SAE 시점을 20 ps까지 당기고 '새 SA 샘플'을 여러 번 눌러 보자 — 오판정이 자주 나온다. ② ΔV가 σos의 6배쯤 되도록 SAE 시점을 맞추면 오판정 확률이 10-9 수준이 된다. ③ 입력이 오프셋과 비슷할 때 결정 시간이 얼마나 길어지는지(준안정) 관찰하자.

SRAM 어레이와 스케일링 둔화

셀들을 행과 열로 배열하고 주변 회로를 붙인 단위를 SRAM 매크로(macro)라 한다. 주소가 들어오면 상위 비트는 행 디코더로 가서 한 WL을 고르고, 하위 비트는 컬럼 먹스를 제어해 한 행의 여러 열 가운데 일부만 센스 앰프나 쓰기 드라이버에 연결한다.

매크로 하나 (서브어레이) 행 디코더 선택된 WL 예: 256행 × 256열 (BL/BLB 쌍) 컬럼 먹스 (예: 4:1, 비트 인터리빙) 센스 앰프 · 쓰기 드라이버 · 프리차지 제어 타이밍 데이터 I/O (64비트) 행 주소 열 주소 뱅크 구성 뱅크 0 뱅크 1 뱅크 2 뱅크 3 H-트리 주소/데이터 배선 활성 뱅크만 동작 → 전력 절약
그림 3-7. SRAM 매크로의 구성(왼쪽)과 뱅크 배치(오른쪽). 비트라인이 길수록 \(C_{BL}\)이 커져 느려지므로, 큰 캐시는 수백 행 크기의 서브어레이 수백~수천 개로 쪼개고 H-트리로 연결한다. 컬럼 먹스로 인접 열을 서로 다른 워드에 배정(비트 인터리빙)하면 방사선이 인접 셀 여러 개를 뒤집어도 워드당 1비트 오류로 흩어져 ECC로 고칠 수 있다(11장).

배열 크기는 속도·전력·면적의 절충이다. 비트라인을 짧게(행 수를 적게) 하면 빠르지만 주변 회로 비율이 늘어 면적 효율(array efficiency)이 떨어진다. WL을 길게 하면 WL 지연과 RC가 커지고, 반선택 셀이 늘어 전력이 증가한다. 그래서 L1은 작은 서브어레이로 빠르게, L3는 큰 서브어레이로 조밀하게 만든다. 매크로 밀도는 셀 면적의 70% 수준이 보통이다.

SRAM 스케일링의 벽

오랫동안 SRAM 셀은 로직과 함께 세대마다 약 0.5배씩 줄었다. 그러나 FinFET 이후 감소폭이 급격히 줄었고, 3nm급에서는 사실상 멈췄다.

공정 (TSMC 기준)HD 6T 셀 면적 (µm²)이전 세대 대비비고
16nm FinFET (2015)≈ 0.074—첫 FinFET
N7 (2018)≈ 0.027(10nm 0.042 대비) ≈ 0.64×
N5 (2020)≈ 0.021≈ 0.78×EUV 본격 도입
N3E (2023)≈ 0.021≈ 1.0× (축소 없음)로직은 약 1.6× 조밀
N2 (2025~)≈ 0.0175 (발표치)≈ 0.83×GAA 나노시트, 약 38 Mb/mm² (2024 IEDM)

이유는 세 가지다. 첫째, 셀은 이미 금속 배선·게이트 피치의 최소 규칙으로 꽉 차 있어 '빈 공간'이 없다. 둘째, 핀 개수가 1개인 트랜지스터는 더 줄일 폭이 없고, 핀 하나에 몰린 무작위 변동(σVt)이 셀 안정성을 위협한다. 셋째, 셀이 작아질수록 비트라인·워드라인 배선 저항이 커져 성능이 떨어진다. 결과적으로 칩에서 SRAM이 차지하는 면적 비중이 커졌고, 이것이 L3 캐시를 별도 다이로 떼어 쌓는(3D V-Cache) 설계나, 캐시를 구형 공정 칩렛으로 옮기는 설계가 등장한 배경이다.

셀 면적을 F²로 환산하면

N5의 0.021 µm²를 최소 금속 피치의 절반(약 14 nm) 기준 F²로 환산하면 100 F²가 넘는다. DRAM의 6 F²와 비교하면 비트당 면적이 한 자릿수 이상 크다. 같은 면적에 DRAM이 훨씬 많은 비트를 담을 수 있어도 캐시에 SRAM을 쓰는 것은, 로직 공정과 통합되고 몇 사이클 만에 응답하기 때문이다.

저전압 동작: 8T 셀, Vmin, 변동성

동적 전력은 \(P \propto C V_{DD}^2 f\)라서 전압을 낮추는 것이 가장 강력한 전력 절감 수단이다. 로직은 0.5 V 근처까지 문제없이 내려가지만, SRAM은 대개 그보다 먼저 실패한다. 칩이 정상 동작하는 최저 전압을 Vmin이라 하며, 많은 SoC에서 Vmin은 SRAM이 결정한다.

원인은 무작위 변동이다. 트랜지스터 채널에 들어 있는 도펀트 원자 수, 게이트 금속의 결정립, 핀 폭 편차 때문에 같은 설계라도 트랜지스터마다 문턱 전압이 조금씩 다르다. Pelgrom 법칙에 따르면 그 표준편차는 게이트 면적의 제곱근에 반비례한다.

$$\sigma_{V_t} = \frac{A_{VT}}{\sqrt{W L}}$$
\(A_{VT}\)는 공정 상수(대략 1~2 mV·µm). SRAM 트랜지스터는 칩에서 가장 작아 σVt가 수십 mV에 이른다(2장). 셀 여섯 개 트랜지스터가 각자 다르게 흔들리면 두 인버터가 비대칭이 되어 한쪽 날개가 줄어든다.

캐시 하나에는 셀이 수천만~수십억 개 있으므로, '평균적인 셀'이 아니라 가장 나쁜 셀이 설계를 결정한다. 32 MB L3라면 약 2.7×108비트다. 수율 99%를 얻으려면 셀 실패 확률이 약 \(3.7\times10^{-11}\) 이하, 정규분포로 치면 평균에서 약 6.5σ 떨어진 꼬리까지 안전해야 한다. 이런 확률은 직접 셀 수 없으므로, 수천 번의 몬테카를로(Monte Carlo) 시뮬레이션으로 SNM 분포의 평균 μ와 표준편차 σ를 구한 뒤 가우시안으로 꼬리를 외삽하거나, 중요도 샘플링(importance sampling) 같은 기법을 쓴다.

$$p_{fail} = \Phi\!\left(-\frac{\mu_{SNM}}{\sigma_{SNM}}\right), \qquad Y_{array} = (1-p_{fail})^{N}\approx e^{-N p_{fail}}$$
\(\Phi\)는 표준정규 누적분포, \(N\)은 비트 수. μ/σ를 흔히 '시그마 수'라 부르며, 대용량 캐시는 6σ 이상을 목표로 한다. 실제로는 ECC와 여분 행·열(redundancy)로 일부 실패를 흡수한다.

8T 셀: 읽기 경로를 떼어 내다

6T 셀의 근본 약점은 읽기 전류가 저장 노드를 거쳐 흐른다는 것이다. 8T 셀은 트랜지스터 두 개로 된 별도 읽기 포트를 붙여 이 문제를 없앤다. 읽기 때는 읽기 워드라인(RWL)만 켜고, 저장 노드 QB는 읽기 트랜지스터의 게이트만 구동한다. 게이트로는 전류가 흐르지 않으므로 읽기가 셀을 교란하지 않는다. 읽기 SNM이 홀드 SNM과 같아지는 셈이다.

6T 코어 (쓰기 포트: WWL, WBL, WBLB) Q QB WBL WBLB PG PG M7 (게이트 = QB) RWL M8 RBL 읽기 포트: QB는 게이트만 본다
그림 3-8. 8T SRAM 셀. 왼쪽의 6T 코어는 쓰기 전용으로 쓰고, 오른쪽의 M7·M8 직렬 경로가 단일 읽기 비트라인(RBL)을 방전시킨다. QB = 1이면 M7이 켜져 RBL이 내려가고, QB = 0이면 RBL이 그대로 남는다. 셀 면적은 6T보다 약 30% 크지만 읽기와 쓰기를 독립적으로 최적화하고, 읽기·쓰기 포트를 동시에 쓸 수도 있다.

8T는 면적 부담 때문에 L1 캐시나 레지스터 파일처럼 작고 저전압·다중 포트가 중요한 곳에 주로 쓰인다. 대용량 L2·L3는 여전히 6T에 WL 언더드라이브, 음의 비트라인, 셀 전원 낮추기(cell supply collapse) 같은 어시스트를 조합해 Vmin을 낮춘다. HD 6T 셀의 Vmin은 공정과 어시스트에 따라 대략 0.6~0.7 V 수준이며, 어시스트로 0.5 V대까지 끌어내린 발표도 있다.

SIMULATOR

Vmin 몬테카를로

셀 종류 (평가 SNM)
어레이 용량 (수율 99% 목표)
실행
SNM 평균 μ / 표준편차 σ—
시그마 수 μ/σ (목표)—
셀 실패 확률 / 어레이 수율—
추정 Vmin—
해볼 것: 셀 여섯 트랜지스터에 σVt만큼 무작위 문턱 전압을 주고 버터플라이 시뮬레이터와 같은 모델로 SNM을 계산한다(β = 2, PR = 0.5 고정). ① VDD를 0.5 V로 낮춰 1000개를 돌리면 분포가 0 쪽으로 다가간다. ② 'Vmin 스윕'으로 VDD별 μ/σ를 그리고 목표선과의 교점을 보자. ③ 8T로 바꾸면 같은 σVt에서도 Vmin이 크게 내려간다. ④ 용량을 64 MB로 늘리면 필요한 시그마 수가 올라가 Vmin이 오른다.

SRAM으로 만드는 캐시

캐시는 SRAM 배열 두 개로 이루어진다. 실제 데이터를 담는 데이터 배열과, 그 데이터가 메인 메모리의 어느 주소에서 왔는지 기록하는 태그 배열이다. 캐시는 데이터를 캐시 라인(cache line, 블록) 단위(보통 64 B)로 옮긴다. 1장에서 본 공간 지역성을 활용하기 위해서다.

사상 방식: 블록이 들어갈 수 있는 자리

태그 (tag) 인덱스 (index) 오프셋 주소 같은 세트 안에서 비교 세트 선택 라인 안 바이트 직접 사상 (1-way) 047 블록 12 12 mod 8 = 4 → 한 자리뿐 2-way 세트 연관 세트0세트3 way 0way 1 12 mod 4 = 0 → 두 자리 중 하나 완전 연관 어디든 가능 → 태그 8개 동시 비교 (8라인 캐시에 메모리 블록 12를 넣는 경우)
그림 3-9. 주소 분해(위)와 세 가지 사상 방식(아래). 인덱스로 세트를 고르고, 그 세트의 모든 way에서 태그를 동시에 비교해 일치하는 것이 있으면 히트다. 연관도가 높을수록 충돌 미스가 줄지만 비교기와 먹스가 늘어 느려지고 전력이 커진다.

용량 \(C\), 라인 크기 \(B\), 연관도 \(A\)인 캐시의 세트 수와 주소 필드 폭은 다음과 같다.

$$S = \frac{C}{B\cdot A}, \qquad b_{offset} = \log_2 B,\quad b_{index} = \log_2 S,\quad b_{tag} = n_{addr} - b_{index} - b_{offset}$$
예: 32 KB, 8-way, 64 B 라인, 48비트 물리 주소 → \(S = 32768/(64\cdot8) = 64\) 세트, 오프셋 6비트, 인덱스 6비트, 태그 36비트.
tag 36비트index 6비트offset 6비트

흥미로운 점: 32 KB·8-way·64 B L1에서 인덱스+오프셋은 12비트로, 4 KB 페이지 오프셋과 정확히 같다. 그래서 가상 주소로 세트를 고르면서 동시에 TLB에서 물리 태그를 얻는 VIPT(Virtually Indexed, Physically Tagged) 구조가 앨리어싱 없이 가능하다. L1 용량을 늘리려면 연관도도 함께 늘려야 하는 이유다(48 KB 12-way 등).

SIMULATOR

주소 분해기: tag / index / offset

라인 크기
연관도
주소 폭
세트 수 × way—
tag / index / offset—
태그 배열 크기—
태그 오버헤드—
해볼 것: ① 용량을 고정하고 연관도를 1 → 완전으로 바꾸면 인덱스 비트가 태그로 넘어간다. ② 라인을 128 B로 키우면 태그 오버헤드가 줄지만(라인당 태그 하나) 미스 한 번에 옮길 데이터가 늘어난다. ③ 32 KB·8-way·64 B에서 인덱스+오프셋이 12비트(4 KB 페이지)인지 확인하자. 태그 배열은 태그 + valid + dirty 2비트로 계산했다.

교체 정책과 쓰기 정책

세트가 가득 찬 상태에서 미스가 나면 한 라인을 쫓아내야 한다. LRU(Least Recently Used)는 가장 오래 쓰지 않은 라인을 버린다. 시간 지역성이 있는 대부분의 프로그램에서 잘 동작하지만, way 수보다 딱 조금 큰 작업 집합을 순환하면 매번 곧 쓸 라인을 버려 히트율이 0%가 되는 병적인 경우가 있다. 실제 하드웨어는 정확한 LRU 대신 비트 수가 적은 트리 PLRU나, 스캔에 강한 RRIP 계열을 쓴다. FIFO와 무작위 교체는 구현이 간단하다.

쓰기에는 두 가지 선택이 있다. 라이트 스루(write-through)는 쓸 때마다 하위 계층에도 쓰고, 라이트 백(write-back)은 캐시에만 쓰고 dirty 비트를 세운 뒤 라인이 쫓겨날 때 한꺼번에 내려보낸다. 쓰기 미스에서는 라인을 가져와서 쓰는 write-allocate와 그냥 아래로 보내는 no-write-allocate가 있다. 현대 CPU의 L1D·L2·L3는 대부분 write-back + write-allocate다.

미스의 3C 분류

미스는 원인에 따라 세 가지로 나눈다. 강제 미스(compulsory): 처음 접근하는 블록이라 무조건 나는 미스. 용량 미스(capacity): 같은 크기의 완전 연관 캐시에서도 나는 미스, 즉 작업 집합이 캐시보다 크다. 충돌 미스(conflict): 완전 연관이라면 히트였을 텐데 세트가 좁아서 난 미스. 연관도를 높이면 충돌 미스가, 용량을 늘리면 용량 미스가, 라인을 키우거나 프리페치하면 강제 미스가 준다. 아래 시뮬레이터는 같은 용량의 완전 연관 LRU 캐시를 그림자로 함께 돌려 이 분류를 계산한다.

SIMULATOR

세트 연관 캐시 시뮬레이터

세트 수
연관도 (way)
교체 정책
접근 패턴
실행
접근 수0
히트율—
미스: 강제 · 용량 · 충돌—
마지막 접근—
라인 16 B, 12비트 주소. 해볼 것: ① '순차'는 4바이트씩 읽어 라인당 미스 1번, 히트율 75%(공간 지역성). ② '충돌'은 같은 세트로 가는 블록 (way+1)개를 번갈아 읽어 LRU·FIFO에서 히트 0% — 연관도를 올리면 사라진다. ③ '큰 루프'는 용량보다 한 세트분 큰 작업 집합을 도는데, LRU는 0%지만 무작위 교체는 일부 히트를 건진다. ④ 각 칸의 작은 숫자는 LRU 순위(0 = 최근)다.

캐시 성능은 결국 1장의 평균 메모리 접근 시간으로 요약된다. \(AMAT = t_{hit} + m \cdot t_{miss}\). 연관도를 높이면 \(m\)이 줄지만 \(t_{hit}\)이 늘어난다. 그래서 L1은 작고 빠르게(4~5 사이클, 8~12-way), L2는 중간(약 12~16 사이클), L3는 크고 연관도가 높게(수십 사이클, 12~16-way) 만드는 계층 구조가 자리 잡았다. 캐시와 DRAM을 합친 시스템 수준 설계는 13장에서 다시 다룬다.

핵심 정리

  1. SRAM 셀은 교차 결합 인버터(쌍안정 래치)로 값을 붙잡는다. 두 안정점과 하나의 준안정점이 있고, 루프 이득 > 1이 재생을 만든다.
  2. 6T 셀 = PU 2 + PD 2 + PG 2. 세기 순서는 PD > PG > PU. 로직과 같은 공정이라 임베디드가 쉽고, 리프레시가 필요 없으며 읽기가 비파괴적이다.
  3. 읽기: 프리차지 → WL → 차동 방전(\(\Delta V = I_{read}t/C_{BL}\)) → 센스 앰프. PG–PD 분배로 '0' 노드가 들뜨는 읽기 교란을 막으려면 셀 비 β = PD/PG가 커야 한다.
  4. 쓰기: 쓰기 드라이버가 한 BL을 0으로 끌고 PG가 PU를 이겨야 한다. 풀업비 PR = PU/PG가 작아야 하며, 읽기 안정성과 쓰기 능력은 상충한다.
  5. SNM은 버터플라이 곡선의 두 날개에 내접하는 최대 정사각형의 한 변이다. 읽기 SNM ≪ 홀드 SNM이며, VDD·β·문턱 전압 변동에 민감하다.
  6. 래치형 센스 앰프는 \(e^{t/\tau}\)로 차이를 키우며, ΔV는 SA 오프셋 σ의 수 배(50~100 mV)가 필요하다.
  7. SRAM 셀 면적은 N5 ≈ 0.021 µm²에서 N3E에서 정체되어 스케일링이 둔화됐다. Vmin은 무작위 변동과 최악의 셀이 정하며, 8T 셀·어시스트·몬테카를로 기반 6σ 설계로 대응한다.
  8. 캐시: \(S = C/(B\cdot A)\), 주소 = tag | index | offset. 연관도는 충돌 미스를 줄이고, 교체(LRU 등)·쓰기(write-back) 정책과 3C 분류로 성능을 분석한다.

확인 퀴즈

1. 6T 셀의 읽기 교란(읽기 중 '0' 노드가 들떠 셀이 뒤집힘)을 줄이는 가장 직접적인 방법은?

읽기 때 '0' 노드 전압은 PG(BL 쪽으로 끌어올림)와 PD(접지로 끌어내림)의 분배로 정해진다. PD가 강할수록(β = PD/PG가 클수록) 들뜸이 작다. WL을 높이면 PG가 강해져 오히려 나빠진다(그래서 WL 언더드라이브 어시스트를 쓴다).

2. Q = 1인 셀에 0을 쓰려 한다. 쓰기가 성공하려면 어느 트랜지스터가 어느 트랜지스터를 이겨야 하는가?

Q 노드에서는 켜져 있는 PU1이 VDD로 붙잡고, PG1이 BL = 0으로 끌어내린다. PG1이 이겨 Q를 반대편 인버터의 문턱 아래로 내려야 래치가 뒤집힌다. 그래서 풀업비 PR = PU/PG는 작아야 한다.

3. 버터플라이 곡선에서 SNM은 무엇으로 정의하는가?

두 노드에 직렬로 들어오는 직류 잡음 \(V_n\)은 두 곡선을 각각 가로·세로로 \(V_n\)만큼 이동시킨다. 한 날개가 사라질 때까지의 최대 \(V_n\)이 그 날개에 내접하는 정사각형의 변이고, 두 날개 중 작은 쪽이 SNM이다.

4. 32 KB, 8-way 세트 연관, 64 B 라인, 48비트 주소 캐시의 태그 비트 수는?

세트 수 = 32768 / (64 × 8) = 64 → 인덱스 6비트, 오프셋 log₂64 = 6비트. 태그 = 48 − 6 − 6 = 36비트.

5. 8T 셀이 6T 셀보다 저전압에서 유리한 가장 큰 이유는?

8T의 읽기 포트는 저장 노드 QB를 트랜지스터 게이트로만 받으므로 읽기 전류가 저장 노드를 흔들지 않는다. 대신 면적이 약 30% 크고 누설 경로도 더 많으며, 읽기 비트라인은 단일(single-ended)이다.

6. 4-way 세트 하나에 매핑되는 블록 5개를 A, B, C, D, E, A, B, … 순서로 반복 접근한다. LRU 교체 시 정상 상태의 히트율은?

E가 들어올 때 가장 오래된 A가 쫓겨나고, 다음에 A를 접근하면 B가 쫓겨나는 식으로 항상 '곧 쓸' 블록을 버린다. 작업 집합이 way 수보다 하나만 커도 LRU는 매번 미스다. 무작위 교체라면 일부는 히트한다.