반도체 및 집적회로 설계
반도체 및 집적회로 설계 — 1단계: 소자 물리부터 RTL까지
배경지식: 세상을 움직이는 '전자'의 실체
지금 네가 보고 있는 스마트폰, 노트북, 심지어 학교 에어컨 리모컨까지 — 이 모든 것 안에는 손톱 크기의 실리콘 조각이 들어 있고, 그 위에는 수십억 개의 트랜지스터가 촘촘하게 새겨져 있다. 그런데 정작 "트랜지스터가 뭔가요?"라고 물으면 대부분의 사람들이 말문이 막힌다. 이 단계는 그 물음에 대한 답을 만드는 과정이다. 먼저 트랜지스터가 존재할 수 있는 토대, 즉 물질의 가장 근본적인 성질부터 이야기를 시작하자.
모든 물질은 원자(atom)로 이루어져 있다. 원자는 양성자와 중성자로 구성된 **핵(nucleus)**과 그 주위를 도는 **전자(electron)**로 이루어지는데, 이 전자가 반도체 이야기의 진짜 주인공이다. 초등학교 과학 시간에 원자를 태양계처럼 그려본 기억이 있을 것이다. 태양이 핵이고 행성들이 전자인 그림 말이다. 물론 이건 시각화를 위한 단순화일 뿐이고, 실제 전자는 확률적 구름(전자 궤도함수) 형태로 존재하지만, 지금 단계에서는 '전자가 핵 주위의 특정 에너지 레벨에서 운동한다'는 직관을 붙잡는 것이 더 중요하다.
여기서 핵심 개념이 등장한다. 바로 에너지 밴드(energy band) 이론이다. 원자 하나만 있을 때는 전자가 가질 수 있는 에너지가 불연속적인 선(에너지 레벨)들로 존재한다. 그런데 수십억 개의 원자들이 결정(crystal) 구조를 형성해 촘촘히 붙으면, 이 불연속적인 선들이 서로 겹치고 퍼지면서 넓은 '띠(band)'를 이룬다. 이 띠들 중 가장 중요한 두 가지는 가전자대(valence band) 와 전도대(conduction band) 다. 가전자대는 전자들이 원자에 구속되어 채워져 있는 에너지 띠이고, 전도대는 전자가 원자의 구속을 벗어나 자유롭게 돌아다닐 수 있는 띠다. 이 두 띠 사이의 간격을 금지대(bandgap, E_g) 라고 하며, 이 간격의 크기가 물질이 도체인지, 절연체인지, 혹은 반도체인지를 결정한다.
[노트 기록] 아래 세 물질의 밴드 구조를 각각 그려보아라. 가전자대, 전도대, 금지대를 표시하고, 왜 구리(도체)는 항상 전류가 흐르고 유리(절연체)는 흐르지 않는지 에너지 밴드 관점에서 설명을 곁들여라.
- 도체(conductor): Cu(구리) — 금지대 없음, 가전자대와 전도대가 겹침
- 절연체(insulator): SiO₂(이산화규소) — 금지대 약 9 eV
- 반도체(semiconductor): Si(실리콘) — 금지대 약 1.12 eV
반도체는 도체도 절연체도 아닌, 그 중간 어딘가에 존재하는 물질이다. 순수한 실리콘(진성 반도체, intrinsic semiconductor)의 금지대는 약 1.12 eV로, 상온(약 300K)에서 열에너지만으로도 일부 전자가 가전자대에서 전도대로 뛰어오를 수 있다. 전자가 가전자대를 떠나면 그 자리에 빈자리가 생기는데, 이 빈자리를 정공(hole) 이라고 부른다. 정공은 마치 (+) 전하를 가진 입자처럼 행동하며, 전자가 반대 방향으로 움직이듯이 전류에 기여한다. 이제 반도체에는 두 종류의 전하 운반체가 존재한다: 전자(-1.6×10⁻¹⁹ C)와 정공(+1.6×10⁻¹⁹ C).
순수 실리콘만으로는 전류가 너무 작아서 소자로 쓰기가 어렵다. 이 문제를 해결하는 것이 도핑(doping) 이다. 도핑이란 실리콘 결정에 아주 소량의 불순물 원자를 의도적으로 집어넣는 공정을 말한다. 실리콘(Si)은 최외각 전자가 4개인데, 여기에 최외각 전자가 5개인 인(P, phosphorus)이나 비소(As, arsenic) 를 집어넣으면 결합 후에 전자 1개가 남아돌아 자유 전자가 풍부한 N형(n-type) 반도체가 된다. 반대로 최외각 전자가 3개인 붕소(B, boron) 를 넣으면 전자 1개가 부족해 정공이 풍부한 P형(p-type) 반도체가 된다. N형의 'N'은 Negative(음전하 운반체 다수), P형의 'P'는 Positive(양전하 운반체 다수)를 의미한다. 이 두 가지 반도체 블록이 만나는 순간, 비로소 반도체 소자의 역사가 시작된다.
본 내용 I: PN 접합 다이오드 — 단방향 밸브의 탄생
N형 반도체와 P형 반도체를 물리적으로 붙여 놓으면 PN 접합(PN junction) 이 형성된다. 접합이 이루어진 직후, 농도 차이에 의한 확산(diffusion)이 일어난다. N형 쪽의 자유 전자들은 P형 쪽으로 이동하고, P형 쪽의 정공들은 N형 쪽으로 이동한다. 이렇게 전하들이 이동하면서 접합 근처에서 전자와 정공이 결합(재결합, recombination)하여 사라지고, 그 결과 이동 전하가 거의 없는 공핍층(depletion region) 이 형성된다. 이 공핍층에는 이온화된 도핑 원자들만 남아, N형 쪽에는 양이온, P형 쪽에는 음이온이 자리 잡아 내부 전기장(빌트인 전위, built-in voltage V_bi, 실리콘에서 약 0.6~0.7V)을 만든다. 이 전기장이 더 이상의 확산을 막는 평형 상태를 이룬다.
이제 외부에서 전압을 인가해보자. 순방향 바이어스(forward bias): P형에 (+), N형에 (−)를 연결하면, 외부 전기장이 빌트인 전위와 반대 방향으로 작용해 공핍층이 좁아진다. 빌트인 전위를 극복할 만큼의 전압(실리콘의 경우 약 0.6~0.7V, 이 값을 순방향 전압강하, V_f 라고 부른다)이 걸리면 전류가 지수적으로 증가한다. 역방향 바이어스(reverse bias): 반대로 N형에 (+), P형에 (−)를 연결하면 공핍층이 넓어지고 전류는 거의 흐르지 않는다. 다이오드는 이처럼 전류를 한 방향으로만 통과시키는 정류 소자(rectifier) 로 동작한다.
[노트 기록] 다이오드의 전류-전압 관계를 기술하는 쇼클리 다이오드 방정식(Shockley diode equation) 을 손으로 적어라:
여기서 각 항을 풀어보면: I_S는 역포화전류(reverse saturation current, 극히 작은 값, 10⁻¹² A 수준), V는 다이오드에 인가된 전압, n은 이상 계수(ideality factor, 보통 12), V_T는 열전압(thermal voltage) = kT/q ≈ 26 mV (상온 300K 기준)다. k는 볼츠만 상수(1.38×10⁻²³ J/K), T는 절대온도(K), q는 전자 전하량이다. 이 방정식이 주는 핵심 메시지는, 순방향 전압이 조금만 증가해도 전류가 지수적(exponential) 으로 폭발적 증가한다는 것이다. 역방향에서는 지수 항이 거의 0이 되어 I ≈ −I_S, 즉 극히 작은 누설전류만 흐른다.
본 내용 II: 트랜지스터 — 전류를 제어하는 스위치이자 증폭기
다이오드가 '단방향 밸브'라면, 트랜지스터(transistor) 는 '전기로 제어하는 수도꼭지'다. 작은 신호로 큰 전류의 흐름을 정밀하게 제어할 수 있다는 점에서 20세기 최고의 발명품으로 불린다. 트랜지스터에는 크게 두 종류가 있다: BJT(Bipolar Junction Transistor) 와 MOSFET(Metal-Oxide-Semiconductor Field-Effect Transistor). 현대 디지털 집적회로는 거의 전적으로 MOSFET, 특히 CMOS(Complementary MOS) 기술에 의존하므로, BJT는 개념만 짚고 MOSFET에 집중한다.
BJT는 두 개의 PN 접합을 역방향으로 붙여 NPN 또는 PNP 구조를 만든다. 베이스(Base) 단자에 작은 전류를 흘리면 컬렉터-에미터(Collector-Emitter) 사이에 그보다 훨씬 큰 전류가 흐른다. 이 전류 증폭 비율을 β (전류 이득) 이라 하며, 전형적으로 100~300 정도다. BJT의 제어는 '전류'로 이루어진다는 점이 MOSFET과의 결정적 차이다.
MOSFET은 '전기장(field)'으로 동작을 제어한다. 구조를 이해해 보자. P형 실리콘 기판 위에 N형으로 도핑된 두 영역, 소스(Source, S) 와 드레인(Drain, D) 이 있고, 그 사이 표면 위에 얇은 산화막(SiO₂, gate oxide) 이 있으며 그 위에 게이트(Gate, G) 전극이 놓인다. 소스와 드레인 사이에는 P형 기판이 있어 전류가 흐를 수 없는 상태다 — 마치 두 개의 역방향 다이오드가 등을 맞대고 있는 것과 같다. 이것이 앞서 배운 PN 접합의 직접적인 응용이다.
게이트에 전압(V_GS, 게이트-소스 전압)을 인가하면 어떻게 될까? 게이트 금속-산화막-반도체는 마치 커패시터(capacitor, 전기를 저장하는 소자) 처럼 작동해, 게이트 아래 P형 반도체 표면에 전기장을 유도한다. V_GS가 특정 임계값인 임계전압(threshold voltage, V_th, 전형적으로 0.3~0.7V) 을 넘으면, 표면의 P형 영역이 N형으로 역전(반전층, inversion layer 형성)되면서 소스에서 드레인까지 연결되는 채널(channel) 이 생긴다. 이 순간부터 소스-드레인 사이에 전류가 흐를 수 있다. 이것이 NMOS(N-channel MOSFET) 의 기본 동작이다.
[노트 기록] NMOS의 세 가지 동작 영역을 정의하고, 각 조건에서 드레인 전류 I_D 수식을 정리하라:
차단(Cutoff) 영역: V_GS < V_th 이면, 채널이 형성되지 않아 I_D ≈ 0. 트랜지스터는 '꺼진(OFF)' 상태.
선형(Linear / Triode) 영역: V_GS > V_th이고 V_DS < (V_GS − V_th)이면, 채널 전체가 형성되어 저항처럼 동작한다:
포화(Saturation) 영역: V_GS > V_th이고 V_DS ≥ (V_GS − V_th)이면, 드레인 쪽 채널이 핀치오프(pinch-off)되어 전류가 포화된다:
여기서 μ_n은 전자 이동도, C_ox는 게이트 산화막 단위 면적당 커패시턴스, W/L은 트랜지스터의 너비/길이 비(aspect ratio)다. W/L이 클수록 전류가 더 잘 흐른다 — 수도관이 굵을수록 물이 많이 흐르는 것과 같다. 이것은 나중에 CMOS 게이트 설계에서 트랜지스터 크기를 결정할 때 핵심 파라미터가 된다.
PMOS는 NMOS의 보완(complementary) 소자다. N형 기판 위에 P형 소스/드레인이 있고, V_GS가 충분히 음수(V_GS < V_tp, 음의 임계전압)일 때 켜진다. PMOS에서는 정공(hole)이 전하 운반체이므로 NMOS보다 이동도가 낮아 같은 전류를 흘리려면 약 2~3배 넓은 W/L이 필요하다.
본 내용 III: CMOS 인버터 — 디지털 회로의 알파이자 오메가
CMOS는 NMOS와 PMOS를 짝지어 사용하는 기술이다. 인버터(inverter, NOT 게이트) 는 CMOS 회로에서 가장 단순하면서도 가장 중요한 회로다. 구조는 간단하다: PMOS가 전원(VDD)과 출력 사이에, NMOS가 출력과 접지(GND, VSS) 사이에 직렬로 연결되고, 두 트랜지스터의 게이트는 공통 입력 노드에 연결된다.
입력(V_in)이 '0'(논리 LOW, 접지 전압 0V)일 때를 생각해 보자. NMOS의 V_GS = 0 < V_thn 이므로 NMOS는 꺼진다. PMOS의 V_GS = 0 − VDD = −VDD < V_thp(음수)이므로 PMOS는 켜진다. 켜진 PMOS가 출력을 VDD로 끌어올리므로 출력은 논리 HIGH('1')이다. 입력이 '1'(VDD)일 때는 반대로 NMOS가 켜지고 PMOS가 꺼져 출력이 GND, 즉 '0'이 된다. 입력의 논리가 뒤집혀서 출력된다 — 이것이 NOT(인버터) 연산이다.
CMOS의 탁월함은 정적 전력 소모(static power dissipation)가 거의 0 이라는 점에 있다. 입력이 안정 상태일 때, NMOS와 PMOS 중 하나는 반드시 꺼져 있어 VDD에서 GND로 흐르는 직류 경로가 차단된다. 전력은 오직 스위칭이 일어나는 순간, 출력 노드의 부하 커패시턴스(C_L)를 충·방전할 때만 소모된다. 이 동적 전력(dynamic power) 은 P = αC_LV_DD²f 로 표현된다(α: 스위칭 활동도, f: 클럭 주파수). 이것이 2단계에서 배울 저전력 설계의 출발점이다.
[노트 기록] CMOS로 NAND 게이트와 NOR 게이트를 설계하는 원리를 스스로 유도해보아라. NAND의 출력은 "AB가 동시에 1일 때만 0"이다. 따라서 출력을 GND로 끌어내릴 풀다운 네트워크(pull-down network)는 NMOS 두 개를 직렬 연결해야 한다(A도 1이고 B도 1일 때만 경로가 생긴다). 그렇다면 풀업 네트워크(pull-up network)의 PMOS는 어떻게 연결해야 할까? — 이건 직접 생각해 볼 것. 답은 아래 Verilog 파트에서 논리적으로 검증하게 된다.
본 내용 IV: Verilog와 RTL 설계 — 회로를 코드로 쓰다
물리적 소자를 이해했으니, 이제 수십억 개의 트랜지스터를 직접 하나하나 배선할 수는 없다는 현실적 문제에 부딪힌다. 이 문제를 해결하는 것이 하드웨어 기술 언어(Hardware Description Language, HDL) 다. 대표적으로 Verilog 와 VHDL 이 있다. Verilog는 C 언어와 문법이 비슷해 접근하기 쉽고 산업계에서 폭넓게 쓰인다. VHDL은 더 엄격한 타입 시스템과 Ada 언어를 닮은 문법을 가지며, 국방·항공 분야에서 선호된다. 이 단계에서는 Verilog 를 중심으로 배운다.
중요한 오해를 먼저 짚자. Verilog는 '프로그래밍 언어'가 아니다. Python 코드를 작성하면 CPU가 그것을 순차적으로 실행하지만, Verilog 코드를 작성하면 논리 합성(logic synthesis) 도구가 이를 물리적인 하드웨어(게이트들의 연결망)로 변환한다. 즉, Verilog는 하드웨어의 동작을 서술(describe)하는 언어이며, 코드가 실행되는 것이 아니라 회로가 '구현(instantiate)'된다. 이 패러다임의 차이를 철저히 이해하지 않으면 HDL 설계에서 수많은 함정에 빠진다.
RTL(Register Transfer Level) 이란 무엇인가? 이는 디지털 회로를 서술하는 추상화 수준을 뜻한다. RTL 레벨에서는 레지스터(flip-flop, 데이터를 한 클럭 사이클 동안 저장하는 소자)와 레지스터 사이에서 데이터가 어떻게 이동하고 변환되는지를 기술한다. 트랜지스터 레벨(실제 MOSFET)이나 게이트 레벨(AND, OR, NOT 조합)보다 높은 추상화 수준이며, 설계자는 이 레벨에서 대부분의 기능 설계를 수행한다. 합성 도구가 RTL 코드를 게이트 레벨 넷리스트(netlist)로 자동 변환해 주기 때문이다.
[노트 기록] Verilog의 핵심 문법 요소를 다음 예제와 함께 정리하라:
// 모듈(module): 회로의 기본 단위. 클래스보다 블랙박스에 가깝다.
module half_adder (
input wire a, // 1비트 입력
input wire b,
output wire sum, // 합
output wire carry // 올림수
);
// assign: 조합 논리(combinational logic)를 서술. 항상 활성화된 연결
assign sum = a ^ b; // XOR
assign carry = a & b; // AND
endmodule
wire 는 게이트들 사이의 '전선'처럼, 항상 연결된 신호다. reg 는 always 블록 안에서 값을 저장하는 신호로 선언한다(물리적으로 반드시 플립플랍을 의미하진 않지만, 클럭에 동기화된 always @(posedge clk) 안에서 사용되면 실제 레지스터로 합성된다). 조합 논리는 assign 또는 always @(*) 블록으로, 순차 논리(sequential logic)는 always @(posedge clk) 블록으로 서술한다. 이 구분은 RTL 설계에서 가장 중요한 원칙 중 하나다.
// D 플립플랍(D Flip-Flop): 클럭 상승 엣지마다 입력 d를 캡처
module dff (
input wire clk,
input wire reset, // 비동기 리셋
input wire d,
output reg q
);
always @(posedge clk or posedge reset) begin
if (reset)
q <= 1'b0; // 비블로킹 할당(<=): 순차 회로에서 필수
else
q <= d;
end
endmodule
블로킹 할당(=)과 비블로킹 할당(<=)의 차이는 Verilog 초보자가 가장 많이 틀리는 부분이다. <=(비블로킹)은 always @(posedge clk) 블록 안에서만 사용해야 하며, 블록 내 모든 할당이 동시에 일어나는 것처럼 처리된다. =(블로킹)은 C언어의 대입문처럼 순서대로 실행되므로 조합 논리 블록에 사용한다. 이 규칙을 어기면 합성 결과가 시뮬레이션과 달라지는 끔찍한 디버깅 지옥에 빠진다.
앞서 설계한 CMOS NAND 게이트를 Verilog로 표현하면 단 한 줄이다: assign out = ~(a & b);. 물리 소자 레벨에서는 4개의 트랜지스터(NMOS 2 직렬, PMOS 2 병렬)가 필요했던 것을, RTL에서는 논리 연산 한 줄로 서술한다. 합성 도구가 이 추상적 서술을 타겟 공정 라이브러리의 실제 게이트 셀로 매핑한다. 이것이 추상화의 힘이다.
프로젝트: 4비트 ALU 설계 및 시뮬레이션
지금까지 배운 것들을 종합하는 실전 프로젝트다. ALU(Arithmetic Logic Unit, 산술논리연산장치) 는 CPU의 연산 핵심이다. 덧셈, 뺄셈, AND, OR, NOT 같은 기본 연산을 수행하는 회로로, 앞서 만든 반가산기(half adder), 전가산기(full adder), 논리 게이트들이 모두 여기에 사용된다. 다음 문제들은 정답 없이 제공된다. 스스로 설계하고, 왜 그렇게 설계했는지 이유를 설명할 수 있어야 진짜 이해한 것이다. 시뮬레이션 도구는 EDA Playground(edaplayground.com, 웹 기반 무료)나 ModelSim을 사용하라.
문제 1 — 전가산기(Full Adder) RTL 구현 (예상 소요: 10분)
반가산기는 두 비트를 더할 수 있지만, 실제 덧셈에는 이전 자리에서 올라온 올림수(carry-in)까지 처리해야 한다. 입력이 a, b, cin(carry-in) 세 개이고 출력이 sum과 cout(carry-out)인 전가산기(full adder) 를 Verilog로 작성하라. 단, assign 문만 사용하며(always 블록 사용 금지), 진리표(truth table)를 직접 그려서 불 대수 표현식을 유도한 다음 코드로 옮겨라. 진리표를 먼저 그리지 않고 코드를 작성하는 것은 허용하지 않는다. 작성 후, EDA Playground에서 testbench를 직접 만들어 8가지 입력 조합 모두를 검증하라.
문제 2 — 리플 캐리 가산기(Ripple Carry Adder) 계층 설계 (예상 소요: 10분)
문제 1에서 만든 full adder 모듈을 4개 인스턴스화(instantiate) 해서 4비트 리플 캐리 가산기(4-bit Ripple Carry Adder, RCA)를 만들어라. 인스턴스화란 이미 정의된 모듈을 다른 모듈 안에서 부품처럼 사용하는 것을 말한다(C++의 클래스 객체 생성과 비슷한 개념이지만, 동시에 여러 인스턴스가 병렬로 동작한다는 것을 잊지 말 것). 각 비트의 carry-out이 다음 비트의 carry-in으로 연결되어야 한다. 4+5=9(2진수: 0100+0101=1001), 7+9=16(올림수 발생) 케이스를 포함한 최소 6가지 케이스를 testbench로 검증하라. '리플 캐리'라는 이름이 왜 붙었는지, carry 신호가 어떻게 전파되는지를 타이밍 시뮬레이션 파형으로 확인하고, 비트 수가 늘어날수록 지연(propagation delay)이 어떻게 증가할지 논리적으로 예측해보아라.
문제 3 — ALU 연산 선택 회로 설계 (예상 소요: 12분)
4비트 ALU를 설계하라. 입력은 a[3:0], b[3:0], alu_op[2:0](연산 선택 신호)이고 출력은 result[4:0](오버플로를 고려해 5비트)와 zero 플래그(result가 0이면 1, 아니면 0)다. alu_op 3비트로 아래 8가지 연산을 선택할 수 있어야 한다:
3'b000: 덧셈 (a + b)3'b001: 뺄셈 (a − b, 2의 보수 사용)3'b010: 비트 AND (a & b)3'b011: 비트 OR (a | b)3'b100: 비트 XOR (a ^ b)3'b101: 비트 NOT (~a, b 무시)3'b110: 왼쪽 시프트 1비트 (a << 1)3'b111: 오른쪽 시프트 1비트 (a >> 1)
뺄셈 구현 시 별도의 빼기 연산자 -를 쓰는 것은 허용하지 않는다. 2의 보수 원리(a − b = a + (~b) + 1)를 사용해 문제 2의 가산기를 재활용하는 방식으로 구현하라. Verilog의 case 문을 활용하라. 뺄셈 결과가 음수(언더플로)가 되는 케이스도 testbench에 포함하고, 그 경우 result에 어떤 값이 나타나는지 분석하라.
문제 4 — 종합 분석 질문 (예상 소요: 8분)
다음 질문들에 대해 코드를 작성하는 대신, 논리적인 서술로 답하라. 단답은 허용하지 않으며, 이 단계에서 배운 개념들을 연결해서 설명해야 한다.
(1) 리플 캐리 가산기(RCA)의 가장 큰 단점은 무엇인가? 4비트에서 16비트로 확장하면 지연이 어떻게 변하는가? 이 문제를 해결하는 다른 가산기 구조의 이름을 하나 검색해보고, 그것이 RCA보다 빠른 이유를 직관적으로 설명하라.
(2) 문제 3에서 alu_op = 3'b000과 alu_op = 3'b001을 처리하기 위해 같은 가산기 모듈을 재사용했다면, 이것이 case 문 안에서 가산기를 두 번 인스턴스화하는 것과 비교해서 하드웨어적으로 어떤 차이를 만드는가? (힌트: Verilog는 항상 모든 하드웨어가 동시에 존재하며 동작한다는 점을 생각하라.)
(3) CMOS 인버터 파트에서 PMOS의 W/L을 NMOS보다 2배 크게 설계해야 한다고 했다. 만약 PMOS와 NMOS의 W/L을 동일하게 설계하면 인버터의 스위칭 임계전압(switching threshold, V_m) 이 VDD/2에서 벗어난다. 어느 방향으로 벗어나는지, 그리고 이것이 논리 '0'과 '1'의 노이즈 마진(noise margin)에 어떤 영향을 미치는지 설명하라.
위 네 문제를 모두 풀고 나면 1단계의 세 가지 학습 목표 — ①반도체 소자의 전기적 특성 이해, ②트랜지스터로 논리 회로 구성, ③HDL로 디지털 회로 설계 — 가 유기적으로 연결되었을 것이다. 반도체 물리(에너지 밴드, PN 접합, MOSFET I-V)가 CMOS 논리 게이트의 동작 원리를 설명하고, 그 논리 게이트들이 모여 Verilog로 기술된 ALU를 구성하는 전체 흐름이 하나의 연속된 이야기임을 느꼈다면, 이미 2단계(MOSFET 소신호 모델, FSM 설계, 파이프라인 CPU)를 배울 준비가 된 것이다.