Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> VHDL

VUnit 101: Практическое руководство по автоматизированной VHDL-верификации

VUnit — ведущий открытый фреймворк верификации VHDL, объединяющий Python test-suite runner с посвященной VHDL-библиотекой. Вместе они автоматизируют компиляцию тестбенча, выполнение и отчетность результатов, позволяя инженерам следовать циклу разработки, управляемой тестами.

В этом туториале Ахмадмунтар Заклута, автор VHDLwhiz, проводит вас через весь рабочий процесс VUnit — от установки и конфигурации до создания тестбенча, написания тест-кейсов и их запуска в ModelSim. Готовый к запуску пример проекта доступен для загрузки.

Обзор

Используйте боковую панель или кнопку мобильной навигации для перехода между разделами. Туториал включает скриншоты для визуальной справки.

Требования

Базовая компетенция в 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-верификации

Загрузка примера проекта

Извлеките ZIP в C:\vunit_tutorial и запустите вложенные скрипты.

Введение в VUnit

VUnit упрощает HDL-верификацию, предоставляя:

VHDL-сторона включает шесть библиотек; этот туториал фокусируется на logging и check библиотеках.

VUnit 101: Практическое руководство по автоматизированной VHDL-верификации

Дизайн под тестом (DUT)

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

VUnit 101: Практическое руководство по автоматизированной VHDL-верификации

Процесс запуска имеет три шага:

  1. Загрузка конфигурации (RED LED)
  2. Калибровка (YELLOW LED)
  3. Вращение (GREEN LED)

Последовательность запуска

Разработка тестбенча

  1. Настройте Python-скрипт run.py.
  2. Постройте VUnit-скелет.
  3. Инстанцируйте 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-воркфлоу.

Следующие шаги

Скачайте полный пример проекта через форму ниже.

VHDL

  1. Code-Ready Containers: практическое руководство по облачно-ориентированной автоматизации процессов с Red Hat OpenShift
  2. Практическое руководство по керамической 3D-печати: техники, материалы и советы по дизайну
  3. Понимание основных красителей: применение, безопасность и отраслевое использование
  4. Начало работы с TJBot: сборка, настройка и голосовое управление ИИ-роботом
  5. Пошаговое руководство по развертыванию LoRa-шлюза RAK 831 на Raspberry Pi 3
  6. Сборка LoRa-шлюза на модуле RAK831 и Raspberry Pi 3 — пошаговое руководство
  7. IoT в эре Edge: рост, данные, безопасность и стратегия партнерств
  8. ИИ в страховании: практическое руководство для реального внедрения
  9. Урок Arduino для начинающих 01: Начало работы с первым проектом
  10. Оптимизация техники Cat®: полное руководство по My.Cat.com