디지털 회로 실험실
지금까지는 책이 준비한 회로를 만졌다. 이번에는 백지에서 시작한다. 게이트를 놓고 핀과 핀을 이으면 선이 곧바로 논리값 색으로 물들고, 스위치를 누르면 변화가 게이트를 하나씩 건너 퍼져 나간다. 실험실은 회로를 그리는 동안 진리표를 채우고, 파형을 기록하고, 가장 느린 경로와 트랜지스터 수와 전력을 함께 셈해 준다. 반가산기에서 시작해 카운터와 LFSR까지 만들어 보고, 마음에 드는 회로는 링크 하나로 친구에게 보내자.
- 게이트·플립플롭을 배치하고 배선해 조합 회로와 순차 회로를 직접 짓고 시뮬레이션한다.
- 이벤트 구동 시뮬레이터가 지연을 따라 값을 퍼뜨리는 방식과 글리치·X·Z가 생기는 까닭을 관찰한다.
- 논리적 노력 모델로 임계 경로 지연을, 토글 수로 동적 전력을, 게이트별 CMOS 트랜지스터 수로 면적을 어림한다.
- 도전 과제를 풀며 같은 기능을 더 적은 트랜지스터, 더 짧은 경로로 구현하는 감각을 익힌다.
실험실 사용법
아래 실험실은 2장의 논리 게이트, 8장의 플립플롭, 6장의 지연 모델을 한 화면에 모은 게이트 수준 시뮬레이터(Gate-level simulator)다. 실제 설계 현장에서 쓰는 논리 시뮬레이터와 같은 원리로 돈다. 게이트마다 지연이 있고, 입력이 바뀌면 그 지연만큼 뒤에 출력이 바뀐다는 사건을 시간 순서대로 처리한다.
조작은 몇 가지뿐이다. 마우스와 손가락이 똑같이 동작한다.
| 하고 싶은 일 | 방법 |
|---|---|
| 부품 놓기 | 위쪽 팔레트 단추를 누르면 화면 가운데 빈 자리에 놓인다. 게이트의 입력 수는 "2입력/3입력"으로 고른다. |
| 옮기기 | 부품 몸체를 끈다. 격자에 맞춰 붙는다. |
| 배선 | 핀(작은 동그라미)에서 다른 핀까지 끈다. 또는 핀을 한 번 누르고 다른 핀을 한 번 누른다. 선은 직각으로 알아서 꺾인다. |
| 선 모양 고치기 | 선을 눌러 고른 뒤 옆으로 끌면 세로 구간이 옮겨진다. |
| 입력 바꾸기 | 입력 스위치를 누른다. 클럭이 멈춰 있을 때 클럭 부품을 누르면 클럭이 한 번 뒤집힌다. |
| 지우기 | 부품이나 선을 고르고 Delete 또는 "삭제" 단추. Ctrl+Z로 되돌린다. |
| 화면 이동·확대 | 빈 곳을 끌면 이동, +/−/맞춤 단추나 Ctrl+휠, 두 손가락 벌리기로 확대·축소. |
좁은 화면에서는 먼저 예제를 불러와 "맞춤"으로 전체를 본 다음, 두 손가락으로 확대해 핀을 누르자. 핀을 누르는 판정 반경은 손가락에 맞춰 마우스보다 넓다. 끌기가 어렵다면 "핀 한 번, 다른 핀 한 번" 방식이 편하다.
게이트 지연은 기준 공정 DG-7의 논리적 노력 근사(τ ≈ 1.5 ps, FO4 ≈ 7.5 ps)로, 전력은 넷마다 커패시턴스를 어림해 토글 수를 곱한 값으로 계산한다. 모든 게이트가 단위 인버터와 같은 구동력을 가진다고 가정했다. 크기 조절, 입력 기울기, 배선 저항, 누설은 넣지 않았다. 절대값보다 "어느 쪽이 얼마나 더 느린가"를 보는 도구로 쓰자.
회로 실험실
처음 열면 반가산기가 놓여 있다. 왼쪽 스위치 A와 B를 눌러 보자. 초록 선은 논리 1, 회색 선은 0, 빨간 선은 값을 모르는 X, 주황 점선은 아무것도 구동하지 않는 Z다. 아래 예제 단추로 다른 회로를 불러오거나, "모두 지우기"로 백지에서 시작할 수 있다.
게이트 수준 회로 실험실
처음이라면 이 순서로 해 보자. ① "전가산기"를 불러와 A·B·Cin을 바꾸며 S와 Cout이 11장의 진리표와 같은지 본다. ② "SR 래치"를 불러와 S와 R을 번갈아 눌러 본다. 둘 다 0으로 돌아가도 Q가 그대로인 것이 기억이다. ③ "2비트 카운터"에서 "한 클럭"을 눌러 Q1Q0이 00→01→10→11로 세는지 본다(9장). ④ "4비트 리플 덧셈기"에서 임계 경로가 캐리 사슬을 따라 그어지는 것을 본다.
S와 R은 모두 0이다. 두 NOR 게이트는 서로의 출력을 입력으로 받는다. 시뮬레이터는 Q를 0으로 볼까, 1로 볼까?
답 보기
어느 쪽도 아니다. Q와 Q'은 빨간 X로 남는다. NOR(0, X) = X이고 이 값이 고리를 돌아 다시 X를 만든다. 실제 래치는 전원을 켜는 순간 잡음 때문에 둘 중 한 상태로 떨어지지만, 어느 쪽일지는 알 수 없다. 시뮬레이터는 이 "모름"을 X로 정직하게 보여 준다. S나 R을 한 번 1로 올리면 그제야 상태가 정해진다. 실제 칩에 리셋 신호가 꼭 필요한 이유가 이것이다.
진리표와 파형: 회로를 읽는 두 창
조합 회로라면 실험실은 모든 입력 조합을 넣어 본 진리표(Truth table)를 자동으로 만든다. 이름표 순서대로 입력 스위치(최대 6개)를 열로, 출력 LED를 오른쪽 열로 둔다. 표의 행을 누르면 스위치가 그 조합으로 바뀌어 실험실에서 확인할 수 있다. 출력마다 1이 되는 행 번호의 모음, 즉 최소항 합 \(\Sigma m\)도 함께 적는다(2장).
진리표 자동 생성
진리표는 시간을 지운 그림이다. 실제 회로에서 출력은 입력이 바뀐 뒤 게이트 지연만큼 늦게, 때로는 몇 번 흔들린 뒤에 자리를 잡는다. 이 시간의 모습을 보려면 파형(Waveform)이 필요하다. 아래 파형 뷰는 실험실의 입력·클럭·플립플롭·출력을 자동으로 기록한다. 중간 선을 보고 싶으면 실험실에서 선이나 게이트를 고르고 "파형에 추가"를 누르자.
파형 뷰
실험실의 엔진은 Verilog 시뮬레이터와 같은 이벤트 구동(Event-driven) 방식이다. "시각 t에 넷 n이 값 v가 된다"는 사건을 우선순위 큐에 넣고, 가장 이른 사건부터 꺼내 적용한 다음, 그 넷을 입력으로 쓰는 게이트만 다시 계산해 새 사건을 예약한다. 아무것도 바뀌지 않는 게이트는 건드리지 않으므로 수백만 게이트도 빠르게 돈다. 지연을 다루는 방식은 두 가지다. 입력 펄스를 그대로 늦춰 내보내는 전송 지연(Transport delay)과, 게이트 지연보다 짧은 펄스는 삼켜 버리는 관성 지연(Inertial delay). 실험실은 글리치를 보여 주려고 전송 지연을 쓴다. 실제 게이트는 그 중간쯤이다. 합성 뒤 넷리스트를 SDF 지연과 함께 돌리는 일은 17장의 설계 흐름에 이어진다.
지연과 임계 경로
실험실은 게이트마다 지연을 논리적 노력으로 계산한다. 모든 게이트를 단위 인버터와 같은 출력 구동력으로 만들었다고 보면, 게이트의 지연은 고정된 기생 지연에, 출력에 매달린 커패시턴스(다음 게이트들의 입력과 배선)에 비례하는 몫을 더한 값이다.
| 게이트 | 논리적 노력 g | 기생 지연 p | CMOS 트랜지스터 | FO4 부하일 때 지연 |
|---|---|---|---|---|
| NOT | 1 | 1 | 2 | 7.5 ps |
| BUF (인버터 2단) | 1 | 3 | 4 | 10.5 ps |
| NAND2 / NAND3 | 4/3 · 5/3 | 2 · 3 | 4 · 6 | 9.0 · 10.5 ps |
| NOR2 / NOR3 | 5/3 · 7/3 | 2 · 3 | 4 · 6 | 9.0 · 10.5 ps |
| AND2 / OR2 (NAND/NOR + NOT) | 4/3 · 5/3 | 4 | 6 | 12.0 ps |
| AND3 / OR3 | 5/3 · 7/3 | 5 | 8 | 13.5 ps |
| XOR2 / XNOR2 | 4 | 4 | 12 | 12.0 ps |
| XOR3 / XNOR3 (XOR2 두 단) | 4 | 12 | 24 | 24.0 ps |
| 2:1 MUX | 2 | 4 | 12 | 12.0 ps |
| D 플립플롭 (마스터-슬레이브) | 1 | 10 (clk→Q) | 24 | 21.0 ps |
표의 g와 p는 Weste & Harris의 정적 CMOS 값을 따랐고, 트랜지스터 수는 정적 CMOS 구현(XOR은 입력 반전 포함 12개, 플립플롭은 전송 게이트 마스터-슬레이브 24개)의 흔한 값이다. "FO4 부하일 때"는 인버터 4개를 구동할 때다. 아래 그림에서 게이트 종류와 팬아웃을 바꿔 보면, 같은 팬아웃이라도 g가 큰 게이트를 구동할수록 앞 게이트가 느려진다는 것이 보인다.
같은 기능도 어떤 게이트로 짓느냐에 따라 값이 달라진다. 도전 과제 1번의 주제인 XOR을 세 가지로 지어 비교해 보자. 표준 셀 라이브러리가 XOR을 따로 두는 이유가 여기 있다.
회로 전체의 속도는 가장 느린 길, 임계 경로(Critical path)가 정한다. 실험실은 입력 스위치와 플립플롭 출력에서 출발해 LED와 플립플롭 D 입력에 도착하는 모든 경로의 도착 시각을 계산하고(10장의 정적 타이밍 분석과 같다), 가장 늦은 경로를 캔버스에 주황색으로 칠한다. 아래 그림은 그 경로를 게이트 단위로 펼친 것이다.
"2비트 카운터"를 불러와 실행 중에 클럭 주기를 20 ps까지 줄여 보기 전에 예상하자. 실험실이 계산한 최소 주기는 약 43 ps다.
답 보기
카운터가 엉뚱하게 센다. 상승 에지 순간 플립플롭은 D에 걸려 있는 값을 잡는데, XOR이 새 값을 다 계산하기 전이라 지난 값을 잡는다. 이것이 setup 위반이다(10장). 실제 플립플롭은 여기서 메타안정 상태에 빠질 수도 있지만 실험실은 그냥 이전 값을 잡는다. 경고창에도 "setup 위반"이 뜬다.
토글을 세면 전력이 보인다
CMOS 게이트는 출력이 바뀔 때만 전원에서 전하를 끌어 쓴다. 넷의 커패시턴스 \(C\)를 0에서 \(V_{DD}\)로 충전할 때 전원이 내놓는 에너지는 \(CV_{DD}^2\)이고, 그 절반은 충전 경로에서, 나머지 절반은 다음 방전 때 열이 된다. 그러니 토글 한 번(올라가거나 내려가거나)마다 평균 \(\tfrac12 CV_{DD}^2\)을 쓴다고 셈할 수 있다(15장).
토글 수에는 쓸모없는 토글도 들어간다. 입력이 바뀐 뒤 출력이 최종값에 이르기 전에 잠깐 반대로 튀는 펄스, 글리치(Glitch)다. 길이가 다른 두 경로가 한 게이트에서 다시 만나면 생긴다(2장의 해저드). "글리치 데모"는 \(Y = A\bar S + BS\)를 A = B = 1로 둔 회로다. 논리식으로는 S가 무엇이든 Y = 1이다.
S̄는 인버터 세 개를 거쳐 늦게 도착한다. 파형 뷰를 "최근 60 ps"로 두고 S를 눌러 보기 전에 예상하자. 0→1로 올릴 때는 어떨까?
답 보기
S를 내리면 위쪽 AND(B·S)가 먼저 0이 되고, 아래쪽 AND(A·S̄)는 인버터 세 개의 지연(약 10 ps) 뒤에야 1이 된다. 그 사이 OR의 두 입력이 모두 0이라 Y가 약 10 ps 동안 0으로 떨어졌다가 돌아온다(정적 1 해저드). 반대로 S를 올릴 때는 B·S가 먼저 1이 되고 A·S̄가 나중에 0이 되므로 겹침 구간에 Y는 계속 1이다. 전력 그림에서 Y의 토글이 늘어난 것도 확인하자. 해저드를 없애려면 합의항 AB를 더한다.
X와 Z, 그리고 고리
시뮬레이터는 0과 1 말고 두 값을 더 쓴다. X는 "0인지 1인지 모른다"이다. 초기화되지 않은 상태, 두 출력이 서로 다른 값으로 한 선을 다투는 충돌, 떠 있는 입력을 받은 게이트의 출력이 X가 된다. Z는 "아무도 구동하지 않는다", 즉 고임피던스다. 실험실에서는 아무 출력과도 이어지지 않은 선이 Z다. 게이트는 Z 입력을 X로 받아들인다. 실제 CMOS 게이트 입력이 떠 있으면 중간 전압에 머물러 단락 전류가 흐르고 값도 믿을 수 없기 때문이다.
게이트 출력이 플립플롭을 거치지 않고 자기 입력으로 돌아오는 고리를 조합 루프(Combinational loop)라 한다. 실험실은 이런 고리를 찾아 경고하고 해당 게이트 테두리를 노랗게 칠한다. SR 래치처럼 일부러 만든 고리도 있지만, 대부분은 실수다. 정적 타이밍 분석은 고리를 끊어야 계산할 수 있고, 진리표도 상태에 따라 달라지므로 만들 수 없다. 인버터 세 개를 고리로 이으면 4장의 링 오실레이터가 되는데, 처음 값이 X라서 시뮬레이터에서는 X가 영원히 돈다. 반대로 SR 래치에서 S와 R을 둘 다 1로 올렸다가 정확히 동시에 내리면, 두 NOR가 같은 지연으로 같이 뒤집히기를 끝없이 되풀이한다. 실험실은 사건이 멈추지 않으면 "발진" 경고를 띄운다. 실제 회로에서는 두 게이트의 미세한 차이가 결국 한쪽을 이기게 하는데, 그 시간이 길어질 수 있다는 것이 메타안정성이다.
실험실의 플립플롭은 선택 막대의 "초깃값"으로 정한 값에서 시작한다. 그래야 LFSR이 전부 0인 고착 상태에 빠지지 않는다. 실제 칩에서는 전원을 켠 순간 플립플롭 값이 정해지지 않으므로, 상태가 중요한 레지스터에는 리셋 입력을 단다. RTL 시뮬레이션에서 리셋을 빼먹은 레지스터가 X로 남아 퍼지는 것을 찾는 일은 검증 엔지니어의 일상이다.
도전 과제
아래 과제는 실험실의 현재 회로로 실시간 채점된다. 과제마다 정해진 이름표(예: 입력 A, B와 출력 Y)를 단 스위치와 LED가 있어야 하므로, 먼저 "시작 회로"를 눌러 입출력만 놓인 판을 불러오자. 진리표가 모든 행에서 맞고 제약(쓸 수 있는 게이트, 트랜지스터 수, 지연)을 지키면 동그라미가 초록 체크로 바뀐다. 한 번 푼 과제는 이 브라우저에 기억된다.
도전 과제 6개
힌트 보기
① NAND로 XOR: 먼저 \(n = \overline{AB}\)를 만들고, \(\overline{An}\)과 \(\overline{Bn}\)을 다시 NAND하자. NAND2 네 개면 16개다. ② 다수결 \(Y = AB + BC + CA\)는 드모르간으로 NAND2 세 개와 NAND3 하나로 바꿀 수 있다. ③ MUX \(Y = \bar S D_0 + S D_1\)도 같은 요령으로 NAND2 셋과 NOT 하나. ④ \(AB = \overline{\bar A + \bar B}\). ⑤ 캐리는 \(A \oplus B\)가 1이면 Cin을, 0이면 A(= B)를 그대로 내보낸다. MUX를 쓰자. ⑥ XOR을 사슬로 이으면 단이 셋이다. 두 쌍을 먼저 XOR하고 결과를 합치는 트리로 바꾸자.
핵심 정리
- 게이트 수준 시뮬레이터는 "시각 t에 넷이 v가 된다"는 사건을 시간 순으로 처리하고, 바뀐 넷의 팬아웃만 다시 계산한다.
- 선의 값은 0·1 말고도 X(모름·충돌)와 Z(떠 있음)가 있다. 지배값(AND의 0, OR의 1)은 X를 가린다.
- 게이트 지연은 \(\tau(p + C_\text{load}/C_\text{inv})\)로 어림하고, 입력에서 출력·플립플롭까지 가장 늦은 경로가 임계 경로다. 순차 회로의 최소 주기는 clk→Q + 경로 + setup이다.
- 동적 에너지는 넷마다 토글 수 × ½CV²의 합이다. 글리치도 토글이므로 전력을 쓴다.
- 같은 기능도 구현에 따라 트랜지스터 수와 지연이 다르다. NAND2 네 개로 만든 XOR은 16개, 트리 구조는 사슬보다 단이 적다.
- 조합 루프는 기억(래치)이나 발진을 만든다. 의도하지 않았다면 끊어야 진리표와 타이밍 분석이 성립한다.
확인 퀴즈
Q1. AND 게이트의 두 입력이 0과 X다. 3값 논리 시뮬레이터가 내는 출력은?
Q2. 단위 구동력 NAND2(p = 2)가 NAND2 입력 3개(g = 4/3)를 구동한다. 배선을 무시하면 지연은? (τ = 1.5 ps)
Q3. 카운터의 clk→Q가 21 ps, D까지의 조합 경로가 18 ps, setup이 6 ps다. 가장 짧게 쓸 수 있는 클럭 주기는?
Q4. 커패시턴스 2 fF인 넷이 1 ns 동안 10번 토글했다. VDD = 0.75 V일 때 이 넷의 평균 동적 전력은?
Q5. \(Y = A\bar S + BS\)에서 A = B = 1일 때 S가 1→0으로 바뀌며 Y에 짧은 0 펄스가 생겼다. 가장 알맞은 설명과 대책은?