Chapter 14

클럭·리셋·클럭 도메인

휴대폰 기판 위에는 쌀알만 한 금속 깡통이 하나 있다. 그 안의 얇은 수정 조각이 1초에 3,840만 번 떨린다. SB-1의 큰 코어는 이 떨림을 100배 가까이 부풀린 3.8 GHz로 뛰고, GPU는 1 GHz, 메모리 컨트롤러는 또 다른 박자로 뛴다. 하나의 기준 박자에서 수십 개의 서로 다른 박자를 만들고, 그것을 칩 구석구석 수십억 개의 플립플롭에 몇 ps 오차로 동시에 전하고, 박자가 다른 블록끼리 데이터를 잃지 않고 건네는 일. 이 장은 그 클럭의 이야기다. 그리고 모든 것을 깨끗한 출발점에 세우는 리셋도 함께 다룬다.

수정 발진기에서 GHz까지: PLL

모든 클럭의 뿌리는 칩 밖의 수정 발진기(Crystal oscillator)다. 수정은 압전 효과로 정해진 주파수에서만 기계적으로 공진하므로, 온도가 변해도 주파수가 백만분의 수십(수십 ppm) 이내로 정확하다. 스마트폰은 보통 19.2 MHz나 38.4 MHz 수정(모뎀의 무선 규격과 맞추기 좋은 값)과, 시계용 32.768 kHz 수정을 함께 쓴다. 32,768 = 215이라 15번 반으로 나누면 정확히 1초가 된다.

그런데 수정은 수십 MHz 이상을 직접 만들기 어렵다. GHz 클럭은 칩 안의 VCO(Voltage-controlled oscillator, 전압 제어 발진기)가 만든다. VCO는 제어 전압에 따라 주파수가 바뀌는 링 발진기나 LC 발진기인데, 혼자 두면 온도와 전압에 따라 주파수가 수 %씩 떠다닌다. 그래서 VCO 출력을 N으로 나눠(분주) 수정 클럭과 비교하고, 어긋나면 제어 전압을 고쳐 주는 되먹임 고리를 만든다. 이것이 위상 고정 루프(PLL, Phase-locked loop)다. 고리가 잠기면 나눈 클럭이 기준 클럭과 박자가 같아지므로 \(f_{\text{out}} = N\cdot f_{\text{ref}}\)가 된다.

고리의 첫 단계는 위상·주파수 검출기(PFD, Phase-frequency detector)다. 기준 클럭 에지가 먼저 오면 UP 펄스를, 되먹임 클럭 에지가 먼저 오면 DN 펄스를 낸다. 펄스 폭이 곧 위상 차다. 아래에서 되먹임 클럭의 주파수와 위상을 바꿔 보자.

평균 (UP − DN)—
PFD의 판정—
그림 14-1. 만져 보기위 두 줄은 기준 클럭(ref)과 VCO를 N으로 나눈 되먹임 클럭(fb), 아래 두 줄은 PFD 출력이다. ref의 상승 에지가 UP을 켜고 fb의 상승 에지가 DN을 켜며, 둘 다 켜지는 순간 둘 다 꺼진다. fb가 늦으면 UP 펄스가 넓어지고(→ VCO를 빠르게), 빠르면 DN 펄스가 넓어진다. 주파수가 다르면 펄스 폭이 매 주기 자라나 한쪽으로 쏠리므로, PFD는 위상뿐 아니라 주파수 차이도 알아챈다.

PFD의 펄스는 전하 펌프(Charge pump)를 켜서 작은 전류를 루프 필터 커패시터에 넣거나 뺀다. 커패시터 전압이 VCO의 제어 전압이다. 루프 필터의 저항은 위상 차에 바로 반응하는 비례 항을, 커패시터는 차이를 쌓아 두는 적분 항을 만든다. 결국 PLL은 "위상 오차를 0으로 만드는 PI 제어기"다. 이 제어기의 빠르기가 루프 대역폭(Loop bandwidth), 진동이 얼마나 빨리 가라앉는지가 감쇠 계수 \(\zeta\)다.

SIMULATOR

PLL 잠금 시뮬레이터

