VUnit 101: 자동화된 VHDL 검증을 위한 실용 가이드
VUnit은 Python 테스트 스위트 러너와 전용 VHDL 라이브러리를 결합한 선도적인 오픈소스 VHDL 검증 프레임워크입니다. 함께 테스트벤치 컴파일, 실행, 결과 리포팅을 자동화해 엔지니어가 테스트 주도 개발 주기를 따르게 합니다.
이 튜토리얼에서 VHDLwhiz 저자 Ahmadmunthar Zaklouta가 설치·설정부터 테스트벤치 생성, 테스트 케이스 작성, ModelSim 실행까지 VUnit 전체 워크플로를 안내합니다. 즉시 실행 가능한 예제 프로젝트 다운로드 가능.
개요
사이드바나 모바일 내비게이션 버튼으로 섹션 간 이동. 튜토리얼에 시각 참조용 스크린샷 포함.
요구사항
- Intel ModelSim – 여기 설명대로 무료 설치. 시스템
PATH 추가.
- Python 3.6+ – 다운로드 후
PATH 추가.
- Git (선택) – 다운로드.
- Windows Terminal (선택) – 다운로드.
기본 VHDL과 ModelSim 숙련도 가정.
VUnit 설치
서브모듈 포함 저장소 클론:
git clone --recurse-submodules https://github.com/VUnit/vunit.git
또는 ZIP 다운로드 후 C:\vunit 압축 해제, 다음으로 설치:
cd C:\vunit
python setup.py install
환경 변수 설정:
VUNIT_MODELSIM_PATH – ModelSim 실행 파일 경로
VUNIT_SIMULATOR – Modelsim로 설정
예제 스크린샷:

예제 프로젝트 다운로드
C:\vunit_tutorial에 압축 해제 후 포함된 스크립트 실행.
VUnit 소개
VUnit은 HDL 검증을 단순화합니다:
- 테스트 자동화, 구성, 관리를 위한 Python 라이브러리
- 재사용 가능 검증 컴포넌트 포함 VHDL 라이브러리
VHDL 측면에 6개 라이브러리 포함, 이 튜토리얼은 logging과 check 라이브러리 중심.

테스트 대상 설계 (DUT)
예제 DUT motor_start는 모터 시동 시퀀스를 나타내는 3개 LED(RED, YELLOW, GREEN) 구동. 인터페이스는 레코드 타입으로 입출력 사용.

