VUnit 101: Panduan Praktis Verifikasi VHDL Otomatis
VUnit adalah kerangka verifikasi VHDL open-source terkemuka yang menggabungkan runner suite uji Python dengan perpustakaan VHDL khusus. Bersama-sama mereka mengotomatisasi kompilasi, eksekusi, dan pelaporan hasil testbench, memungkinkan insinyur untuk mengikuti siklus pengembangan yang didorong uji.
Dalam tutorial ini, Ahmadmunthar Zaklouta, penulis di balik VHDLwhiz, memandu Anda melalui seluruh alur kerja VUnit—dari instalasi dan konfigurasi hingga pembuatan testbench, penulisan kasus uji, dan menjalankannya di ModelSim. Proyek contoh siap jalankan tersedia untuk diunduh.
Ringkasan
Gunakan sidebar atau tombol navigasi seluler untuk melompat antar bagian. Tutorial ini menyertakan tangkapan layar untuk referensi visual.
Persyaratan
- Intel ModelSim – Instal gratis seperti dijelaskan di sini. Tambahkan ke
PATH sistem Anda. - Python 3.6+ – Unduh dan tambahkan ke
PATH. - Git (opsional) – Unduh.
- Windows Terminal (opsional) – Unduh.
Asumsikan kemahiran VHDL dan ModelSim dasar.
Menginstal VUnit
Clone repositori dengan submodules:
git clone --recurse-submodules https://github.com/VUnit/vunit.git
Atau unduh ZIP, ekstrak ke C:\vunit, lalu instal melalui:
cd C:\vunit python setup.py install
Konfigurasikan variabel lingkungan:
VUNIT_MODELSIM_PATH – Jalur ke executable ModelSim. VUNIT_SIMULATOR – Setel ke Modelsim.
Contoh tangkapan layar:

Unduh Proyek Contoh
Ekstrak ZIP ke C:\vunit_tutorial dan jalankan skrip yang disertakan.
Pengantar VUnit
VUnit menyederhanakan verifikasi HDL dengan menyediakan:
- Sebuah perpustakaan Python untuk otomatisasi uji, konfigurasi, dan administrasi.
- Sebuah perpustakaan VHDL yang berisi komponen verifikasi yang dapat digunakan kembali.
Sisi VHDL meliputi enam perpustakaan; tutorial ini berfokus pada perpustakaan logging dan check.

Desain yang diuji (DUT)
DUT contoh, motor_start, mengemudikan tiga LED (MERAH, KUNING, HIJAU) untuk mewakili urutan startup motor. Antarmukanya menggunakan tipe rekaman untuk input dan output.

Proses startup memiliki tiga langkah:
- Memuat konfigurasi (LED MERAH)
- Kalibrasi (LED KUNING)
- Rotasi (LED HIJAU)
Urutan Startup
- LED MERAH – Berkedip lima kali, kemudian tetap menyala.
- LED KUNING – Menyala selama sepuluh siklus setelah switch 2, kemudian mati bersama MERAH.
- LED HIJAU – Menyala saat switch 3 aktif.
Pengembangan Testbench
- Konfigurasikan skrip Python
run.py. - Bangun kerangka VUnit.
- Buat instance DUT dan dorong sinyal.
Skrip Run Python
Skrip run.py mendefinisikan jalur, membuat instance VUnit, dan menambahkan perpustakaan desain dan testbench:
# 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"])
Kerangka VUnit
Dalam entitas testbench, tambahkan konteks VUnit dan generic wajib:
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;
Arsitektur menampung proses 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;
Kasus uji individual didefinisikan dengan blok IF run("case_name") THEN.
Deklarasi Sinyal & Instantiasi DUT
Definisikan clock, reset, dan rekaman antarmuka:
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;
Buat instance 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 );
Dorong clock dan reset:
clk <= NOT clk after C_CLK_PERIOD / 2; reset <= '0' after 5 * (C_CLK_PERIOD / 2);
Pengembangan Kasus Uji
Kami menjelajahi tiga gaya verifikasi: driver & checker inline, checker yang dikontrol, dan checker self-checking.
Driver & Checker Inline
Kasus uji sederhana yang mengemudikan switch_1 dan memeriksa status LED menggunakan keluarga 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;
Checker yang Dikontrol
Di sini driver tetap dalam kasus uji sementara checker berjalan dalam proses terpisah, dikontrol oleh peristiwa mulai/akhiri. Misalnya, memverifikasi LED KUNING setelah switch_2 diaktifkan:
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");
Checker Self-Checking
Enkapsulasi logika verifikasi dalam proses terpisah yang menggunakan check atau check_stable secara internal. Prosedur driver menyederhanakan stimulus:
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;
Menjalankan Uji
Dari terminal:
python .\run.py *switch_1_on_output_check
VUnit mengompilasi desain, menemukan testbench, dan menjalankan kasus yang ditentukan. Output dicatat ke C:\vunit_tutorial\vunit_out\test_output.
Gunakan -v untuk log rinci, -l untuk mencantumkan semua kasus, --clean untuk membersihkan hasil sebelumnya, atau -g untuk meluncurkan ModelSim dengan jendela waveform (memerlukan file wave.do).
Ringkasan
VUnit menawarkan kerangka yang kuat dan ringan yang mempercepat tim desain dan verifikasi. Test harness yang didorong Python, perpustakaan VHDL yang kaya, dan API checker yang fleksibel membuatnya menjadi tambahan berharga bagi setiap alur kerja HDL.
Langkah Selanjutnya
Unduh proyek contoh lengkap melalui formulir di bawah ini.