Chapter 03

논리 합성

2장에서 쓴 Verilog는 아직 "무엇을 하라"는 설명일 뿐이다. 이것을 실제로 공장에서 찍을 수 있는 트랜지스터 묶음, 즉 표준 셀을 잇는 게이트 넷리스트로 바꾸는 일이 논리 합성(Logic synthesis)이다. 합성 도구는 불 대수로 식을 줄이고, 라이브러리의 셀로 식을 덮고, 셀의 크기를 골라 타이밍 제약을 맞춘다. 이 장에서는 그 세 단계, 불 최적화·기술 매핑·게이트 사이징을 작은 알고리즘으로 직접 돌려 본다.

합성의 흐름: RTL에서 넷리스트로

합성 도구는 세 가지를 입력으로 받는다. 설계 자체인 RTL(Verilog/SystemVerilog), 쓸 수 있는 부품 목록인 표준 셀 라이브러리(Liberty .lib: 셀마다 기능·면적·핀 커패시턴스·지연 표), 그리고 목표인 제약(SDC: 클럭 주기, 입출력 지연, 부하). 출력은 라이브러리 셀의 인스턴스와 그 연결만 남은 게이트 수준 넷리스트(.v)다. 이 넷리스트가 5장의 배치·배선으로 넘어간다.

RTL (.v) Liberty (.lib) 제약 (SDC) ① 해석elaboration · 구조 파악 ② 일반 논리GTECH (기술 독립) ③ 불 최적화2단·다단 논리 축소 ④ 기술 매핑셀 패턴으로 덮기 ⑤ 사이징·버퍼링X1→X4, 버퍼 삽입 게이트 넷리스트.v + 보고서 → 5장 .lib의 면적·지연, SDC의 주기가 ③~⑤의 목적 함수가 된다
그림 03-1. 논리 합성의 단계. ①~③은 라이브러리와 무관한 "기술 독립" 단계, ④~⑤는 특정 라이브러리(여기서는 EDU45)에 묶인 "기술 의존" 단계다. 실제 도구는 ③~⑤를 타이밍을 보며 여러 번 반복한다.
  1. 해석(Elaboration): 모듈 계층을 펼치고 파라미터를 대입하며, always @(posedge clk)는 플립플롭으로, case는 다중화기로, +는 덧셈기로 알아본다(추론, inference).
  2. 일반 논리: 특정 공정과 무관한 가상 게이트(시놉시스의 GTECH 같은 AND·OR·MUX·덧셈기 모음)로 회로를 적는다. 덧셈기·곱셈기 같은 산술은 별도의 구조 라이브러리(리플·캐리 룩어헤드 등)에서 고른다.
  3. 불 최적화: 상수 전파, 공통 부분식 추출, 인수분해, don't care 활용으로 리터럴 수를 줄인다. 다음 절의 카르노 맵이 그 2단 버전이다.
  4. 기술 매핑: 최적화된 논리를 라이브러리 셀로 덮는다. 같은 식도 어떤 셀을 쓰느냐에 따라 면적·지연이 달라진다.
  5. 사이징·버퍼링: 타이밍이 모자란 경로의 셀을 키우고(X1→X2→X4), 팬아웃이 큰 넷에 버퍼 트리를 넣고, 여유 있는 경로는 줄여 면적·전력을 아낀다.
// RTL (2장)                         // 합성 결과 (EDU45 넷리스트, 일부)
assign y = ~((a & b) | c);              AOI21_X1 U12 (.A1(a), .A2(b), .B(c), .Y(y));
always @(posedge clk) q <= d;          DFF_X1   q_reg (.D(d), .CK(clk), .Q(q));

불 최적화와 카르노 맵

조합 논리는 진리표 하나로 완전히 정해지지만, 같은 진리표를 만드는 식은 무수히 많다. 2단 논리에서 비용이 가장 적은 식, 즉 최소 곱의 합(Minimum SOP)을 찾는 것이 고전적인 불 최적화 문제다. 곱항(AND) 하나가 진리표의 1을 여러 개 덮을수록 리터럴이 줄어든다.