잠금 시간 (±0.1%)—
최대 오버슈트—
출력 지터 (RMS)—
주파수 단계—
기준 클럭 38.4 MHz. N을 바꾸면 PLL이 이전 주파수에서 새 주파수로 옮겨 가며 다시 잠기는 과정을 그린다(가로축 µs). 위쪽 그림은 블록도와 지금 순간의 값, 아래 그래프의 연한 곡선은 위상 오차다. 모델은 PFD를 기준 클럭마다 표본화하는 이산 시간 2차 PI 루프이며, 위상 차가 한 주기를 넘으면 PFD가 주기를 건너뛴다(사이클 슬립). 대역폭을 넓히면 빨리 잠기고 VCO 잡음을 잘 눌러 주지만, 기준 클럭의 지터(×N)는 그대로 통과시킨다. 두 잡음이 같을 때 지터가 가장 작은 최적 대역폭이 있다. 실제 PLL은 대역폭을 수백 kHz 안팎으로 좁게 두고, 잠그기 전에 VCO의 대역을 고르는 교정 단계를 거치므로 잠금에 수십 µs가 걸린다.
$$ f_{\text{out}} = \frac{N}{M}\,f_{\text{ref}}, \qquad \omega_n = \sqrt{\frac{K_{\text{VCO}} I_{\text{CP}}}{2\pi N C}}, \qquad \zeta = \frac{R}{2}\sqrt{\frac{K_{\text{VCO}} I_{\text{CP}} C}{2\pi N}} $$
\(M\): 기준 분주비, \(K_{\text{VCO}}\): VCO 이득(Hz/V), \(I_{\text{CP}}\): 전하 펌프 전류, \(R, C\): 루프 필터. 안정성을 위해 루프 대역폭은 보통 기준 주파수의 1/10 이하로 잡는다(Gardner의 한계). N을 소수로 바꿔 가며(시그마-델타 변조) 아주 촘촘한 주파수를 만드는 것을 분수 분주 PLL(Fractional-N PLL)이라 하며, DVFS로 CPU 클럭을 수십 MHz 단위로 바꾸는 데 쓴다(12장).
ζ를 0.2로 낮추면 잠금 시간은 줄어들까?

감쇠가 작으면 반응이 날카로워진다. 그런데 "±0.1% 안에 들어와 머문다"는 조건을 생각해 보자.

답 보기

오히려 늘어난다. ζ가 작으면 목표 주파수를 크게 지나쳤다가(오버슈트) 되돌아오기를 여러 번 반복하며 천천히 가라앉는다. 감쇠 진동의 포락선이 \(e^{-\zeta\omega_n t}\)로 줄어들기 때문에 잠금 시간은 대략 \(1/(\zeta\omega_n)\)에 비례한다. ζ가 너무 크면 이번에는 느릿느릿 다가간다. 그래서 설계자는 보통 \(\zeta\approx 0.7\sim1\)을 고른다.

클럭 트리: 동시에 도착하게 하기

PLL에서 나온 클럭 한 가닥은 수백만 개의 플립플롭에 닿아야 한다. 한 선이 감당할 수 없으니 버퍼를 줄줄이 달아 나무처럼 갈라 퍼뜨린다. 이것이 클럭 트리(Clock tree)다. 목표는 단 하나, 모든 잎(플립플롭)에 같은 시각에 도착하는 것이다. 도착 시각의 차이를 클럭 스큐(Clock skew)라 한다.

가장 단순한 방법은 뿌리에서 각 잎까지 가장 짧은 길로 따로 잇는 것이다. 그러면 가까운 잎은 일찍, 먼 잎은 늦게 받는다. 대칭으로 갈라지는 H-트리(H-tree)는 어느 잎까지든 길이가 같다. 아래에서 두 방식을 비교하고, 플립플롭 묶음(동그라미)을 끌어 옮겨 보자.

최대 스큐—
삽입 지연 (평균)—
총 배선 길이—
그림 14-2. 만져 보기10 mm × 10 mm 영역의 가운데에 클럭 뿌리가 있고 16개의 플립플롭 묶음이 있다. 색은 클럭이 도착하는 시각(파랑 = 빠름, 빨강 = 늦음)이다. 버퍼를 넣은 전역 배선이 mm당 약 50 ps 걸린다고 가정했다. H-트리에서는 처음엔 스큐가 0이지만, 묶음 하나를 잎에서 멀리 끌어내면 그 짧은 꼬리 배선만큼 스큐가 생긴다.