시동 프로세스 3단계:
- 구성 로드 (RED LED)
- 캘리브레이션 (YELLOW LED)
- 회전 (GREEN LED)
시동 시퀀스
- RED LED – 5회 점멸 후 점등 유지
- YELLOW LED – 스위치 2 후 10사이클 점등, RED와 함께 소등
- GREEN LED – 스위치 3 활성 동안 점등
테스트벤치 개발
- Python
run.py 스크립트 구성
- VUnit 스켈레톤 구축
- DUT 인스턴스화 및 신호 구동
Python 실행 스크립트
run.py 스크립트는 경로 정의, VUnit 인스턴스 생성, 설계 및 테스트벤치 라이브러리 추가:
# ROOT directory
ROOT = Path(__file__).resolve().parent
# Source paths
DUT_PATH = ROOT / "design"
TEST_PATH = ROOT / "testbench"
# VUnit instance
VU = VUnit.from_argv()
VU.enable_location_preprocessing()
# Libraries
design_lib = VU.add_library("design_lib")
design_lib.add_source_files([DUT_PATH / "*.vhdl"])
tb_lib = VU.add_library("tb_lib")
tb_lib.add_source_files([TEST_PATH / "*.vhdl"])
VUnit 스켈레톤
테스트벤치 엔티티에 VUnit 컨텍스트와 필수 제네릭 추가:
LIBRARY VUNIT_LIB; CONTEXT VUNIT_LIB.VUNIT_CONTEXT;
ENTITY motor_start_tb IS GENERIC(runner_cfg : string := runner_cfg_default); END ENTITY motor_start_tb;
아키텍처에 테스트 러너 프로세스 호스팅:
ARCHITECTURE tb OF motor_start_tb IS
test_runner : PROCESS BEGIN
test_runner_setup(runner, runner_cfg);
WHILE test_suite LOOP
-- test cases
END LOOP;
test_runner_cleanup(runner);
END PROCESS; END ARCHITECTURE;
개별 테스트 케이스는 IF run("case_name") THEN 블록으로 정의.
신호 선언 & DUT 인스턴스화
클럭, 리셋, 인터페이스 레코드 정의:
CONSTANT C_CLK_PERIOD : time := 10 ns;
SIGNAL clk, reset : STD_LOGIC := '0';
SIGNAL motor_start_in : MOTOR_START_IN_RECORD_TYPE := (switch_1 => '0', switch_2 => '0', switch_3 => '0');
SIGNAL motor_start_out : MOTOR_START_OUT_RECORD_TYPE;
DUT 인스턴스화:
motor_start_tb_inst : ENTITY DESIGN_LIB.motor_start(rtl) PORT MAP(
clk => clk, reset => reset,
motor_start_in => motor_start_in,
motor_start_out => motor_start_out );
클럭과 리셋 구동:
clk <= NOT clk after C_CLK_PERIOD / 2;
reset <= '0' after 5 * (C_CLK_PERIOD / 2);
테스트 케이스 개발
세 가지 검증 스타일 탐구: 인라인 드라이버 & 체커, 제어된 체커, 자가 검사 체커.
인라인 드라이버 & 체커
switch_1 구동하고 VUnit check 패밀리로 LED 상태 확인하는 간단 테스트 케이스:
IF run("switch_1_on_output_check") THEN
WAIT UNTIL reset = '0';
WAIT UNTIL falling_edge(clk);
motor_start_in.switch_1 <= '1';
FOR i IN 0 TO 4 LOOP
WAIT UNTIL rising_edge(clk);
check(motor_start_out.red_led = '1', "Red LED should be on");
check_false(motor_start_out.yellow_led, "Yellow LED should be off");
check_equal(motor_start_out.green_led, '0', "Green LED should be off");
END LOOP;
END IF;
제어된 체커
드라이버는 테스트 케이스에 두고 체커는 별도 프로세스에서 시작/종료 이벤트로 제어. 예: switch_2 활성화 후 YELLOW LED 검증:
check_stable(clock => clk, en => enable,
start_event => yellow_low_start_event,
end_event => yellow_low_end_event,
expr => motor_start_out.yellow_led,
msg => "YELLOW LED low before switch_2");
자가 검사 체커
전용 프로세스에 검증 로직 캡슐화, check 또는 check_stable 내부 사용. 드라이버 프로시저로 자극 단순화:
PROCEDURE switch_driver(
SIGNAL switches : OUT MOTOR_START_IN_RECORD_TYPE;
CONSTANT clk_period : IN TIME;
CONSTANT sw1_delay : IN INTEGER;
CONSTANT sw2_delay : IN INTEGER;
CONSTANT sw3_delay : IN INTEGER) IS
BEGIN
IF sw1_delay >= 0 THEN WAIT FOR clk_period * sw1_delay; switches.switch_1 <= '1'; END IF;
IF sw2_delay >= 0 THEN WAIT FOR clk_period * sw2_delay; switches.switch_2 <= '1'; END IF;
IF sw3_delay >= 0 THEN WAIT FOR clk_period * sw3_delay; switches.switch_3 <= '1'; END IF;
END PROCEDURE;
테스트 실행
터미널에서:
python .\run.py *switch_1_on_output_check
VUnit이 설계를 컴파일하고 테스트벤치 발견, 지정된 케이스 실행. 출력은 C:\vunit_tutorial\vunit_out\test_output에 로깅.
-v로 상세 로그, -l로 전체 케이스 나열, --clean으로 이전 결과 제거, -g로 파형 창과 ModelSim 실행(wave.do 파일 필요).
요약
VUnit은 설계와 검증 팀을 가속화하는 견고하고 가벼운 프레임워크입니다. Python 구동 테스트 하네스, 풍부한 VHDL 라이브러리, 유연한 체커 API로 모든 HDL 워크플로에 가치 있는 추가 요소.
다음 단계
아래 폼으로 전체 예제 프로젝트 다운로드.