Chapter 4: Hardware Description Languages | HDL로 하드웨어를 코딩하다

Chapter 4: Hardware Description Languages | HDL로 하드웨어를 코딩하다
Harris & Harris · Digital Design & Computer Architecture

💻 Chapter 4: Hardware Description Languages

코드로 하드웨어를 설계하고 검증하는 HDL의 세계

Chapter 1~3에서 배운 논리 게이트, 조합 논리, 순차 논리를 실제로 구현하려면 어떻게 해야 할까요? 수십억 개의 트랜지스터를 하나씩 그릴 수는 없습니다. Hardware Description Language(HDL)는 텍스트 기반으로 디지털 회로의 구조와 동작을 기술하는 언어로, 현대 반도체 설계의 핵심 도구입니다. 이 포스트에서는 SystemVerilog를 중심으로 조합/순차 논리 모델링, FSM 코딩, 테스트벤치 작성법을 정리하고, 2026년 AI 기반 검증(Agentic AI)과 UVM 트렌드를 함께 다룹니다.

📜 1. HDL의 개요

HDL(Hardware Description Language)은 디지털 회로의 구조와 동작을 텍스트로 묘사하는 프로그래밍 언어입니다. 일반적인 소프트웨어 언어와 달리, HDL은 병렬 실행(Concurrency)이 기본이며, 하드웨어의 물리적 특성(지연, 신호 강도 등)을 표현할 수 있습니다.

🔍 시뮬레이션 (Simulation) 설계한 회로에 가상의 입력을 주고, 출력이 사양서(Specification)대로 동작하는지 사전 검증하는 과정입니다. 실리콘 제조 전에 버그를 찾는 핵심 단계입니다.
⚙️ 논리 합성 (Logic Synthesis) 작성된 HDL 코드를 실제 논리 게이트로 이루어진 네트리스트(Netlist)로 자동 변환하는 과정입니다. Ch.2의 불리언 최소화가 여기서 자동으로 적용됩니다.
HDL 기반 설계 흐름
HDL
코딩
SV / VHDL
시뮬레이션
VCS / Xcelium
논리 합성
DC / Genus
Gate
Netlist
실리콘
/ FPGA

업계 양대 표준은 SystemVerilog(IEEE 1800)와 VHDL(IEEE 1076)입니다. SystemVerilog는 Verilog를 확장하여 객체지향 검증, 어설션, 커버리지 기능을 통합한 언어로, 전 세계 설계/검증 팀의 80% 이상이 사용하고 있습니다. 이 포스트에서는 교과서와 마찬가지로 SystemVerilog 중심으로 설명합니다.

🔗 2. 조합 논리 모델링

Ch.2에서 배운 조합 논리를 HDL로 기술하는 방법입니다. SystemVerilog에서는 assign(연속 할당)always_comb 블록 두 가지 방식을 주로 사용합니다.

📌 assign 연속 할당 (Continuous Assignment)

간단한 논리식을 직접 표현할 때 사용합니다. 좌변의 신호는 우변 입력이 변할 때마다 자동으로 즉시 재계산됩니다.

SystemVerilog — Full Adder (assign 방식) module fulladder ( input logic a, b, cin, output logic s, cout ); logic p, g; // 내부 신호 선언 assign p = a ^ b; // Propagate assign g = a & b; // Generate assign s = p ^ cin; // Sum = P ⊕ Cin assign cout = g | (p & cin); // Cout = G + P·Cin endmodule

📌 always_comb 블록

if-else, case 같은 절차적 구문으로 복잡한 조합 논리(Mux, 디코더 등)를 기술할 때 사용합니다. 합성기가 자동으로 조합 논리로 변환합니다.