실제 칩에서는 플립플롭이 고르게 퍼져 있지 않고, 블록마다 클럭이 꺼졌다 켜지며, 공정 편차로 같은 길이의 배선도 지연이 조금씩 다르다. 그래서 설계 도구는 클럭 트리 합성(CTS, Clock tree synthesis) 단계에서 버퍼 크기와 배선 길이를 조절해 스큐를 수십 ps 이내로 맞춘다. 고성능 CPU는 트리 끝을 촘촘한 그물(클럭 메시(Clock mesh))로 묶어 편차를 평균해 버리기도 한다. 그 대가는 전력이다. 클럭망은 매 주기 두 번씩 전체를 충전·방전하므로 칩 동적 전력의 30~40%를 먹는 경우가 흔하다.

스큐와 지터는 타이밍 예산을 깎는다

2장에서 플립플롭 사이 조합 회로의 지연이 클럭 주기를 넘으면 안 된다는 setup 조건과, 너무 빨리 바뀌어 같은 에지의 데이터를 망치면 안 된다는 hold 조건을 보았다. 거기서는 두 플립플롭이 정확히 같은 순간에 클럭을 받는다고 가정했다. 이제 그 가정을 거두자. 받는 쪽(capture) 클럭이 \(t_{\text{skew}}\)만큼 늦게 도착하면 데이터에게는 시간이 그만큼 더 주어지지만, 같은 에지에서 바로 뒤따라 바뀌는 데이터도 그만큼 더 오래 버텨야 한다.

또 하나의 적은 지터(Jitter)다. 스큐가 "장소에 따른" 고정된 차이라면, 지터는 "시간에 따라" 매 주기 클럭 에지가 조금씩 흔들리는 것이다. PLL의 잡음, 전원 전압의 출렁임이 원인이다. 주기 하나가 평소보다 짧아질 수 있으니 setup 예산에서 빼 두어야 한다.

setup 여유—
hold 여유—
이 경로의 최대 클럭—
그림 14-3. 만져 보기보내는 플립플롭(launch)이 0 ps 에지에서 데이터를 내보내면, 받는 플립플롭(capture)의 입력은 \(t_{cq}\)+짧은 경로 지연에 바뀌기 시작해 \(t_{cq}\)+긴 경로 지연에 확정된다(빗금 = 불확실 구간). 다음 capture 에지(주기 + 스큐 − 지터) 전 setup 시간까지 확정되어야 하고, 같은 capture 에지(스큐) 뒤 hold 시간 동안은 바뀌면 안 된다. \(t_{cq}\)=40 ps, \(t_{su}\)=30 ps, \(t_h\)=20 ps.
$$ \underbrace{T_{\text{clk}} + t_{\text{skew}} - t_{\text{jitter}}}_{\text{주어진 시간}} \;\ge\; t_{cq} + t_{\text{logic,max}} + t_{su}, \qquad t_{cq} + t_{\text{logic,min}} \;\ge\; t_{\text{skew}} + t_h $$
왼쪽이 setup, 오른쪽이 hold 조건. 양(+)의 스큐는 setup을 돕고 hold를 해친다. hold 위반은 클럭을 느리게 해도 고쳐지지 않으므로 더 위험하다. 설계 도구는 짧은 경로에 버퍼를 넣어 일부러 늦춘다. 스큐를 일부러 만들어 느린 단계에 시간을 빌려 주는 기법을 유용한 스큐(Useful skew)라 한다.

클럭 게이팅: 일하지 않으면 박자도 끈다

클럭망이 동적 전력의 큰 몫을 먹는다면, 일하지 않는 블록의 클럭을 끄는 것이 가장 효과적인 절전이다. 이것이 클럭 게이팅(Clock gating)이다(12장). 순진하게 생각하면 AND 게이트 하나면 된다. gclk = clk AND en. 하지만 en은 보통 조합 회로가 만든 신호라 아무 때나 바뀐다. clk가 1인 동안 en이 바뀌면 gclk에 짧은 가시 펄스(글리치(Glitch))가 생기고, 플립플롭은 이것을 진짜 에지로 알고 엉뚱하게 동작한다.