용어를 정리하자. 출력이 1인 입력 조합이 최소항(minterm)이고, 출력이 무엇이든 상관없는 조합이 don't care(X)다. 1과 X만 덮는 곱항을 함의항(implicant), 리터럴을 하나라도 빼면 0을 덮게 되어 더 키울 수 없는 함의항을 주항(Prime implicant)이라 한다. 어떤 최소항을 덮는 주항이 하나뿐이면 그 주항은 필수 주항(essential prime)이다. 최소 SOP는 언제나 주항들로만 만들 수 있다.

$$x\,y + x\,\bar y = x \qquad\Rightarrow\qquad \text{인접한 } 2^k \text{개의 1} \;\to\; \text{리터럴 } n-k \text{개짜리 곱항 하나}$$
카르노 맵은 이웃 칸이 한 비트만 다르도록 그레이 코드(00, 01, 11, 10) 순서로 진리표를 접어 놓은 것이다. 그래서 인접한 1의 직사각형(크기 1·2·4·8…, 가장자리끼리도 이웃)이 곧 함의항이다. 퀸–매클러스키(Quine–McCluskey) 방법은 같은 결합 규칙을 표로 반복해 모든 주항을 만든 뒤, 최소항을 모두 덮는 가장 싼 주항 조합(집합 덮개 문제)을 고른다.
SIMULATOR

카르노 맵과 최소 SOP (퀸–매클러스키)

변수 수
예제