SystemVerilog — 4:1 Mux (always_comb + case) module mux4 ( input logic [3:0] d, input logic [1:0] s, output logic y ); always_comb case (s) 2'b00: y = d[0]; 2'b01: y = d[1]; 2'b10: y = d[2]; 2'b11: y = d[3]; default: y = 1'bx; // 안전 장치 endcase endmodule
함정 경고 — 의도치 않은 래치(Latch) 합성

always_comb에서 case나 if-else의 모든 경우의 수에 출력을 정의하지 않으면, 합성기는 “정의되지 않은 경우 이전 값을 유지”하는 것으로 해석하여 원치 않는 래치를 생성합니다. 이는 가장 흔하고 위험한 HDL 코딩 실수입니다. 반드시 default(SystemVerilog) 또는 others(VHDL) 절을 명시하거나, 블록 시작 부분에서 출력을 기본값으로 초기화하세요.

🏗️ 3. 구조적 모델링 (Structural Modeling)

Ch.1에서 배운 계층화(Hierarchy)모듈화(Modularity) 원칙을 HDL에 그대로 적용합니다. 작은 하위 모듈을 설계한 후, 이를 인스턴스화(Instantiation)하여 더 큰 시스템을 조립합니다.

SystemVerilog — 구조적 4-bit Ripple Carry Adder module adder4 ( input logic [3:0] a, b, input logic cin, output logic [3:0] s, output logic cout ); logic [3:0] c; // 내부 캐리 신호 // 4개의 Full Adder 인스턴스를 직렬 연결 fulladder fa0(.a(a[0]), .b(b[0]), .cin(cin), .s(s[0]), .cout(c[0])); fulladder fa1(.a(a[1]), .b(b[1]), .cin(c[0]), .s(s[1]), .cout(c[1])); fulladder fa2(.a(a[2]), .b(b[2]), .cin(c[1]), .s(s[2]), .cout(c[2])); fulladder fa3(.a(a[3]), .b(b[3]), .cin(c[2]), .s(s[3]), .cout(cout)); endmodule

구조적 모델링의 장점은 재사용성가독성입니다. fulladder 모듈을 한 번 설계하면 4비트, 8비트, 32비트 가산기 어디에서든 재사용할 수 있습니다. 실제 산업에서는 수백~수천 개의 IP 블록을 구조적으로 조합하여 SoC를 구성합니다.

🔄 4. 순차 논리 모델링

Ch.3의 플립플롭과 레지스터를 HDL로 기술합니다. 핵심 키워드는 always_ff논블로킹 할당(<=)입니다.

SystemVerilog — 비동기 리셋 D 플립플롭 module flopr ( input logic clk, reset, d, output logic q ); always_ff @(posedge clk, posedge reset) if (reset) q <= 1'b0; // 리셋: 비동기 else q <= d; // 클럭 에지: D 캡처 endmodule
SystemVerilog — Enable 기능 포함 N-bit 레지스터 module flopenr #(parameter WIDTH = 8) ( input logic clk, reset, en, input logic [WIDTH-1:0] d, output logic [WIDTH-1:0] q ); always_ff @(posedge clk, posedge reset) if (reset) q <= '0; // 모든 비트 0으로 리셋 else if (en) q <= d; // Enable일 때만 업데이트 endmodule
핵심 코딩 규칙 always_ff → 논블로킹(<=)  |  always_comb → 블로킹(=)

이 규칙을 혼동하면 시뮬레이션과 합성 결과가 다른 심각한 버그가 발생합니다. 순차 논리에는 반드시 <=(논블로킹), 조합 논리에는 반드시 =(블로킹)을 사용합니다.

🤖 5. FSM의 HDL 구현

Ch.3의 FSM 설계를 HDL로 옮길 때는 코드를 3개 블록으로 명확히 분리하는 이디엄(Idiom)을 따릅니다.