해결책은 en을 clk가 0일 때만 통과시키는 래치에 한 번 담는 것이다. clk가 1인 동안에는 래치가 값을 붙잡고 있으므로 gclk 펄스는 언제나 온전한 모양이 된다. 이 래치 + AND를 하나로 묶은 표준 셀을 ICG(Integrated clock gating cell)라 한다. 아래 en 줄의 칸(¼주기 단위)을 눌러 en을 아무 때나 바꿔 보자.

AND 게이팅 글리치—
ICG 글리치—
꺼진 클럭 펄스—
그림 14-4. 만져 보기en 줄의 칸을 누르면 그 ¼주기 동안의 en이 바뀐다. "AND만" 줄은 clk AND en, "ICG" 줄은 clk가 0일 때 투명한 래치를 거친 en(latch_en)과 clk의 AND다. 빨간 표시는 반주기보다 짧은 펄스, 곧 글리치다. ICG 출력은 언제나 온전한 펄스이거나 아예 없다.

클럭 도메인을 건널 때: 준안정

SB-1에는 서로 다른 PLL에서 나온 클럭이 수십 개 있다. 같은 클럭을 받는 회로 묶음을 클럭 도메인(Clock domain)이라 하는데, 서로 무관한 두 도메인 사이에서는 보내는 쪽 데이터가 받는 쪽 클럭 에지와 언제 겹칠지 알 수 없다. 데이터가 setup·hold 창 안에서 바뀌면 플립플롭은 0도 1도 아닌 중간 전압에 걸려 한동안 머문다. 이것이 준안정(Metastability)이다. 언덕 꼭대기에 올려 둔 공처럼, 결국은 어느 한쪽으로 굴러떨어지지만 언제 떨어질지 모른다.

플립플롭 안의 교차 결합 인버터는 중간 전압에서 차이를 지수적으로 키운다. 처음 차이가 \(\Delta v_0\)라면 시간 \(t\) 뒤의 차이는 \(\Delta v_0\, e^{t/\tau}\)이고, \(\tau\)는 인버터 고리의 시정수(수~수십 ps)다. 데이터가 클럭 에지에 가까울수록 \(\Delta v_0\)가 작아 해소에 오래 걸린다.

해소 시간—
다음 에지까지 못 정한 비율—
그림 14-5. 만져 보기가로축은 첫 번째 플립플롭이 데이터를 잡은 클럭 에지 뒤의 시간(받는 클럭 한 주기), 세로축은 출력 전압이다. Δt 슬라이더는 로그 눈금으로 10Δt ps다. "무작위 데이터"는 에지 근처 ±30 ps 안에서 무작위로 바뀐 데이터 200개의 궤적을 그린다. 다음 에지(둘째 플립플롭이 이 값을 읽는 순간) 전 setup 시간까지 반쯤 걸린 채로 남은 궤적은 빨간색이다. 클럭을 올리거나 τ를 키우면 빨간 궤적이 늘어난다. 실패 비율은 대략 \(e^{-t_r/\tau}\)에 비례한다.

준안정을 없앨 수는 없다. 할 수 있는 일은 해소할 시간을 충분히 주는 것이다. 비동기 신호를 플립플롭 두 개에 연달아 통과시키면, 첫째가 준안정에 빠져도 둘째가 읽기 전까지 한 주기 동안 해소할 시간이 생긴다. 이것이 2단 동기화기(Two-flop synchronizer)다. 실패할 확률은 해소 시간에 지수적으로 줄어든다. 평균 고장 간격 MTBF(Mean time between failures)는 다음과 같다.

