Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial programming >> VHDL

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

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:

Contoh tangkapan layar:

VUnit 101: Panduan Praktis Verifikasi VHDL Otomatis

Unduh Proyek Contoh

Ekstrak ZIP ke C:\vunit_tutorial dan jalankan skrip yang disertakan.

Pengantar VUnit

VUnit menyederhanakan verifikasi HDL dengan menyediakan:

Sisi VHDL meliputi enam perpustakaan; tutorial ini berfokus pada perpustakaan logging dan check.

VUnit 101: Panduan Praktis Verifikasi VHDL Otomatis

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.

VUnit 101: Panduan Praktis Verifikasi VHDL Otomatis

Proses startup memiliki tiga langkah:

  1. Memuat konfigurasi (LED MERAH)
  2. Kalibrasi (LED KUNING)
  3. Rotasi (LED HIJAU)

Urutan Startup

Pengembangan Testbench

  1. Konfigurasikan skrip Python run.py.
  2. Bangun kerangka VUnit.
  3. 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.

VHDL

  1. Kontainer Siap Kode: Panduan Praktis Otomatisasi Proses Cloud-Native dengan Red Hat OpenShift
  2. Panduan Praktis untuk Cetak 3D Keramik: Teknik, Bahan, dan Tips Desain
  3. Memahami Warna Dasar: Penggunaan, Keselamatan, dan Aplikasi Industri
  4. Memulai dengan TJBot: Bangun, Konfigurasikan, dan Kendalikan dengan Suara Robot AI Anda
  5. Panduan Langkah demi Langkah untuk Menerapkan Gateway LoRa RAK 831 pada Raspberry Pi 3
  6. Membuat Gateway LoRa dengan Modul RAK831 pada Raspberry 3 – Panduan Langkah demi Langkah
  7. IoT di Era Edge: Pertumbuhan, Data, Keamanan, dan Strategi Partner
  8. AI di Asuransi: Panduan Praktis untuk Implementasi Nyata
  9. Tutorial Arduino Untuk Pemula 01: Mulai dengan Proyek Pertama Anda
  10. Optimalkan Mesin Cat®: Panduan Akhir My.Cat.com