VUnit 101: Een praktische gids voor geautomatiseerde VHDL-verificatie
VUnit is een toonaangevend open-source VHDL-verificatieframework dat een Python test-suite runner koppelt aan een speciale VHDL-bibliotheek. Samen automatiseren ze testbench-compilatie, uitvoering en resultaatrapportage, wat ingenieurs in staat stelt een test-gedreven ontwikkelcyclus te volgen.
In deze tutorial leidt Ahmadmunthar Zaklouta, de auteur achter VHDLwhiz, u door de volledige VUnit-workflow – van installatie en configuratie tot het creëren van een testbench, het schrijven van testcases, en het draaien ervan in ModelSim. Een kant-en-klaar voorbeeldproject is beschikbaar voor download.
Overzicht
Gebruik de zijbalk of de mobiele navigatieknop om tussen secties te springen. De tutorial bevat screenshots voor visuele referentie.
Vereisten
- Intel ModelSim – Gratis installeren zoals beschreven hier. Toevoegen aan systeem
PATH. - Python 3.6+ – Downloaden en toevoegen aan
PATH. - Git (optioneel) – Downloaden.
- Windows Terminal (optioneel) – Downloaden.
Basiskennis van VHDL en ModelSim wordt verondersteld.
VUnit installeren
Kloon de repository met submodules:
git clone --recurse-submodules https://github.com/VUnit/vunit.git
Of download de ZIP, pak uit naar C:\vunit, installeer via:
cd C:\vunit python setup.py install
Configureer omgevingsvariabelen:
VUNIT_MODELSIM_PATH– Pad naar de ModelSim-executable.VUNIT_SIMULATOR– Stel in opModelsim.
Voorbeeld screenshot:

Voorbeeldproject downloaden
Pak de ZIP uit naar C:\vunit_tutorial en voer de inbegrepen scripts uit.
Inleiding tot VUnit
VUnit vereenvoudigt HDL-verificatie door te bieden:
- Een Python-bibliotheek voor testautomatisering, configuratie, en administratie.
- Een VHDL-bibliotheek met herbruikbare verificatiecomponenten.
De VHDL-kant omvat zes bibliotheken; deze tutorial focust op de logging en check bibliotheken.

Design Under Test (DUT)
Het voorbeeld DUT, motor_start, stuurt drie LEDs (ROOD, GEEL, GROEN) om de opstartsequentie van een motor weer te geven. De interface gebruikt record-typen voor in- en outputs.

Het opstartproces heeft drie stappen:
- Configuratie laden (RODE LED)
- Kalibratie (GELE LED)
- Rotatie (GROENE LED)
Opstartsequentie
- RODE LED – Knippert vijf keer, blijft daarna branden.
- GELE LED – Gaat aan voor tien cycli na schakelaar 2, gaat dan uit met ROOD.
- GROENE LED – Brandt zolang schakelaar 3 actief is.
Testbench Ontwikkeling
- Configureer het Python
run.pyscript. - Bouw het VUnit-skelet.
- Instantieer de DUT en stuure signalen aan.
Python Run Script
Het run.py script definieert paden, creëert een VUnit-instantie, en voegt ontwerp- en testbench-bibliotheken toe:
# ROOT directory ROOT = Path(__file__).resolve().parent # Bronpaden DUT_PATH = ROOT / "design" TEST_PATH = ROOT / "testbench" # VUnit instantie VU = VUnit.from_argv() VU.enable_location_preprocessing() # Bibliotheken 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 Skelet
In de testbench-entiteit, voeg de VUnit-context en een verplichte generic toe:
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;
De architectuur beheren de test runner-proces:
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;
Individuele testcases worden gedefinieerd met IF run("case_name") THEN blokken.
Signaaldeclaraties & DUT Instantiatiëring
Definieer klokken, resets, en interface-records:
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;
Instantieer de 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 );
Klok en reset aansturen:
clk <= NOT clk after C_CLK_PERIOD / 2; reset <= '0' after 5 * (C_CLK_PERIOD / 2);
Testcase Ontwikkeling
We verkennen drie verificatie-stijlen: inline driver & checker, gecontroleerde checker, en zelf-checkende checker.
Inline Driver & Checker
Een simpele testcase die switch_1 aanstuurt en LED-statussen controleert met VUnit's check familie:
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', "Rode LED moet aan zijn"); check_false(motor_start_out.yellow_led, "Gele LED moet uit zijn"); check_equal(motor_start_out.green_led, '0', "Groene LED moet uit zijn"); END LOOP; END IF;
Gecontroleerde Checker
Hier blijft de driver in de testcase terwijl de checker in een apart proces draait, gecontroleerd door start/eind events. Bijvoorbeeld, de GELE LED verifiëren na switch_2 inschakelen:
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 => "GELE LED laag voor switch_2");
Zelf-checkende Checker
Inkapsel verificatie-logica in een dedicated proces dat check of check_stable intern gebruikt. Een driver-procedure vereenvoudigt stimuli:
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;
Tests Draaien
Vanaf de terminal:
python .\run.py *switch_1_on_output_check
VUnit compileert het ontwerp, ontdekt testbenches, en voert de gespecificeerde case uit. Output wordt gelogd naar C:\vunit_tutorial\vunit_out\test_output.
Gebruik -v voor verbose logs, -l om alle cases te listen, --clean om vorige resultaten te wissen, of -g om ModelSim te lanceren met een golfvorm-venster (vereist een wave.do bestand).
Samenvatting
VUnit biedt een robuust, lichtgewicht framework dat zowel ontwerp- als verificatie-teams versnelt. De Python-gedreven testharness, rijke VHDL-bibliotheken, en flexibele checker-API maken het een waardevolle toevoeging aan elke HDL-workflow.
Volgende Stappen
- Lees de officiële documentatie.
- Volg de VUnit blog voor updates.
- Sluit je aan bij de community op Gitter.
Download het volledige voorbeeldproject via het formulier hieronder.
VHDL
- Cat® Machines Optimaliseren: De Ultieme My.Cat.com Gids
- Aan de slag met TJBot: Bouw, Configureer en Stem-bedien Je Eigen AI-robot
- Stap-voor-stap Handleiding om een RAK 831 LoRa-gateway op Raspberry Pi 3 te Deployen
- Bouw een LoRa Gateway met de RAK831 Module op Raspberry Pi 3 – Stap-voor-Stap Gids
- Arduino Beginner Tutorial 01: Start met Je Eerste Project
- Een Praktische Gids voor Ceramisch 3D-printen: Technieken, Materialen, en Ontwerptips
- AI in verzekeringen: Een praktische startergids voor real-world implementatie
- Node-RED op PLCnext deployen met Docker: Stap-voor-stap handleiding
- Code-Ready Containers: Een Praktische Gids voor Cloud-Native Procesautomatisering met Red Hat OpenShift
- IoT in de Edge-era: Groei, data, beveiliging en partnerstrategie
- Basiskleurstoffen begrijpen: Gebruik, veiligheid en industriële toepassingen