$$ \text{MTBF} = \frac{e^{\,t_r/\tau}}{T_w\, f_{\text{clk}}\, f_{\text{data}}} $$
\(t_r\): 해소에 쓸 수 있는 시간, \(\tau\): 해소 시정수, \(T_w\): 준안정에 빠질 수 있는 시간 창, \(f_{\text{clk}}\): 받는 쪽 클럭, \(f_{\text{data}}\): 데이터가 바뀌는 빈도. 분모는 "1초에 위험한 순간이 몇 번 오는가", 분자는 "그중 해소 못 할 확률의 역수"다.
해소 시간 tr—
MTBF—
칩 1억 개 중 하루 고장—
그림 14-6. 만져 보기로그 눈금 위의 막대가 MTBF다. 동기화기가 없으면 데이터가 플립플롭 뒤의 논리(주기의 70%)를 지나야 해서 해소 시간이 매우 짧고, 단을 하나 늘릴 때마다 해소 시간이 한 주기씩 늘어 MTBF가 \(e^{T/\tau}\)배 뛴다. 오른쪽 아래 숫자는 이 칩이 1억 대 팔렸을 때 하루에 몇 대에서 이 동기화기가 실패하는지다.
"한 번도 안 났다"는 증거가 아니다

MTBF 10년짜리 동기화기는 칩 하나로는 10년에 한 번이지만, 1억 대가 팔리면 하루에 수만 번 어딘가에서 일어난다. 게다가 한 칩에 CDC 경로가 수백~수천 개 있다. 그래서 설계 규칙은 "MTBF가 우주 나이보다 길어야 한다"는 말을 농담처럼 쓴다. 고속 클럭이나 τ가 큰 저전압 동작에서는 3단 동기화기를 쓴다.

여러 비트를 한꺼번에 건네면: 그레이 코드

2단 동기화기는 비트 하나에는 완벽하다. 결과가 이전 값이든 새 값이든 한 주기 늦게 정해질 뿐이다. 그런데 4비트 카운터를 비트마다 동기화기에 통과시키면 어떨까? 배선 길이와 동기화기의 해소 시간이 비트마다 조금씩 달라서, 0111 → 1000처럼 네 비트가 동시에 바뀌는 순간에 읽으면 어떤 비트는 새 값, 어떤 비트는 옛 값으로 읽힐 수 있다. 결과는 1111이나 0000 같은, 있지도 않았던 값이다.

해결책은 한 번에 한 비트만 바뀌는 그레이 코드(Gray code)로 세는 것이다. 이진수 \(b\)의 그레이 코드는 \(g = b \oplus (b \gg 1)\)이다. 그레이 카운터는 어느 순간에 읽어도 옛 값 아니면 새 값이다. 아래에서 비트 사이 지연 편차를 늘려 가며 두 방식을 비교해 보자.

이진 카운터 오류—
그레이 카운터 오류—
읽은 횟수—
그림 14-7. 만져 보기위 그림은 보내는 쪽 카운터의 각 비트가 실제로 바뀌는 시각(비트마다 다른 지연)과 받는 쪽이 읽는 순간(세로선)이다. 표는 최근 읽기 결과다. "있을 수 없는 값"을 읽으면 빨갛게 표시한다. 편차가 0이 아니면 이진 카운터는 비트가 여럿 바뀌는 순간마다 엉뚱한 값을 읽을 수 있지만, 그레이 카운터는 결코 그러지 않는다.
CDC의 세 가지 정석

① 제어 비트 하나: 2단 동기화기. ② 펄스나 요청: 토글 신호로 바꿔 동기화하고 받는 쪽에서 에지를 검출, 필요하면 응답을 돌려보내는 핸드셰이크. ③ 데이터 묶음: 데이터를 그대로 두고 "유효" 비트 하나만 동기화하거나, 다음 절의 비동기 FIFO. 설계 도구는 CDC 검사기로 이 규칙을 어긴 경로를 찾아낸다.

비동기 FIFO: 두 박자 사이의 완충지대

NoC가 CPU 도메인에서 메모리 도메인으로 요청을 넘길 때처럼 데이터가 계속 흐르는 경계에는 비동기 FIFO(Asynchronous FIFO)를 둔다. 원형 버퍼 하나를 두고, 쓰는 쪽은 자기 클럭으로 쓰기 포인터를, 읽는 쪽은 자기 클럭으로 읽기 포인터를 움직인다. 데이터 자체는 동기화하지 않는다. 대신 포인터만 그레이 코드로 바꿔 상대 도메인으로 동기화한다(Cummings, 2002).

