산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> VHDL

VUnit 101: 자동화된 VHDL 검증을 위한 실용 가이드

VUnit은 Python 테스트 스위트 러너와 전용 VHDL 라이브러리를 결합한 선도적인 오픈소스 VHDL 검증 프레임워크입니다. 함께 테스트벤치 컴파일, 실행, 결과 리포팅을 자동화해 엔지니어가 테스트 주도 개발 주기를 따르게 합니다.

이 튜토리얼에서 VHDLwhiz 저자 Ahmadmunthar Zaklouta가 설치·설정부터 테스트벤치 생성, 테스트 케이스 작성, ModelSim 실행까지 VUnit 전체 워크플로를 안내합니다. 즉시 실행 가능한 예제 프로젝트 다운로드 가능.

개요

사이드바나 모바일 내비게이션 버튼으로 섹션 간 이동. 튜토리얼에 시각 참조용 스크린샷 포함.

요구사항

기본 VHDL과 ModelSim 숙련도 가정.

VUnit 설치

서브모듈 포함 저장소 클론:

git clone --recurse-submodules https://github.com/VUnit/vunit.git

또는 ZIP 다운로드 후 C:\vunit 압축 해제, 다음으로 설치:

cd C:\vunit
python setup.py install

환경 변수 설정:

예제 스크린샷:

VUnit 101: 자동화된 VHDL 검증을 위한 실용 가이드

예제 프로젝트 다운로드

C:\vunit_tutorial에 압축 해제 후 포함된 스크립트 실행.

VUnit 소개

VUnit은 HDL 검증을 단순화합니다:

VHDL 측면에 6개 라이브러리 포함, 이 튜토리얼은 logging과 check 라이브러리 중심.

VUnit 101: 자동화된 VHDL 검증을 위한 실용 가이드

테스트 대상 설계 (DUT)

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

VUnit 101: 자동화된 VHDL 검증을 위한 실용 가이드

시동 프로세스 3단계:

  1. 구성 로드 (RED LED)
  2. 캘리브레이션 (YELLOW LED)
  3. 회전 (GREEN LED)

시동 시퀀스

테스트벤치 개발

  1. Python run.py 스크립트 구성
  2. VUnit 스켈레톤 구축
  3. 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 워크플로에 가치 있는 추가 요소.

다음 단계

아래 폼으로 전체 예제 프로젝트 다운로드.

VHDL

  1. Code-Ready Containers: Red Hat OpenShift로 클라우드 네이티브 프로세스 자동화 실전 가이드
  2. 세라믹 3D 프린팅 실용 가이드: 기술, 소재, 설계 팁
  3. 염기성 염료의 이해: 용도, 안전성 및 산업 응용
  4. TJBot 시작하기: 나만의 AI 로봇 제작, 설정, 음성 제어
  5. 라즈베리 파이 3에 RAK 831 LoRa 게이트웨이 배포 단계별 가이드
  6. 라즈베리 파이 3에 RAK831 모듈로 LoRa 게이트웨이 구축하기 - 단계별 가이드
  7. 에지 시대의 IoT: 성장, 데이터, 보안, 파트너 전략
  8. 보험업계 AI: 실전 구현을 위한 실용적 스타터 가이드
  9. 아두이노 입문 튜토리얼 01: 첫 프로젝트 시작하기
  10. Cat® 기계 최적화: My.Cat.com 완벽 활용 가이드