Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> VHDL

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 op Modelsim.

Voorbeeld screenshot:

VUnit 101: Een praktische gids voor geautomatiseerde VHDL-verificatie

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.

VUnit 101: Een praktische gids voor geautomatiseerde VHDL-verificatie

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.

VUnit 101: Een praktische gids voor geautomatiseerde VHDL-verificatie

Het opstartproces heeft drie stappen:

  1. Configuratie laden (RODE LED)
  2. Kalibratie (GELE LED)
  3. 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

  1. Configureer het Python run.py script.
  2. Bouw het VUnit-skelet.
  3. 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

Download het volledige voorbeeldproject via het formulier hieronder.

VHDL

  1. Cat® Machines Optimaliseren: De Ultieme My.Cat.com Gids
  2. Aan de slag met TJBot: Bouw, Configureer en Stem-bedien Je Eigen AI-robot
  3. Stap-voor-stap Handleiding om een RAK 831 LoRa-gateway op Raspberry Pi 3 te Deployen
  4. Bouw een LoRa Gateway met de RAK831 Module op Raspberry Pi 3 – Stap-voor-Stap Gids
  5. Arduino Beginner Tutorial 01: Start met Je Eerste Project
  6. Een Praktische Gids voor Ceramisch 3D-printen: Technieken, Materialen, en Ontwerptips
  7. AI in verzekeringen: Een praktische startergids voor real-world implementatie
  8. Node-RED op PLCnext deployen met Docker: Stap-voor-stap handleiding
  9. Code-Ready Containers: Een Praktische Gids voor Cloud-Native Procesautomatisering met Red Hat OpenShift
  10. IoT in de Edge-era: Groei, data, beveiliging en partnerstrategie
  11. Basiskleurstoffen begrijpen: Gebruik, veiligheid en industriële toepassingen