래치와 플립플롭
지금까지 만든 게이트는 모두 건망증 환자였다. 입력이 바뀌면 출력도 바뀌고, 방금 무엇이 들어왔는지는 기억하지 못한다. 그런데 계산기는 덧셈 중간값을, CPU는 다음에 실행할 명령의 주소를 붙잡고 있어야 한다. 회로가 기억을 가지려면 무엇이 필요할까? 답은 놀랍도록 단순하다. 출력을 다시 입력으로 돌려 보내는 고리다. 이 장에서는 인버터 두 개를 고리로 묶는 데서 출발해 SR 래치, D 래치, 마스터-슬레이브 플립플롭을 차례로 짓고, 플립플롭이 정확히 언제 데이터를 받아들이는지(setup·hold·clk-to-Q), 그 약속을 어기면 무슨 일이 생기는지(메타안정성)를 직접 만져 본다.
- 되먹임 고리가 기억을 만드는 이유를 두 인버터의 VTC와 안정·불안정 평형점으로 설명한다.
- SR 래치, 전송 게이트 D 래치, 마스터-슬레이브 D 플립플롭의 동작과 차이(레벨 감응 vs 에지 트리거)를 안다.
- setup·hold·clk-to-Q를 "clk→Q 지연 vs 데이터 도착 시각" 곡선에서 정의하고 수치로 읽는다.
- 메타안정 상태의 결정 시간이 지수 분포임을 이해하고, MTBF 식으로 동기화기 단 수를 정한다.
조합 회로와 순차 회로: 기억은 되먹임이다
NAND, NOR, 덧셈기처럼 출력이 지금의 입력만으로 정해지는 회로를 조합 회로(Combinational circuit)라 한다. 입력을 정하면 (지연 시간이 지난 뒤) 출력이 하나로 정해진다. 과거는 상관없다. 반면 출력이 지금의 입력뿐 아니라 과거의 입력에도 의존하는 회로를 순차 회로(Sequential circuit)라 한다. 과거를 반영하려면 회로 어딘가에 과거가 저장되어 있어야 하고, 그 저장소를 상태(State)라 부른다.
게이트만으로 상태를 만드는 방법은 하나뿐이다. 출력을 다시 자신의 입력으로 돌려 보내는 되먹임(Feedback)이다. 아래 그림의 두 회로는 똑같은 OR 게이트다. 왼쪽은 두 번째 입력을 0에 묶었고, 오른쪽은 두 번째 입력을 자기 출력에 이었다. A를 한 번 1로 올렸다 내려 보자.
오른쪽 회로는 "한 번이라도 1이 들어온 적이 있는가"라는 1비트 정보를 기억한다. 다만 지울 방법이 없다. 쓰기만 되고 지우기가 안 되는 기억은 쓸모가 적다. 쓰기와 지우기를 모두 갖춘 기억 소자를 만들려면, 되먹임 고리가 두 가지 상태를 똑같이 안정적으로 유지할 수 있어야 한다. 이것이 다음 절의 쌍안정 회로다.
쌍안정 회로: 인버터 두 개의 고리
인버터 두 개를 고리로 이으면 가장 단순한 기억 소자가 된다. 첫 인버터의 출력 \(V_2\)가 둘째 인버터로 들어가고, 둘째의 출력 \(V_1\)이 다시 첫째로 돌아온다. \(V_1=0\)이면 \(V_2=1\), 그러면 \(V_1=0\)이 유지된다. 반대로 \(V_1=1, V_2=0\)도 스스로 유지된다. 두 상태가 모두 안정하므로 쌍안정(Bistable) 회로라 한다.
정말 그 둘뿐일까? 두 인버터의 전압 전달 특성(VTC, 4장)을 한 그래프에 겹쳐 보자. 첫 인버터는 \(V_2 = f(V_1)\), 둘째 인버터는 \(V_1 = f(V_2)\)이므로 둘째 곡선은 축을 바꿔 그린다. 고리가 만족해야 하는 점은 두 곡선이 만나는 곳이고, 교점은 세 개다. 양 끝 두 점과 가운데 한 점. 가운데 점 \(V_1=V_2=V_M\)도 분명히 평형이지만, 아래에서 직접 확인해 보면 이 점은 머물 수 없는 점이다.
가운데 점이 불안정한 이유는 VTC의 기울기에 있다. \(V_M\) 근처에서 인버터의 이득은 \(|A| \gg 1\)이다. \(V_1\)이 \(V_M\)에서 \(\delta\)만큼 벗어나면 인버터 1을 지나며 \(A\delta\), 인버터 2를 지나며 \(A^2\delta\)로 커진다. 고리를 한 바퀴 돌 때마다 어긋남이 \(A^2\)배씩 불어나니 결국 전원 끝까지 밀려난다. 반대로 양 끝 점에서는 VTC가 거의 평평해서(\(|A| \ll 1\)) 작은 교란이 고리를 돌며 줄어든다. 언덕 꼭대기에 놓인 공과 골짜기 바닥에 놓인 공의 차이다.
여기서 두 가지를 기억해 두자. 첫째, 쌍안정 고리에 값을 쓰려면 바깥에서 한쪽 노드를 강제로 반대편 골짜기까지(적어도 언덕 꼭대기 너머로) 밀어야 한다. 둘째, 공을 정확히 꼭대기에 놓으면 공은 한동안 그 자리에 머문다. 얼마나 오래 머물지는 아무도 모른다. 이 두 번째 사실이 이 장 후반의 메타안정성이다.
캐시를 이루는 6T SRAM 셀의 심장도 바로 이 인버터 두 개의 고리다. 두 VTC를 겹친 나비 모양 그림은 SRAM에서 나비 곡선(Butterfly curve)이라 부르며, 두 날개 안에 들어가는 가장 큰 정사각형의 변이 정적 잡음 여유(SNM)다. 13장에서 읽기·쓰기 동작과 함께 다시 만난다.
SR 래치: 쓰고 지울 수 있는 고리
인버터 고리에는 입력이 없다. 각 인버터를 2입력 NOR로 바꾸고 남는 입력 하나씩을 바깥에 내놓으면 SR 래치(Set-Reset latch)가 된다. NOR는 다른 입력이 0이면 인버터처럼 행동하므로, S=R=0이면 그대로 인버터 고리이고 값을 유지한다. S를 1로 올리면 아래 NOR의 출력 \(\overline{Q}\)가 무조건 0이 되고, 그것이 위 NOR로 돌아가 Q=1이 된다. 이것이 셋(Set)이다. R=1은 반대로 Q=0으로 리셋(Reset)한다.
| S | R | Q다음 | 동작 |
|---|---|---|---|
| 0 | 0 | Q | 유지 |
| 1 | 0 | 1 | 셋 |
| 0 | 1 | 0 | 리셋 |
| 1 | 1 | 0* | 금지 |
| S̄ | R̄ | Q다음 | 동작 |
|---|---|---|---|
| 1 | 1 | Q | 유지 |
| 0 | 1 | 1 | 셋 |
| 1 | 0 | 0 | 리셋 |
| 0 | 0 | 1* | 금지 |
S=R=1 자체는 회로를 망가뜨리지 않는다. 문제는 그다음이다. 두 입력이 정확히 동시에 0으로 돌아오면 두 NOR가 모두 "이제 내가 1을 낼 차례"라고 판단해 함께 올라가고, 그러면 서로를 다시 끌어내린다. 실제 회로에서는 두 게이트의 미세한 지연 차이나 잡음이 승자를 정하지만, 설계자는 그것을 예측할 수 없다. 그래서 S=R=1을 금지 입력(Forbidden input)으로 정해 피한다. 다음 절의 D 래치는 이 금지 조합이 애초에 나올 수 없게 입력을 하나로 묶은 구조다.
그림 8-3의 이상적인 모델에서 두 NOR의 지연이 똑같으면 S=R=1→0 뒤에 Q와 Q̄가 0과 1을 영원히 오간다. 실제 칩에서도 그럴까?
답 보기
아니다. 두 게이트의 지연이 조금이라도 다르면 진동하는 두 신호의 위상이 한 바퀴마다 조금씩 어긋나고, 게이트가 유한한 상승·하강 시간을 가지므로 진폭도 줄어든다. 결국 고리는 가운데 전압 \(V_M\) 부근(언덕 꼭대기)으로 모였다가 한쪽으로 굴러떨어진다. 언제 어느 쪽으로 떨어질지 모른다는 점에서 이것은 메타안정 상태와 같은 문제다.
D 래치: 투명할 때와 닫혀 있을 때
SR 래치의 금지 입력을 없애는 가장 쉬운 방법은 S와 R을 하나의 데이터 입력 D에서 만드는 것이다(S=D, R=D̄). 여기에 언제 쓸지를 정하는 클럭(또는 인에이블) 입력을 더하면 D 래치(D latch)가 된다. D 래치는 두 가지 얼굴을 가진다.
- 투명(Transparent): 클럭이 1인 동안 Q는 D를 그대로 따라간다. 래치는 그냥 버퍼다.
- 유지(Opaque, Hold): 클럭이 0이 되는 순간의 D를 붙잡고, 클럭이 0인 동안에는 D가 아무리 바뀌어도 Q는 그대로다.
클럭의 레벨(1인지 0인지)이 동작을 정하므로 레벨 감응(Level-sensitive) 소자라 한다. 게이트로 지을 수도 있지만 CMOS 표준 셀의 D 래치는 대개 7장의 전송 게이트(Transmission gate, TG) 두 개와 인버터 두 개로 만든다. TG1은 클럭이 1일 때 D를 안으로 들이고, TG2는 클럭이 0일 때 인버터 두 개를 고리로 닫아 값을 붙잡는다. 두 TG는 언제나 하나만 켜진다.
TG 두 개는 서로 반대 클럭(CLK와 \(\overline{\text{CLK}}\))을 받으므로, 래치 하나에 클럭을 받는 트랜지스터가 4개 있고 클럭 반전용 인버터가 하나 더 필요하다. 클럭은 매 주기 두 번씩 바뀌는 신호라서 이 클럭 트랜지스터의 게이트 커패시턴스가 래치 전력의 상당 부분을 차지한다. 설계자가 "클럭 부하"를 줄이려고 애쓰는 이유다.
래치 두 개를 같은 클럭으로 줄지어 놓으면, 클럭이 1인 동안 두 래치가 모두 투명하다. 그러면 데이터가 첫 래치를 지나 둘째 래치까지 한 클럭 레벨 안에 연달아 통과해 버릴 수 있다. 이를 경주(Race-through)라 한다. 래치만으로 파이프라인을 만들려면 인접한 래치가 반대 위상의 클럭을 받아야 하고, 그 생각을 그대로 소자 하나로 묶은 것이 다음 절의 플립플롭이다.
마스터-슬레이브 D 플립플롭
D 래치 두 개를 이어 붙이고 반대 위상의 클럭을 주자. 앞의 마스터(Master) 래치는 CLK=0일 때 투명하고, 뒤의 슬레이브(Slave) 래치는 CLK=1일 때 투명하다. 두 래치가 동시에 투명한 순간이 없으므로 D에서 Q까지 곧장 뚫린 길이 생기지 않는다.
- CLK=0: 마스터는 D를 따라가고, 슬레이브는 닫혀 이전 Q를 지킨다.
- CLK가 0→1로 오르는 순간: 마스터가 닫히며 그 순간의 D를 붙잡는다. 동시에 슬레이브가 열려 그 값을 Q로 내보낸다.
- CLK=1: 마스터는 닫혀 있으므로 D가 바뀌어도 Q는 그대로다.
결과적으로 Q는 클럭의 상승 에지에서만 바뀐다. 이것이 에지 트리거(Edge-triggered) D 플립플롭(D flip-flop, DFF)이다. 아래 시뮬레이터에서 마스터 노드 M과 Q가 어떻게 움직이는지, 같은 입력을 받는 D 래치 하나와 무엇이 다른지 비교해 보자.
마스터-슬레이브 플립플롭 vs D 래치
플립플롭의 장점은 생각하기 쉽다는 것이다. "클럭이 칠 때 D가 Q로 옮겨 간다"는 한 줄이면 동작이 설명된다. 모든 레지스터가 같은 에지에서 동시에 값을 바꾸므로, 그 사이 한 주기 동안 조합 논리가 다음 값을 계산할 시간이 온전히 주어진다. 거의 모든 동기식 디지털 설계와 합성 도구가 이 모델 위에 서 있다. Verilog의 always @(posedge clk)가 바로 이 소자다(17장).
위 구조는 상승 에지에서 동작한다. 클럭의 하강 에지(1→0)에서 값을 받는 플립플롭을 만들려면 무엇을 바꾸면 될까?
답 보기
두 래치의 위상을 바꾸면 된다. 마스터를 CLK=1일 때 투명하게, 슬레이브를 CLK=0일 때 투명하게 하면 CLK가 1→0으로 내려가는 순간 마스터가 닫히고 슬레이브가 열린다. TG 회로에서는 CLK와 \(\overline{\text{CLK}}\) 배선을 맞바꾸는 것뿐이다. 실제 표준 셀 라이브러리에는 두 종류가 다 있지만, 설계는 대개 상승 에지 하나로 통일한다.
실제 CLK와 \(\overline{\text{CLK}}\)는 인버터 하나만큼 어긋나 있고 상승·하강에도 시간이 걸린다. 그래서 에지 근처의 아주 짧은 순간에는 마스터와 슬레이브의 TG가 둘 다 반쯤 켜질 수 있다. 이 짧은 겹침 동안 데이터가 두 래치를 연달아 통과하면 hold 위반과 같은 문제가 생긴다. 예전에는 두 클럭이 결코 겹치지 않게 만든 2상 비겹침 클럭(Two-phase non-overlapping clock)을 썼고, 지금은 셀 내부의 클럭 버퍼 지연과 TG 크기를 조절해 겹침을 hold 시간 안에 가둔다. 같은 이유로 클럭 신호의 상승 시간이 너무 길면 플립플롭이 오동작할 수 있다.
타이밍 파라미터: setup, hold, clk-to-Q
"클럭이 칠 때 D가 Q로 옮겨 간다"는 말에는 숨은 조건이 있다. D는 클럭 에지보다 조금 앞서 도착해 있어야 하고, 에지가 지난 뒤에도 조금 동안 바뀌지 말아야 한다. 마스터 래치 안의 노드가 새 값으로 충분히 옮겨 갈 시간, 그리고 TG가 완전히 닫힐 시간이 필요하기 때문이다. 플립플롭의 시간 약속은 세 숫자로 요약된다.
- clk-to-Q 지연(Clock-to-Q delay, \(t_{cq}\)): 클럭 에지에서 Q가 새 값으로 바뀌기까지 걸리는 시간.
- setup 시간(Setup time, \(t_{setup}\)): D가 에지보다 최소한 이만큼 먼저 안정되어 있어야 한다.
- hold 시간(Hold time, \(t_{hold}\)): D가 에지 뒤로 최소한 이만큼 그대로 있어야 한다.
그런데 setup은 칼로 자른 듯한 경계가 아니다. D가 에지에 가까이 올수록 마스터 노드는 새 값으로 다 옮겨 가지 못한 채 닫히고, 슬레이브의 재생 고리가 그 어중간한 전압을 끝까지 밀어내는 데 시간이 더 걸린다. 그래서 clk→Q 지연이 서서히, 그러다 갑자기 늘어난다. 아래 시뮬레이터에서 D의 천이 시각을 끌어 보자.
clk→Q 지연 vs 데이터 도착 시각
곡선의 오른쪽 끝, D가 에지보다 한참 먼저 도착한 경우 clk→Q는 공칭값으로 평평하다. 왼쪽으로 갈수록 서서히 늘다가 어느 지점부터 수직으로 치솟고, 그 너머에서는 아예 새 값을 받지 못한다. 경계 바로 근처에서는 결정에 걸리는 시간에 상한이 없다. 그렇다면 setup 시간은 어디로 정할까? 업계의 흔한 관습은 clk→Q가 공칭값보다 10% 늘어나는 지점이다(5%나 고정 ps를 쓰는 라이브러리도 있다). hold도 같은 방식으로 정한다.
주황 곡선 D→Q(= \(t_{DC}+t_{cq}\))를 보자. 이 합은 어느 지점에서 최소가 된다. D를 일찍 보내면 에지까지 기다리는 시간이 아깝고, 너무 늦게 보내면 clk→Q가 늘어난다. 최소점은 clk→Q 곡선의 기울기가 −1인 곳이며, 공격적인 고성능 설계는 setup 정의점보다 이 최적점 가까이에서 플립플롭을 쓰기도 한다.
DG-7 기준 공정에서 TG 마스터-슬레이브 FF는 clk→Q 약 18 ps, setup 약 8 ps, hold 약 2 ps 정도다. 합하면 플립플롭 하나가 매 주기 약 26 ps, FO4 지연으로 3.5개 남짓을 "세금"으로 가져간다. 클럭 주기가 FO4 20개 안팎인 고성능 코어에서 이것은 주기의 15~20%에 해당하는 큰 몫이다. 그래서 고속 설계에서는 플립플롭의 오버헤드를 줄이는 변종(펄스 래치, 감지 증폭기형 FF)을 찾는다.
메타안정성: 언덕 꼭대기의 공
setup·hold를 지키지 못하면 어떻게 될까? 마스터 노드는 에지 순간 \(V_M\) 근처의 어중간한 전압에 붙잡히고, 슬레이브의 쌍안정 고리는 언덕 꼭대기 근처에서 출발한다. 꼭대기 근처에서 고리 전압의 어긋남 \(\Delta V\)는 지수적으로 커진다.
논리 레벨(\(\Delta V \approx V_{DD}/2\))까지 커지는 데 걸리는 결정 시간은 \(t = \tau \ln(V_{DD}/2\Delta V_0)\)이다. \(\Delta V_0\)가 작을수록 오래 걸리고, \(\Delta V_0=0\)이면 이론상 영원히 걸린다. 이 상태를 메타안정(Metastable)이라 한다. 메타안정 중인 플립플롭의 출력은 0도 1도 아닌 중간 전압에 머물거나, 늦게 한쪽으로 떨어지거나, 심지어 짧게 튀었다가 돌아오기도 한다. 뒤의 회로는 그것을 서로 다른 값으로 읽을 수 있다.
비동기 신호(다른 클럭 영역에서 오거나 버튼처럼 바깥에서 오는 신호)는 언젠가 반드시 에지와 겹친다. 데이터 천이가 에지 근처 어디에 떨어질지는 고르게 퍼져 있으므로 \(\Delta V_0\)도 0 근처에 고르게 퍼져 있다. 그러면 결정 시간은 어떤 분포를 가질까?
결정 시간의 꼬리는 지수적으로 줄어든다. \(\tau\)만큼 더 기다릴 때마다 실패 확률이 \(e\)배(약 2.7배) 줄어든다. 줄어들 뿐 0이 되지는 않는다. 그래서 설계자는 "실패하지 않게"가 아니라 "평균 몇 년에 한 번 실패하게"를 목표로 삼고, 그 척도가 MTBF(Mean Time Between Failures)다.
\(t_r\)을 늘리는 가장 확실한 방법은 플립플롭을 하나 더 두는 것이다. 첫 FF가 메타안정에 빠져도 둘째 FF가 한 주기 뒤에 샘플링하므로 거의 한 주기 전체가 결정 시간으로 더해진다. 이렇게 FF를 2~3개 줄지어 놓은 회로를 동기화기(Synchronizer)라 한다. 지수 함수의 위력을 직접 확인해 보자.
2단 동기화기를 1 GHz에서 2 GHz로 올렸다. 분모의 \(f_{clk}\)가 두 배가 되니 MTBF는 절반이 될까?
답 보기
훨씬 더 나빠진다. 분모가 두 배가 되는 효과는 작고, 진짜 문제는 분자다. 주기가 1000 ps에서 500 ps로 줄면 \(t_r\)이 약 500 ps 줄고, \(\tau\)=10 ps라면 \(e^{-50} \approx 10^{-22}\)배가 된다. MTBF는 클럭 주파수에 지수적으로 민감하다. 그래서 고속 클럭 영역에서는 동기화기를 3단으로 늘리거나, \(\tau\)가 작은 전용 동기화기 셀을 쓴다.
여러 비트짜리 버스를 비트마다 따로 동기화하면, 각 비트가 서로 다른 주기에 결정될 수 있어 존재하지 않는 값(예: 0111→1000 사이의 1111)을 읽게 된다. 다중 비트는 그레이 코드 카운터, 핸드셰이크, 비동기 FIFO로 건넨다. 클럭 도메인 건너기(CDC)의 설계 패턴은 10장에서 다룬다.
플립플롭 변종과 레지스터
표준 셀 라이브러리에는 기본 D 플립플롭 말고도 기능을 덧붙인 변종이 수십 가지 있다. 대부분은 D 입력 앞에 작은 논리를 붙이거나 내부 고리에 트랜지스터를 몇 개 더한 것이다.
- 동기 리셋(Synchronous reset): D 앞에 AND 게이트를 두어 RST=1이면 다음 에지에서 0을 받는다. 리셋도 클럭에 맞춰 일어나므로 타이밍 분석이 쉽다.
- 비동기 리셋(Asynchronous reset): 내부 고리의 NAND/NOR 입력으로 들어가 클럭과 상관없이 즉시 Q를 0으로 만든다. 클럭이 아직 돌지 않는 전원 투입 직후에도 동작하지만, 리셋을 해제하는 순간이 에지와 가까우면 메타안정 위험이 있어 해제는 동기화해서 쓴다(비동기 인가·동기 해제).
- 인에이블(Enable): EN=0이면 Q를 다시 D로 돌려 넣는 MUX를 둔다. 값을 유지하는 레지스터 파일, 카운터에 쓴다. 클럭 자체를 멈추는 클럭 게이팅(15장)과 기능은 같지만 전력은 더 든다.
- 스캔 FF(Scan flip-flop): D 앞에 MUX를 두어 SE=1이면 D 대신 스캔 입력 SI를 받는다. 칩의 모든 FF를 하나의 긴 시프트 레지스터로 엮어 상태를 밀어 넣고 읽어 내는 테스트용 구조다(16장). 거의 모든 FF가 스캔 FF이며, MUX 때문에 setup이 몇 ps 늘어난다.
고성능 설계에서는 오버헤드 \(t_{cq}+t_{setup}\)를 줄이는 구조도 쓴다.
- 펄스 래치(Pulsed latch): 래치 하나에 클럭 상승 에지에서 만든 아주 짧은(수 ps~십수 ps) 펄스를 준다. 래치는 펄스 동안만 투명하므로 에지 트리거처럼 행동하면서 래치 하나의 지연(D→Q)만 든다. setup이 0이나 음수가 될 수 있지만 대신 hold가 펄스 폭만큼 늘어난다. 펄스 생성기는 여러 래치가 나눠 쓴다.
- 감지 증폭기형 FF(Sense-amplifier flip-flop, SAFF): 첫 단에 SRAM 감지 증폭기처럼 교차 결합된 차동 증폭기를 두고, 클럭 에지에서 D와 D̄의 작은 차이를 재생 고리로 빠르게 증폭한 뒤 SR 래치로 붙잡는다. 입력 차이가 작아도 되므로 setup이 짧고 저진폭 입력도 받을 수 있지만, 매 주기 프리차지하므로 전력이 크다.
여러 비트를 함께 저장하려면 FF를 나란히 놓고 클럭을 묶는다. 이것이 \(n\)비트 레지스터(Register)다. 표준 셀 라이브러리에는 2비트·4비트 FF를 한 셀로 묶어 클럭 인버터를 공유하는 멀티비트 FF도 있어 면적과 클럭 전력을 10~20% 줄인다. 아래 표는 DG-7 기준 공정에서 여러 순차 소자의 대략적인 특성이다.
| 소자 (DG-7, FO4 부하) | clk→Q (ps) | setup (ps) | hold (ps) | 오버헤드 \(t_{cq}+t_{su}\) | 면적 (인버터=1) | 에너지/주기 (fJ) |
|---|---|---|---|---|---|---|
| 단위 인버터 (참고) | FO4 7.5 | — | — | — | 1 | ~0.1 |
| TG D 래치 (투명 시 D→Q 약 12) | 14 | 6 | 2 | 20 (2.7 FO4) | ~3.5 | ~0.6 |
| TG 마스터-슬레이브 DFF | 18 | 8 | 2 | 26 (3.5 FO4) | ~6 | ~1.2 |
| 비동기 리셋 DFF | 20 | 9 | 2 | 29 (3.9 FO4) | ~7.5 | ~1.4 |
| 스캔 DFF (MUX 포함) | 18 | 13 | 3 | 31 (4.1 FO4) | ~8 | ~1.4 |
| 펄스 래치 (펄스 폭 10 ps) | 13 | −2 | 11 | 11 (1.5 FO4) | ~4 (+생성기) | ~0.9 |
| 감지 증폭기형 FF | 15 | 3 | 4 | 18 (2.4 FO4) | ~7.5 | ~1.8 |
| 2단 동기화기 (전용 셀) | — | — | — | 지연 2주기 | ~13 | ~2.4 |
표의 값은 교과서와 공개 자료를 바탕으로 DG-7에 맞춘 교육용 대략값이다. 실제 7 nm급 상용 라이브러리(약 2019~2022년)의 DFF는 clk→Q 약 20~40 ps, setup 약 10~30 ps 범위로 셀 크기·부하·코너에 따라 크게 달라진다. 에너지는 데이터가 매 주기 바뀐다고(활동도 0.5) 보았을 때의 값이며, 데이터가 바뀌지 않아도 클럭 트랜지스터 때문에 그 절반가량은 늘 쓴다. 칩 전체로 보면 FF와 클럭 배선이 동적 전력의 30~50%를 차지하기도 한다.
래치 기반 설계(2상 래치 파이프라인)는 오버헤드가 작고, 한 단의 논리가 늦어지면 다음 단의 시간을 빌려 쓰는 타임 보로잉(Time borrowing)이 가능해 고성능 CPU의 일부 경로에 쓰인다. 대신 타이밍 분석이 복잡하고 hold 검증이 까다롭다. 대부분의 ASIC은 플립플롭 하나로 통일하고, 래치는 클럭 게이팅 셀 내부처럼 꼭 필요한 곳에만 쓴다.
핵심 정리
- 순차 회로의 출력은 과거에 의존하며, 과거를 담는 유일한 방법은 되먹임 고리다.
- 인버터 두 개의 고리는 VTC 교점 셋 중 양 끝 둘이 안정(고리 이득 < 1), 가운데 \(V_M\)이 불안정(고리 이득 > 1)한 쌍안정 회로다.
- SR 래치는 쓰기·지우기가 가능하지만 S=R=1이 금지다. D 래치는 클럭이 1이면 투명, 0이면 유지하는 레벨 감응 소자로, TG 두 개와 인버터 두 개로 만든다.
- 반대 위상의 D 래치 두 개(마스터-슬레이브)를 이으면 클럭 상승 에지에서만 Q가 바뀌는 D 플립플롭이 된다.
- D가 에지에 가까워지면 clk→Q가 서서히, 그러다 급격히 늘어난다. setup·hold는 보통 clk→Q가 10% 늘어나는 점으로 정의하며, D→Q 합이 최소인 최적점이 있다.
- 메타안정의 결정 시간은 지수 분포이고 MTBF \(= e^{t_r/\tau}/(T_0 f_{clk} f_{data})\)이다. 동기화기에 FF를 한 단 더하면 MTBF가 수십 자리 커진다.
- 리셋·인에이블·스캔 FF는 D 앞 논리나 내부 고리를 고친 변종이고, 펄스 래치와 감지 증폭기형 FF는 오버헤드를 줄인다. FF를 클럭으로 묶은 것이 레지스터다.
확인 퀴즈
Q1. 인버터 두 개를 고리로 이은 회로에서 \(V_1=V_2=V_M\)인 점이 평형이면서도 불안정한 이유는?
Q2. NOR SR 래치에 S=1, R=1을 넣었을 때 출력은?
Q3. CLK=1에서 투명한 D 래치에 CLK=1인 동안 D가 0→1→0→1로 바뀌었다. 같은 D를 받는 상승 에지 D 플립플롭과 비교한 설명으로 옳은 것은?
Q4. FF의 clk→Q가 18 ps, setup이 8 ps, 두 FF 사이 최장 조합 논리가 124 ps다(스큐 0). 최대 클럭 주파수는?
Q5. 동기화기의 재생 시정수가 \(\tau\)=10 ps일 때 결정 시간 \(t_r\)을 100 ps 더 주면 MTBF는 대략 몇 배가 되는가?
Q6. 펄스 래치가 일반 마스터-슬레이브 FF에 비해 갖는 특징으로 옳은 것은?