블록 1: 상태 레지스터 always_ff로 현재 상태를 저장. 리셋 포함. 순차 논리.
블록 2: 다음 상태 논리 always_comb + case로 현재 상태와 입력 → 다음 상태 결정. 조합 논리.
블록 3: 출력 논리 assign 또는 always_comb로 출력 결정. Moore는 상태만, Mealy는 상태+입력. 조합 논리.
SystemVerilog — 분기 예측기 FSM (5-State, 교과서 예제) module branch_predictor ( input logic clk, reset, taken, output logic prediction ); typedef enum logic [2:0] { S0, S1, S2, S3, S4 } state_t; state_t state, nextstate; // ① 상태 레지스터 (순차 논리) always_ff @(posedge clk, posedge reset) if (reset) state <= S2; // 중간 상태로 초기화 else state <= nextstate; // ② 다음 상태 논리 (조합 논리) always_comb case (state) S0: nextstate = taken ? S1 : S0; S1: nextstate = taken ? S2 : S0; S2: nextstate = taken ? S3 : S1; S3: nextstate = taken ? S4 : S2; S4: nextstate = taken ? S4 : S3; default: nextstate = S2; endcase // ③ 출력 논리 (Moore: 상태에만 의존) assign prediction = (state == S3) | (state == S4); endmodule

🧪 6. 테스트벤치 (Testbenches)

테스트벤치는 합성되지 않는 시뮬레이션 전용 코드입니다. 설계 모듈(DUT: Design Under Test)에 테스트 입력(Stimulus)을 인가하고, 출력이 기대값과 일치하는지 자동으로 검사합니다.

SystemVerilog — Self-Checking Testbench 기본 구조 module fulladder_tb(); logic a, b, cin, s, cout; logic expected_s, expected_cout; integer errors = 0; // DUT 인스턴스화 fulladder dut(.a(a), .b(b), .cin(cin), .s(s), .cout(cout)); initial begin // 모든 입력 조합 테스트 (3비트 = 8가지) for (int i = 0; i < 8; i++) begin {a, b, cin} = i[2:0]; #10; // 10ns 대기 (전파 지연 고려) {expected_cout, expected_s} = a + b + cin; if ({cout, s} !== {expected_cout, expected_s}) begin $error("FAIL: a=%b b=%b cin=%b → s=%b cout=%b (expected %b%b)", a, b, cin, s, cout, expected_cout, expected_s); errors++; end end if (errors == 0) $display("ALL TESTS PASSED"); else $display("%0d ERRORS found", errors); $finish; end endmodule

좋은 테스트벤치의 핵심은 Self-Checking입니다. 출력을 사람이 일일이 확인하는 대신, 기대값과 자동 비교하여 PASS/FAIL을 판정합니다. 이는 대규모 설계에서 수천~수백만 개의 테스트 벡터를 자동 실행하는 기반이 됩니다.

📏 7. HDL 코딩 베스트 프랙티스 요약

규칙 올바른 예 위반 시 문제
조합: always_comb + = always_comb y = a & b; 시뮬-합성 불일치
순차: always_ff + <= always_ff q <= d; 레이스 컨디션
case에 default 필수 default: y = 1'b0; 의도치 않은 래치
named port mapping .clk(clk), .d(data) 포트 순서 혼동 버그
parameter로 폭 일반화 #(parameter W=8) 재사용성 저하
리셋 조건 첫 번째에 배치 if(reset) ... else ... 합성 오류 가능

🚀 8. 2026년 산업 동향: AI가 바꾸는 검증의 미래

교과서에서 배운 테스트벤치는 가장 기본적인 형태입니다. 현대 산업에서는 UVM(Universal Verification Methodology)이라는 표준화된 프레임워크 위에 구축된 대규모 검증 환경을 사용하며, 2026년에는 여기에 AI/에이전틱 기술이 급속히 융합되고 있습니다.

2026 UPDATE
🤖 Agentic AI의 검증 혁신