동기화된 포인터는 두세 클럭 늦은 옛 값이다. 그래서 FULL·EMPTY는 실제보다 늦게 풀린다. 즉 비관적이다. 실제로는 빈 자리가 있는데도 꽉 찼다고 할 수는 있지만, 꽉 찼는데 비었다고 하지는 않는다. 그래서 안전하다. 두 클럭의 주파수와 깊이를 바꿔 가며 돌려 보자.

SIMULATOR

비동기 FIFO

FULLEMPTY
깊이 · 포인터 방식
실제로 찬 칸—
FULL로 막힌 쓰기—
EMPTY로 쉰 읽기—
데이터 오류 (덮어쓰기·빈 읽기)—
왼쪽 링이 FIFO의 칸들이다. 숫자는 저장된 데이터 번호, 진한 화살표 W·R은 실제 포인터, 흐린 화살표는 상대 도메인에 동기화되어 보이는 포인터다(쓰는 쪽이 보는 R′, 읽는 쪽이 보는 W′). 위 두 줄은 두 클럭의 에지다. "이진 포인터"는 포인터를 그레이 코드로 바꾸지 않고 이진수 그대로 동기화하는 흔한 실수다. 여러 비트가 동시에 바뀌는 순간 잘못 읽힌 포인터 때문에 꽉 찬 FIFO에 쓰거나 빈 FIFO에서 읽는 사고가 난다(예: 쓰기 100 MHz·읽기 800 MHz로 FIFO를 늘 비어 있게 하거나, 반대로 쓰기를 훨씬 빠르게 해 가득 채워 보자). 사고를 잘 보이게 하려고, 비트 사이 도착 시각 차이를 보내는 쪽 주기의 60%로 실제보다 훨씬 크게 잡았다.
쓰기 400 MHz·읽기 250 MHz로, 쓰기를 계속(비율 1) 하면 깊이 16짜리 FIFO는 얼마나 버틸까?

들어오는 속도와 나가는 속도의 차이를 생각해 보자.

답 보기

FIFO는 속도 차이를 잠깐 흡수할 뿐이다. 순 유입률이 400 − 250 = 150 M개/s이므로 16칸은 약 107 ns(쓰기 클럭 약 43번) 만에 차고, 그 뒤로는 FULL이 쓰기를 막아(백프레셔) 평균 쓰기 속도가 250 MHz로 떨어진다. 데이터를 잃지는 않는다. 깊이는 "얼마나 긴 폭주를 흡수해야 하는가"와 "동기화 지연 동안 날아다니는 데이터"로 정한다. 지속적인 속도 차이는 깊이로 해결되지 않는다.

리셋: 모두 같은 출발선에

전원이 들어온 직후 플립플롭들은 아무 값이나 품고 있다. 리셋(Reset)은 모두를 정해진 값으로 되돌린다. 리셋을 거는 순간(인가)은 클럭과 상관없이 즉시 걸려도 된다. 클럭이 아직 안 돌거나 PLL이 잠기기 전에도 회로를 안전한 상태로 묶어 두어야 하기 때문이다. 문제는 리셋을 푸는 순간이다. 리셋 해제가 클럭 에지와 너무 가까우면(recovery·removal 시간 위반) 플립플롭이 준안정에 빠지거나, 칩 반대편의 플립플롭은 한 주기 늦게 풀린다. 그러면 함께 출발해야 할 상태 기계들이 서로 다른 박자에서 출발한다.

그래서 정석은 비동기 인가, 동기 해제(Asynchronous assert, synchronous deassert)다. 리셋 입력을 2단 동기화기 같은 리셋 동기화기에 넣되, 인가는 플립플롭의 비동기 리셋 핀으로 즉시 걸고, 해제만 클럭에 맞춰 두 주기 뒤에 내보낸다.

