VUnit 101: Практическое руководство по автоматизированной VHDL-верификации
VUnit — ведущий открытый фреймворк верификации VHDL, объединяющий Python test-suite runner с посвященной VHDL-библиотекой. Вместе они автоматизируют компиляцию тестбенча, выполнение и отчетность результатов, позволяя инженерам следовать циклу разработки, управляемой тестами.
В этом туториале Ахмадмунтар Заклута, автор VHDLwhiz, проводит вас через весь рабочий процесс VUnit — от установки и конфигурации до создания тестбенча, написания тест-кейсов и их запуска в ModelSim. Готовый к запуску пример проекта доступен для загрузки.
Обзор
Используйте боковую панель или кнопку мобильной навигации для перехода между разделами. Туториал включает скриншоты для визуальной справки.
Требования
- 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.
Пример скриншота:

Загрузка примера проекта
Извлеките ZIP в C:\vunit_tutorial и запустите вложенные скрипты.
Введение в VUnit
VUnit упрощает HDL-верификацию, предоставляя:
- Python-библиотеку для автоматизации тестов, конфигурации и администрирования.
- VHDL-библиотеку, содержащую переиспользуемые компоненты верификации.
VHDL-сторона включает шесть библиотек; этот туториал фокусируется на logging и check библиотеках.

Дизайн под тестом (DUT)
Пример DUT, motor_start, управляет тремя LED (RED, YELLOW, GREEN) для представления последовательности запуска мотора. Его интерфейс использует record-типы для входов и выходов.

Процесс запуска имеет три шага:
- Загрузка конфигурации (RED LED)
- Калибровка (YELLOW LED)
- Вращение (GREEN LED)
Последовательность запуска
- RED LED — Мигает пять раз, затем остается зажженным.
- YELLOW LED — Включается на десять циклов после switch 2, затем выключается вместе с RED.
- GREEN LED — Светит пока switch 3 активен.
Разработка тестбенча
- Настройте Python-скрипт
run.py. - Постройте VUnit-скелет.
- Инстанцируйте DUT и управляйте сигналами.
Python Run Script
Скрипт 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 контекст и обязательный generic:
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;
Архитектура хостит процесс test runner:
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 и проверяющий состояния LED с использованием семейства check VUnit:
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;
Управляемый чекер
Здесь драйвер остается в тест-кейсе, в то время как чекер работает в отдельном процессе, управляемом событиями начала/конца. Например, верификация YELLOW LED после включения switch_2:
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-воркфлоу.
Следующие шаги
- Прочитайте официальную документацию.
- Следите за блогом VUnit для обновлений.
- Присоединяйтесь к сообществу на Gitter.
Скачайте полный пример проекта через форму ниже.
VHDL
- Code-Ready Containers: практическое руководство по облачно-ориентированной автоматизации процессов с Red Hat OpenShift
- Практическое руководство по керамической 3D-печати: техники, материалы и советы по дизайну
- Понимание основных красителей: применение, безопасность и отраслевое использование
- Начало работы с TJBot: сборка, настройка и голосовое управление ИИ-роботом
- Пошаговое руководство по развертыванию LoRa-шлюза RAK 831 на Raspberry Pi 3
- Сборка LoRa-шлюза на модуле RAK831 и Raspberry Pi 3 — пошаговое руководство
- IoT в эре Edge: рост, данные, безопасность и стратегия партнерств
- ИИ в страховании: практическое руководство для реального внедрения
- Урок Arduino для начинающих 01: Начало работы с первым проектом
- Оптимизация техники Cat®: полное руководство по My.Cat.com