DVCon 2026에서 가장 뜨거웠던 주제는 “에이전틱 AI(Agentic AI)”의 검증 적용이었습니다. AI 에이전트가 UVM 테스트벤치를 자동 생성하고, 커버리지 클로저를 가속하며, 디버그 시간을 단축하는 사례가 발표되었습니다.

Cadence Agentic Verification: 다중 AI 에이전트 시스템이 제품 사양서와 RTL에서 “설계 의도 모델”을 자동 추출하여, UVM 테스트벤치, SystemVerilog 어설션(SVA), 검증 플랜을 자동 생성합니다.
Synopsys AgentEngineer: DAC 2025에서 첫 프로토타입이 공개되었으며, Microsoft와 협업하여 에이전틱 AI로 칩 설계 전반의 자율 워크플로우를 구현하고 있습니다. RTL 생성부터 테스트벤치 작성까지 AI가 보조합니다.
Siemens Questa Property Assist: LLM 기반으로 자연어 프롬프트에서 SystemVerilog Assertions(SVA)를 자동 생성합니다. 설계 의도를 자연어로 기술하면 검증 코드로 변환됩니다.

다만 이러한 AI 도구들은 여전히 SystemVerilog와 UVM 인프라 위에서 동작합니다. 교과서에서 배우는 HDL 기초 지식이 여전히 필수적인 이유입니다.

📊 검증의 비중과 중요성

칩 개발에서 검증(Verification)은 전체 프로젝트 시간의 약 60~70%를 차지하며, 검증 엔지니어 수가 설계 엔지니어의 2~3배에 달합니다. 특히 기능 검증(Functional Verification)이 가장 시간 집약적인 단계로, 전체 개발 시간의 약 40%를 소비합니다. 이것이 AI 기반 검증 자동화가 업계의 최대 관심사인 이유입니다.

교과서 개념 산업계 발전형 2026 도구
Self-checking TB UVM Scoreboard + Constrained Random Synopsys VCS, Cadence Xcelium, Siemens Questa
테스트 벡터 수동 작성 Coverage-driven random generation UVM Sequence + AI 테스트 생성
assign/always_comb 검증 SVA(SystemVerilog Assertions) + Formal Cadence JasperGold, Synopsys VC Formal
모듈 단위 테스트 IP → Subsystem → Full-chip 계층적 검증 Protocol VIP (AXI, PCIe, DDR, USB)
SystemVerilog의 위상 (2026)

SystemVerilog(IEEE 1800)는 2026년 현재에도 전 세계 설계/검증 팀의 80% 이상이 사용하는 산업 표준입니다. VHDL은 유럽과 항공우주/방산 분야에서 여전히 사용되지만, SystemVerilog + UVM 조합이 SoC 검증의 사실상 표준(de facto standard)으로 확고히 자리잡고 있습니다. 3대 EDA 벤더(Synopsys, Cadence, Siemens) 모두 SystemVerilog/UVM을 핵심 플랫폼으로 지원합니다.

📋 핵심 요약

주제 핵심 포인트 SystemVerilog 키워드
HDL 개요 시뮬레이션 + 논리 합성. 병렬 실행 기본 module / endmodule
조합 논리 assign(연속 할당) 또는 always_comb + case assign, always_comb
구조적 모델링 모듈 인스턴스화로 계층적 설계. IP 재사용 .port(signal) named mapping
순차 논리 always_ff @(posedge clk) + 논블로킹 <= always_ff, <=
FSM 코딩 3블록 분리: 상태 레지스터 + 다음 상태 + 출력 typedef enum, case
테스트벤치 합성 불가. Self-checking. initial 블록 $error, $display, $finish
2026 트렌드 UVM + Agentic AI, SVA 자동 생성, Coverage AI VCS, Xcelium, Questa

댓글

이 블로그의 인기 게시물

📚 SDC 마스터 클래스 시리즈 | Chapter 1

📚 SDC 마스터 클래스 시리즈 | Chapter 2

📚 SDC 마스터 클래스 시리즈 | Chapter 3