Chapter 4: Hardware Description Languages | HDL로 하드웨어를 코딩하다
💻 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)이 기본이며, 하드웨어의 물리적 특성(지연, 신호 강도 등)을 표현할 수 있습니다.
코딩
SV / VHDL
VCS / Xcelium
DC / Genus
Netlist
/ FPGA
업계 양대 표준은 SystemVerilog(IEEE 1800)와 VHDL(IEEE 1076)입니다. SystemVerilog는 Verilog를 확장하여 객체지향 검증, 어설션, 커버리지 기능을 통합한 언어로, 전 세계 설계/검증 팀의 80% 이상이 사용하고 있습니다. 이 포스트에서는 교과서와 마찬가지로 SystemVerilog 중심으로 설명합니다.
🔗 2. 조합 논리 모델링
Ch.2에서 배운 조합 논리를 HDL로 기술하는 방법입니다. SystemVerilog에서는 assign(연속 할당)과 always_comb 블록 두 가지 방식을 주로 사용합니다.
📌 assign 연속 할당 (Continuous Assignment)
간단한 논리식을 직접 표현할 때 사용합니다. 좌변의 신호는 우변 입력이 변할 때마다 자동으로 즉시 재계산됩니다.
📌 always_comb 블록
if-else, case 같은 절차적 구문으로 복잡한 조합 논리(Mux, 디코더 등)를 기술할 때 사용합니다. 합성기가 자동으로 조합 논리로 변환합니다.
always_comb에서 case나 if-else의 모든 경우의 수에 출력을 정의하지 않으면, 합성기는 “정의되지 않은 경우 이전 값을 유지”하는 것으로 해석하여 원치 않는 래치를 생성합니다. 이는 가장 흔하고 위험한 HDL 코딩 실수입니다. 반드시 default(SystemVerilog) 또는 others(VHDL) 절을 명시하거나, 블록 시작 부분에서 출력을 기본값으로 초기화하세요.
🏗️ 3. 구조적 모델링 (Structural Modeling)
Ch.1에서 배운 계층화(Hierarchy)와 모듈화(Modularity) 원칙을 HDL에 그대로 적용합니다. 작은 하위 모듈을 설계한 후, 이를 인스턴스화(Instantiation)하여 더 큰 시스템을 조립합니다.
구조적 모델링의 장점은 재사용성과 가독성입니다. fulladder 모듈을 한 번 설계하면 4비트, 8비트, 32비트 가산기 어디에서든 재사용할 수 있습니다. 실제 산업에서는 수백~수천 개의 IP 블록을 구조적으로 조합하여 SoC를 구성합니다.
🔄 4. 순차 논리 모델링
Ch.3의 플립플롭과 레지스터를 HDL로 기술합니다. 핵심 키워드는 always_ff와 논블로킹 할당(<=)입니다.
이 규칙을 혼동하면 시뮬레이션과 합성 결과가 다른 심각한 버그가 발생합니다. 순차 논리에는 반드시 <=(논블로킹), 조합 논리에는 반드시 =(블로킹)을 사용합니다.
🤖 5. FSM의 HDL 구현
Ch.3의 FSM 설계를 HDL로 옮길 때는 코드를 3개 블록으로 명확히 분리하는 이디엄(Idiom)을 따릅니다.
🧪 6. 테스트벤치 (Testbenches)
테스트벤치는 합성되지 않는 시뮬레이션 전용 코드입니다. 설계 모듈(DUT: Design Under Test)에 테스트 입력(Stimulus)을 인가하고, 출력이 기대값과 일치하는지 자동으로 검사합니다.
좋은 테스트벤치의 핵심은 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/에이전틱 기술이 급속히 융합되고 있습니다.
DVCon 2026에서 가장 뜨거웠던 주제는 “에이전틱 AI(Agentic AI)”의 검증 적용이었습니다. AI 에이전트가 UVM 테스트벤치를 자동 생성하고, 커버리지 클로저를 가속하며, 디버그 시간을 단축하는 사례가 발표되었습니다.
다만 이러한 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(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 |
댓글
댓글 쓰기