칸을 누를 때마다 0 → 1 → X(don't care) → 0으로 바뀐다.

f = —
최소항 / don't care—
주항 수 (필수)—
곱항 수—
리터럴 수—
게이트 수 (AND·OR·INV)—
해볼 것: ① "7-세그먼트 a"는 BCD 입력이라 10~15가 don't care다. X를 0으로 바꿔 보면(다시 누르기) 곱항과 리터럴이 늘어난다. don't care는 "공짜로 묶음을 키우는 칸"이다. ② "패리티"(XOR)는 이웃한 1이 하나도 없어 8개 최소항이 그대로 남는다. 2단 SOP로는 최악이고, 그래서 라이브러리에 XOR2 셀을 따로 둔다. ③ "순환 덮개"는 필수 주항이 하나도 없어 고르는 방법이 여럿인 경우다. 점선을 켜고 어떤 주항을 버렸는지 보라. (비용 = 곱항 수 우선, 같으면 리터럴 수. 분기 한정 탐색으로 정확한 최솟값을 구한다. 게이트 수는 2입력 이상 곱항당 AND 1, 곱항 2개 이상이면 OR 1, 보수 변수당 INV 1.)
실제 도구는 다단 논리를 다룬다

변수가 수십 개인 실제 회로에서 정확한 2단 최소화는 계산량이 폭발한다(주항 수가 변수에 지수적). 그래서 Espresso 같은 휴리스틱(확장·축소·불필요 제거 반복)을 쓰고, 그보다는 다단 논리가 중심이다. \(f = ac + ad + bc + bd\)를 \(f=(a+b)(c+d)\)로 인수분해하면 리터럴이 8개에서 4개로 준다. 여러 출력이 함께 쓰는 공통 부분식을 뽑아 내고(kernel extraction), 오늘날에는 AND–INV 그래프(AIG) 위에서 재작성(rewriting)을 반복한다. 다만 다단으로 갈수록 논리 깊이가 늘어 지연이 커지므로, 면적과 지연의 맞바꿈이 생긴다.

CMOS 게이트는 왜 반전형인가

정적 CMOS 게이트는 출력을 VDD에 잇는 풀업망(pMOS)과 GND에 잇는 풀다운망(nMOS)으로 이루어진다. nMOS는 게이트가 1일 때 켜져 출력을 0으로 끌어내리고, pMOS는 게이트가 0일 때 켜져 출력을 1로 끌어올린다. 그래서 입력이 1로 오를수록 출력은 0으로 가는, 반전만 한 단으로 만들 수 있다. nMOS를 직렬로 두면 AND 조건으로 끌어내리므로 \(Y=\overline{A\cdot B}\)(NAND), 병렬로 두면 \(Y=\overline{A+B}\)(NOR)이다. 풀업망은 풀다운망의 쌍대(Dual), 즉 직렬↔병렬을 바꾼 구조라 두 망 중 정확히 하나만 켜진다(정적 전류 0).

NAND2: Y = (A·B)′ VDD Y AB 풀업: 병렬 AB GND 풀다운: 직렬 NOR2: Y = (A+B)′ VDD AB 풀업: 직렬 Y AB GND 풀다운: 병렬
그림 03-2. NAND2와 NOR2. 풀다운망(nMOS)이 직렬이면 풀업망(pMOS)은 병렬이고, 그 반대도 같다. 직렬로 쌓인 트랜지스터는 저항이 더해지므로 같은 구동력을 내려면 폭을 키워야 한다. 정공 이동도가 전자의 약 1/2인 pMOS가 직렬로 쌓이는 NOR가 NAND보다 불리한 이유다.

같은 원리로 풀다운망을 "직렬 둘 + 병렬 하나"로 만들면 \(\overline{AB + C}\)가 한 단에 나온다. 이것이 AOI(AND-OR-Invert) 셀이고, 쌍대인 OAI는 \(\overline{(A+B)C}\)다. 반대로 AND·OR처럼 반전이 없는 기능은 NAND 뒤에 인버터를 붙인 두 단이라 면적·지연이 더 크다. 그래서 합성 도구는 가능하면 반전형 셀로 덮고, 논리 극성은 드모르간 법칙으로 앞뒤로 밀어 맞춘다. 셀 한 개의 실제 레이아웃(활성 영역·폴리·컨택·M1)은 4장 표준 셀과 레이아웃에서, 그 트랜지스터를 만드는 공정은 ProcessBook 12장 CMOS 공정 통합에서 볼 수 있다.

표준 셀 라이브러리와 Liberty

표준 셀은 높이가 같고(EDU45: 9트랙 = 1260 nm) 폭이 게이트 피치(CPP = 190 nm)의 정수배인 레이아웃 조각이다. 높이가 같아서 행(row)에 레고처럼 나란히 꽂을 수 있다(5장). 라이브러리에는 기능마다 구동력이 다른 여러 크기(X1, X2, X4…)와 문턱 전압이 다른 변종(LVT·SVT·HVT, 9장)이 수백~수천 개 들어 있다. 아래는 이 책의 가상 라이브러리 EDU45의 대표 셀이다.

셀기능트랜지스터폭 (CPP)면적 (µm²)입력 C (fF)gp지연 @4 fF (ps)
INV_X1A′220.481.001115
INV_X4A′ (4배 구동)851.204.00116
NAND2_X1(AB)′430.721.334/3218
NAND3_X1(ABC)′640.961.675/3321
NOR2_X1(A+B)′430.721.675/3218
NOR3_X1(A+B+C)′640.962.337/3321
AND2_X1AB (NAND2+INV)640.961.334/3≈424
OR2_X1A+B (NOR2+INV)640.961.675/3≈424
AOI21_X1(A₁A₂+B)′640.962.0 / 1.672 / 5/37/319
OAI21_X1((A₁+A₂)B)′640.962.0 / 1.672 / 5/37/319
AOI22_X1(AB+CD)′851.202.002424
XOR2_X1A⊕B1061.44~2.0~2~4~27
MUX2_X1S ? B : A1271.681.5 / 2.2 (S)——~30
DFF_X1CK↑에서 Q←D24184.311.0 / 0.9 (CK)——clk→Q 45

면적 = 폭(CPP) × 0.19 µm × 1.26 µm. 입력 C는 X1 인버터(1 fF)와 같은 구동력을 내도록 크기를 맞췄을 때의 값이라 논리적 노력 \(g\)와 같다. 지연은 \(d=(gh+p)\tau\), \(\tau = 3\) ps(FO4 = 5τ = 15 ps)로 계산한 교육용 근사값이며, 4 fF 부하에서는 X1 셀의 \(gh\)가 모두 4가 되어 지연이 \(p\)로만 갈린다. DFF의 셋업 약 25 ps, 홀드 약 5 ps.

Liberty 파일은 이 정보를 텍스트로 적은 것이다. 지연은 상수가 아니라 입력 슬루 × 출력 부하 2차원 표(NLDM)로 주어지고, 상승·하강, 핀마다 따로 있다. 표를 읽고 보간하는 방법은 8장에서 직접 해 본다.

library (edu45_tt_1p00v_25c) {
  time_unit : "1ns" ;  capacitive_load_unit (1, pf) ;  nom_voltage : 1.00 ;
  cell (NAND2_X1) {
    area : 0.718 ;                                /* 3 CPP × 0.19 × 1.26 µm */
    pin (A) { direction : input ; capacitance : 0.00133 ; }
    pin (Y) { direction : output ; function : "!(A & B)" ;
      timing () { related_pin : "A" ; timing_sense : negative_unate ;
        cell_fall (delay_6x6) {
          index_1 ("0.005, 0.01, 0.02, 0.04, 0.08, 0.16") ;  /* 입력 슬루 (ns) */
          index_2 ("0.0005, 0.001, 0.002, 0.004, 0.008, 0.016") ;  /* 부하 (pF) */
          values ("0.0081, 0.0100, 0.0138, 0.0214, ...", ...) ; }
        fall_transition (delay_6x6) { ... }  /* 출력 슬루 표 */
      } } } }

기술 매핑: 트리 커버링

최적화된 논리를 라이브러리 셀로 바꾸는 표준 방법(Keutzer의 DAGON, 1987)은 이렇다. 먼저 회로를 NAND2와 INV만으로 다시 쓴 주체 그래프(Subject graph)를 만든다. 라이브러리의 각 셀도 NAND2–INV 패턴 그래프로 적어 둔다(예: AOI21 = INV(NAND(NAND(a,b), INV(c)))). 그다음 주체 그래프를 패턴들로 겹치지 않게 빠짐없이 덮는다. 덮개 하나가 셀 인스턴스 하나다.

주체 그래프가 트리라면 이 문제는 동적 계획법(Dynamic programming)으로 정확히 풀린다. 출력 쪽 노드 \(v\)에서 맞는 패턴 \(m\)을 하나 고르면, 남는 일은 패턴의 입력이 닿는 노드들을 각각 최적으로 덮는 것이고, 그 하위 문제들은 서로 독립이다.

$$\mathrm{cost}(v) = \min_{m \,\in\, \text{match}(v)} \Big[\, A(m) + \sum_{u \,\in\, \text{inputs}(m)} \mathrm{cost}(u) \Big], \qquad \mathrm{cost}(\text{입력 단자}) = 0$$
면적 목적이면 \(A(m)\)은 셀 면적, 합 \(\sum\) 그대로. 지연 목적이면 합 대신 \(\max_u\)를 쓰고 셀 지연을 더한다. 잎에서 뿌리로 한 번 훑으면 되므로 노드 수에 선형이다. 실제 회로는 팬아웃이 있는 DAG라 팬아웃 지점에서 트리로 자른 뒤 각각 덮는다(그래서 전역 최적은 아니다).
SIMULATOR

기술 매핑: 동적 계획법 트리 커버링

목적
사용 가능한 셀
면적—
셀 수—
출력 지연 (4 fF)—
면적 목적 결과—
지연 목적 결과—
해볼 것: ① "(a·b + c)′"에서 AOI21을 끄면 NAND2 + INV + AND2로 덮여 면적이 4 → 9 CPP로 늘어난다. ② "((a+b)·(c+d))′"는 목적에 따라 답이 갈린다. 면적 목적은 큰 OAI21 + OR2(8 CPP), 지연 목적은 인버터 4개 + NAND2 3개(17 CPP)로 무거운 셀을 피한다. ③ "8입력 AND"에서 NAND3·NOR3를 끄고 켜 보라. 위 그림은 주체 그래프(▷ = INV, D = NAND2)와 덮개, 아래 그림은 결과 넷리스트다. (모든 셀 X1, 셀 지연 = (p + 부하 C / 1 fF)·τ, τ = 3 ps, 입력 단자는 X1 인버터가 구동, 출력 부하 4 fF로 둔 논리적 노력 모델)

시뮬레이터에서 보듯 같은 함수라도 목적과 라이브러리 구성에 따라 넷리스트가 크게 달라진다. 복합 셀(AOI·OAI)은 면적에 유리하지만 직렬 트랜지스터가 많아 입력 커패시턴스와 기생 지연이 크다. 그래서 실제 합성은 비임계 경로는 면적으로, 임계 경로는 지연으로 매핑하는 혼합 전략을 쓴다. XOR·MUX처럼 NAND2–INV 트리로 표현하면 같은 입력이 여러 번 나오는 셀은 트리 패턴으로 잘 잡히지 않아, 불 매칭(진리표 비교)이나 컷 기반 매핑(오늘날 ABC 등)을 쓴다.

논리적 노력: 게이트 크기와 단 수

매핑이 끝나면 셀의 크기를 정해야 한다. 큰 부하(긴 배선, 많은 팬아웃, 칩 밖 패드)를 X1 게이트 하나로 몰면 매우 느리다. 반대로 첫 단을 크게 만들면 그 앞 단의 부하가 커진다. Sutherland와 Sproull의 논리적 노력(Logical effort)은 이 문제를 간단한 식으로 푼다. 게이트 한 단의 지연을 인버터 시간 상수 \(\tau\) 단위로 적으면

$$d = g\,h + p, \qquad h = \frac{C_{\text{out}}}{C_{\text{in}}}$$
\(g\)(논리적 노력)는 같은 출력 전류를 낼 때 그 게이트의 입력 커패시턴스가 인버터의 몇 배인지(NAND2 4/3, NOR2 5/3), \(h\)(전기적 노력)는 팬아웃, \(p\)는 자기 출력의 기생 커패시턴스로 인한 지연(인버터 1, NAND2 2). FO4 인버터 지연은 \(d = 1\cdot4+1 = 5\tau\)이고, EDU45에서 약 15 ps이므로 \(\tau \approx 3\) ps다.

여러 단으로 이어진 경로에서는 각 단의 노력을 곱한 경로 노력 \(F\)가 핵심이다. 분기 노력 \(b\)(한 단의 출력이 경로 밖으로도 갈라져 나갈 때의 비율)까지 넣으면

$$F = G\,B\,H = \prod g_i \cdot \prod b_i \cdot \frac{C_{\text{load}}}{C_{\text{in}}}, \qquad \hat f = F^{1/N}, \qquad D_{\min} = N F^{1/N} + \sum p_i, \qquad \hat N \approx \log_4 F$$
경로 지연은 각 단의 노력 \(f_i = g_i h_i\)가 모두 같을 때 최소다. 그때의 단 수 \(N\)을 바꾸어 가며 \(D\)를 최소화하면 단 노력이 \(\rho \approx 3.6\)(기생 \(p=1\)일 때, 흔히 4로 어림)일 때 최적이다. 그래서 "4배씩 키운 인버터 사슬"이 정석이다. 각 단의 입력 커패시턴스는 뒤에서부터 \(C_{\text{in},i} = g_i C_{\text{out},i} / \hat f\)로 정한다.
SIMULATOR

큰 부하 구동: 단 수와 크기에 따른 경로 지연

첫 단 게이트
크기 정하기
경로 노력 F—
log₄F (최적 N 추정)—
단 노력 f—
현재 지연—
최적 정수 N에서—
해볼 것: ① 기본 부하는 약 148 fF, 첫 단 입력은 1 fF이며 F ≈ 148이고 기본 단 수는 2다. N = 4에서는 약 17.95τ ≈ 53.85 ps로 최적이다. 부하를 1 pF(F = 1000)로 올리면 N = 1의 1001τ ≈ 3 ns가 N = 5에서 약 24.91τ ≈ 74.72 ps로 줄어든다. ② 최적점 근처에서는 곡선이 평평하다. N이 하나 더 많거나 적어도 손해가 수 %라, 극성(반전 횟수)을 맞추려 단을 하나 더 넣는 것은 거의 공짜다. ③ 고정 배율로 바꾸고 r을 2~8로 움직여 보라. 단 수를 정해 둔 채 배율이 어긋나면 마지막 단이 과부하가 되거나 앞단이 과부하가 된다. (Cin = 첫 단 X1의 입력 C = g × 1 fF, 이후 단은 인버터, 극성은 무시, τ = 3 ps)

SDC 제약: 합성이 겨냥하는 목표

합성 도구는 "얼마나 빨라야 하는지" 알아야 매핑과 사이징을 결정할 수 있다. 그 목표를 적는 표준 언어가 Tcl 기반의 SDC(Synopsys Design Constraints)다. 같은 SDC가 합성, 배치·배선, 사인오프 타이밍 분석까지 그대로 따라간다.

# 단위: 시간 ns, 커패시턴스 pF (라이브러리 단위를 따른다)
create_clock -name clk -period 1.00 [get_ports clk]          # 1 GHz
set_clock_uncertainty 0.05 [get_clocks clk]                 # 지터 + CTS 전 스큐 여유
set_input_delay  0.30 -clock clk [remove_from_collection [all_inputs] [get_ports clk]]
set_output_delay 0.25 -clock clk [all_outputs]
set_driving_cell -lib_cell INV_X1 [all_inputs]
set_load 0.004 [all_outputs]                                # 4 fF
set_max_transition 0.08 [current_design]                    # 슬루 상한 80 ps
명령뜻합성에 주는 영향
create_clock클럭 포트와 주기(파형)레지스터 사이 조합 논리의 지연 예산 = 주기 − clk→Q − 셋업
set_input_delay입력 신호가 바깥 레지스터를 떠나 이 블록 핀에 오기까지 이미 쓴 시간입력 → 첫 레지스터 경로의 예산 = 주기 − 0.30 ns
set_output_delay출력 핀에서 바깥 캡처 레지스터까지 남은 경로가 쓸 시간마지막 레지스터 → 출력 경로의 예산 = 주기 − 0.25 ns
set_load · set_driving_cell출력 핀에 달린 부하, 입력 핀을 구동하는 셀경계 셀의 크기(사이징), 버퍼 삽입
set_max_transition슬루(전이 시간) 상한팬아웃 큰 넷에 버퍼 트리 삽입
제약이 곧 설계다

제약이 너무 느슨하면 도구는 면적이 작고 느린 회로를 만들고, 너무 빡빡하면 셀을 잔뜩 키워 면적·전력이 폭증한다. 블록 사이의 입출력 지연을 나누는 일(시간 예산, time budgeting)도 설계자의 몫이다. 이 제약들이 실제로 어떻게 검사되는지, 셋업·홀드와 슬랙은 8장 정적 타이밍 분석에서 다룬다. 거짓 경로·멀티사이클 경로 같은 예외 제약도 그 장에 있다.

합성 보고서 읽기와 등가성 검사

합성이 끝나면 도구는 면적·타이밍·전력 보고서를 낸다. 가장 먼저 보는 것은 타이밍 보고서의 최악 경로다. 한 줄 한 줄이 셀 하나 또는 넷 하나이고, 지연이 쌓여 도착 시간이 되며, 요구 시간과의 차가 슬랙이다.

Report : timing  -path full  -delay max          (EDU45 TT 1.0 V 25 °C, 와이어 로드 모델)
Startpoint: u_ctrl/state_reg[1] (rising edge-triggered flip-flop clocked by clk)
Endpoint:   u_alu/acc_reg[7]    (rising edge-triggered flip-flop clocked by clk)
  Point                                   Incr      Path
  clock clk (rise edge)                  0.000     0.000
  u_ctrl/state_reg[1]/CK (DFF_X1)        0.000     0.000 r
  u_ctrl/state_reg[1]/Q  (DFF_X1)        0.046     0.046 f
  u_alu/U231/Y (NAND2_X1)                0.021     0.067 r
  u_alu/U240/Y (AOI21_X2)                0.024     0.091 f
  ...                                     ...       ...
  u_alu/U388/Y (OAI21_X1)                0.026     0.787 r
  u_alu/acc_reg[7]/D (DFF_X1)            0.004     0.791 r
  data arrival time                                0.791
  clock clk (rise edge)                  1.000     1.000
  clock uncertainty                     -0.050     0.950
  library setup time                    -0.025     0.925
  data required time                               0.925
  slack (MET)                                      0.134

Report : area      Combinational  1 842.6 µm²   Sequential  1 103.4 µm²   Total 2 946.0 µm²  (12 307 cells)
Report : power     Dynamic 1.82 mW (Switching 1.05 / Internal 0.77)   Leakage 21.4 µW

마지막으로 합성 결과가 RTL과 논리적으로 같은지 확인한다. 시뮬레이션은 입력 조합을 다 볼 수 없으므로, 등가성 검사(LEC, Logic equivalence checking)가 형식적 방법으로 증명한다. 두 설계의 레지스터를 짝지어(키 포인트 매핑) 각 레지스터 입력의 조합 논리 함수가 같은지를 BDD나 SAT 풀이기로 검사한다. 한 번이라도 다르면 반례 입력을 내놓는다. LEC는 합성 뒤뿐 아니라 스캔 삽입, 클럭 트리, 수동 ECO 뒤에도 매번 돌린다.

LEC가 자주 걸리는 곳

재타이밍(레지스터를 조합 논리 너머로 옮김)은 레지스터 대응이 깨져 순차 등가성 검사가 필요하다. RTL의 x 할당, 초기화되지 않은 레지스터, 합성 지시어(full_case, parallel_case)는 시뮬레이션과 합성 결과가 다르게 해석될 수 있는 대표적인 함정이다.

핵심 정리

  1. 합성 = RTL + Liberty + SDC → 게이트 넷리스트. 해석 → 일반 논리 → 불 최적화 → 기술 매핑 → 사이징·버퍼링.
  2. 최소 SOP는 주항으로 만들고, 필수 주항부터 고른 뒤 나머지는 집합 덮개 문제다. don't care는 묶음을 키우는 데만 쓴다.
  3. 정적 CMOS 한 단은 반전형이다. 풀업망과 풀다운망은 직렬↔병렬 쌍대이며, NAND·NOR·AOI·OAI가 기본 셀이다.
  4. Liberty는 셀마다 면적, 핀 커패시턴스, 슬루 × 부하 지연 표를 준다. EDU45에서 X1 셀 면적은 2~5 CPP × 1260 nm.
  5. 기술 매핑은 NAND2–INV 주체 그래프를 셀 패턴으로 덮는 문제이고, 트리에서는 동적 계획법으로 최소 면적·최소 지연 커버를 정확히 찾는다.
  6. 논리적 노력: \(d = gh+p\), \(F = GBH\), 단 노력이 약 4일 때 최적, \(N \approx \log_4 F\). FO4 = 5τ ≈ 15 ps.
  7. SDC(클럭·입출력 지연·부하)가 합성의 목표이고, 결과는 타이밍·면적·전력 보고서와 LEC로 확인한다.

확인 퀴즈

카르노 맵에서 don't care(X) 칸에 대한 설명으로 옳은 것은?

don't care는 출력이 무엇이든 괜찮은 입력이다. 1처럼 묶어 곱항을 크게(리터럴을 적게) 만들 수 있지만, 덮어야 할 대상은 1인 최소항뿐이다.

정적 CMOS에서 AND2를 만들 때 보통 NAND2 + INV 두 단을 쓰는 이유는?

nMOS는 출력을 0으로, pMOS는 1로만 잘 끌어당긴다. 입력 1 → nMOS 켜짐 → 출력 0이므로 한 단은 항상 반전형이다.

트리 커버링으로 f = (a·b + c)′를 매핑할 때 라이브러리에서 AOI21을 빼면?

NAND2와 INV만 있어도 주체 그래프는 언제나 덮을 수 있다. 다만 4 CPP짜리 셀 하나가 할 일을 셀 여러 개(EDU45에서 9 CPP)가 나눠 한다.

입력 커패시턴스 1 fF의 인버터로 64 fF 부하를 구동한다. 논리적 노력으로 본 최적 단 수와 그때의 최소 지연(기생 p = 1)은?

F = 64, log₄64 = 3. 단 노력 4, D = 3·4 + 3·1 = 15τ ≈ 45 ps. 2단이면 2·8+2 = 18τ, 1단이면 65τ.

set_input_delay 0.3 -clock clk(주기 1.0 ns)가 뜻하는 것은?

입력 지연은 바깥 레지스터의 clk→Q와 바깥 조합 논리가 쓴 시간이다. 블록 안쪽 첫 레지스터까지의 예산이 그만큼 줄어든다.