그림 14-8. 만져 보기외부 리셋(rst_n, 0이면 리셋)이 칩의 두 카운터 A, B에 도달한다. B는 칩 반대편에 있어 리셋이 ¼주기 늦게 도착한다. 해제 시각을 ¼주기씩 옮겨 보자. 해제가 클럭 에지와 겹치면(붉은 띠, recovery·removal 창) 그 카운터가 언제 풀릴지 알 수 없고, 두 카운터가 한 박자 어긋나 출발할 수 있다. 동기화기를 켜면 두 카운터 모두 동기화된 리셋(rst_sync)을 받아 같은 에지에서 출발한다.
항목대략값비고
스마트폰 기준 수정19.2 / 38.4 MHz시계용 32.768 kHz 별도
수정 주파수 정확도약 ±10~20 ppm온도 보상 TCXO는 ±0.5~2 ppm
SoC의 PLL 수약 10~30개CPU 클러스터·GPU·DDR·디스플레이·카메라·모뎀 등 2023~2025년
CPU용 PLL 출력 지터 (RMS)약 0.5~2 psLC-VCO는 수백 fs까지
PLL 잠금 시간약 10~100 µsDVFS 단계 전환 시간에 포함
클럭 스큐 목표 (블록 안)약 10~50 ps4 GHz면 주기 250 ps의 수~20%
클럭망 전력 비중동적 전력의 약 30~40%게이팅 전 기준, 설계마다 크게 다름
플립플롭 해소 시정수 τ약 5~20 ps저전압일수록 커진다 (7~3 nm급)

핵심 정리

  1. PLL은 VCO 출력을 N으로 나눠 수정 기준과 비교(PFD)하고, 전하 펌프·루프 필터로 VCO를 고쳐 \(f_{\text{out}}=N f_{\text{ref}}\)에 잠근다. 루프 대역폭은 잠금 속도와 VCO·기준 잡음 사이의 타협이다.
  2. 클럭 트리는 모든 잎에 같은 시각에 도착하도록 균형을 맞춘다. 스큐는 setup·hold 중 하나를 돕고 다른 하나를 해치며, 지터는 setup 예산에서 빠진다.
  3. 클럭 게이팅은 래치가 든 ICG 셀로 해야 글리치가 없다. 클럭망은 동적 전력의 큰 몫이라 게이팅 효과가 크다.
  4. 비동기 경계에서 준안정은 피할 수 없고, 해소 시간을 주어 MTBF를 지수적으로 늘린다. 비트 하나는 2단 동기화기, 여러 비트는 그레이 코드나 비동기 FIFO로 건넌다.
  5. 리셋은 비동기로 걸고 동기로 푼다. 리셋 동기화기가 모든 플립플롭이 같은 에지에서 출발하게 한다.

확인 퀴즈

Q1. 기준 클럭 38.4 MHz인 정수 분주 PLL로 3.072 GHz를 만들려면 N은?

\(3072 / 38.4 = 80\). 잠기면 나눈 클럭과 기준 클럭이 같아지므로 \(f_{\text{out}} = N f_{\text{ref}}\)다.

Q2. 받는 쪽 플립플롭의 클럭이 보내는 쪽보다 30 ps 늦게 도착한다(양의 스큐). 옳은 것은?

받는 에지가 늦으면 데이터가 도착할 시간이 늘어나지만(setup↑), 같은 에지에서 이미 바뀐 새 데이터가 그만큼 더 일찍 들이닥치는 셈이 된다(hold↓).

Q3. AND 게이트 하나로 클럭을 게이팅하면 생기는 문제와 해결책은?

래치가 clk=1 동안 en을 붙잡고 있으므로 게이트된 클럭의 펄스는 온전하거나 아예 없다.

Q4. 2단 동기화기에서 τ = 20 ps일 때 해소 시간을 200 ps 더 주면 MTBF는 대략 몇 배가 되는가?

\(e^{200/20} = e^{10} \approx 22{,}026\). 해소 시간을 선형으로 늘리면 MTBF는 지수적으로 는다.

Q5. 비동기 FIFO에서 포인터를 그레이 코드로 바꿔 동기화하는 이유는?

이진 포인터는 여러 비트가 동시에 바뀌어, 비트마다 지연이 다르면 있지도 않은 값으로 읽힐 수 있다. 그레이 포인터는 오차가 최대 한 칸이고, 그것도 비관적인 쪽으로만 틀린다.

Q6. 리셋을 "비동기 인가, 동기 해제"로 하는 이유로 가장 알맞은 것은?

해제가 클럭 에지 근처에서 일어나면 recovery·removal 위반으로 플립플롭마다 풀리는 주기가 달라지거나 준안정이 생긴다. 리셋 동기화기가 해제를 클럭에 맞춘다.