Menggerakkan Testbench VHDL dari Berkas Stimulus Eksternal dengan TEXTIO
Membaca data stimulus dari berkas eksternal adalah cara yang kuat untuk mengontrol Device‑Under‑Test (DUT) dalam VHDL. Dengan membuat skrip urutan nilai sinyal dan waktu simulasi dalam berkas teks biasa, desainer dapat dengan cepat menukar pola uji tanpa memodifikasi logika testbench. Artikel ini, yang kedua dalam seri tentang akses file VHDL, menunjukkan cara membaca berkas stimulus dengan pustaka TEXTIO dan menerapkan nilainya ke multiplexer 4 input.
Ringkasan Kasus Uji
DUT adalah multiplexer 4‑ke‑1 sinkron dengan kata data 8‑bit. Testbench tidak melakukan verifikasi output—ia hanya menggerakkan input sehingga gelombang dapat diperiksa secara manual. Deklarasi entitas direproduksi di bawah ini untuk referensi.
entity mux_4 is port( din_0 : in unsigned(7 downto 0); din_1 : in unsigned(7 downto 0); din_2 : in unsigned(7 downto 0); din_3 : in unsigned(7 downto 0); sel : in unsigned(1 downto 0); dout : out unsigned(7 downto 0)); end entity;
Sinyal yang terhubung ke DUT dideklarasikan dalam arsitektur testbench dan dibuat instance dengan label DUT:
signal din_0 : unsigned(7 downto 0); signal din_1 : unsigned(7 downto 0); signal din_2 : unsigned(7 downto 0); signal din_3 : unsigned(7 downto 0); signal sel : unsigned(1 downto 0); signal dout : unsigned(7 downto 0); DUT: entity work.mux_4(rtl) port map ( din_0 => din_0, din_1 => din_1, din_2 => din_2, din_3 => din_3, sel => sel, dout => dout );
Mendesain Berkas Stimulus
Meskipun banyak format yang mungkin, contoh di bawah ini menunjukkan tata letak yang jelas dan mudah dibaca manusia. Setiap baris mewakili langkah simulasi dan berisi:
wait_time – penundaan dari langkah sebelumnya (misalnya, 10 ns)
sel – nilai selektor 2‑bit
din_0 hingga din_3 – nilai data 8‑bit dalam heksadesimal
Komentar opsional diakhiri dengan # untuk output konsol
Komentar yang dimulai baris diabaikan oleh testbench; komentar yang mengikuti sekelompok data dicetak ke konsol simulator.
# Column description: # wait_time | sel | din_0 | din_1 | din_2 | din_3 # Optional console printout 0 ns 0 AA BB CC DD # Setting initial values 10 ns 1 AA BB CC DD # Testing by changing the selector signal 10 ns 2 AA BB CC DD 10 ns 3 AA BB CC DD 10 ns 3 A1 B1 C1 D1 # Testing by changing all data inputs 10 ns 3 A2 B2 C2 D2 10 ns 3 A3 B3 C3 D3 10 ns 3 00 00 00 D2 # Changing all unselected inputs 10 ns 3 01 02 03 D2 10 ns 3 11 22 33 D2 1 ns 0 CC DD EE FF # Changing all inputs fast 1 ns 1 DD EE FF CC 1 ns 2 EE FF CC DD 1 ns 3 FF CC DD EE 10 ns 0 00 00 00 00 # Simulation stop
Membaca File dengan TEXTIO
Di bawah ini adalah proses inti yang membuka berkas stimulus, mem-parse setiap baris, menetapkan nilai ke input DUT, dan menangani komentar. Contoh mengasumsikan berkas yang diformat dengan baik – satu spasi memisahkan kolom, dan karakter # diikuti oleh satu spasi.
PROC_SEQUENCER : process file text_file : text open read_mode is "stimulus.txt"; variable text_line : line; variable ok : boolean; variable char : character; variable wait_time : time; variable selector : sel'subtype; variable data : dout'subtype; begin while not endfile(text_file) loop readline(text_file, text_line); -- Skip empty lines and single‑line comments if text_line.all'length = 0 or text_line.all(1) = '#' then next; end if; read(text_line, wait_time, ok); assert ok report "Read 'wait_time' failed for line: " & text_line.all severity failure; hread(text_line, selector, ok); assert ok report "Read 'sel' failed for line: " & text_line.all severity failure; sel <= selector; hread(text_line, data, ok); assert ok report "Read 'din_0' failed for line: " & text_line.all severity failure; din_0 <= data; hread(text_line, data, ok); assert ok report "Read 'din_1' failed for line: " & text_line.all severity failure; din_1 <= data; hread(text_line, data, ok); assert ok report "Read 'din_2' failed for line: " & text_line.all severity failure; din_2 <= data; hread(text_line, data, ok); assert ok report "Read 'din_3' failed for line: " & text_line.all severity failure; din_3 <= data; wait for wait_time; -- Print trailing comment to console, if any read(text_line, char, ok); -- Skip expected newline read(text_line, char, ok); if char = '#' then read(text_line, char, ok); -- Skip expected newline report text_line.all; end if; end loop; finish; end process;
Output Simulasi
Saat dijalankan di ModelSim konsol menampilkan komentar di akhir bersama dengan waktu simulasi kumulatif. Cuplikan berikut menunjukkan urutan catatan yang dicetak:
# ** Note: Setting initial values # Time: 0 ns Iteration: 1 Instance: /file_stim_tb # ** Note: Testing by changing the selector signal # Time: 10 ns Iteration: 0 Instance: /file_stim_tb # ** Note: Testing by changing all data inputs # Time: 40 ns Iteration: 0 Instance: /file_stim_tb # ** Note: Changing all unselected inputs # Time: 70 ns Iteration: 0 Instance: /file_stim_tb # ** Note: Changing all inputs fast # Time: 91 ns Iteration: 0 Instance: /file_stim_tbf # ** Note: Simulation stop # Time: 104 ns Iteration: 0 Instance: /file_stim_tb # Break in Process PROC_SEQUENCER at file_stim_tb.vhd line 98
Gelombang yang dihasilkan oleh testbench mencerminkan waktu dan nilai data dari berkas, memungkinkan desainer untuk memverifikasi perilaku DUT secara visual.
Poin Utama
Berkas stimulus eksternal memberi desainer kontrol yang presisi atas urutan tes tanpa mengubah kode testbench.
Menggunakan TEXTIO menjaga testbench tetap ringkas, tetapi memerlukan pemformatan berkas yang disiplin.
Selalu sertakan mekanisme pemeriksaan sendiri – baik dengan membandingkan terhadap model perilaku atau dengan menyematkan output yang diharapkan dalam berkas stimulus.
Dengan mengikuti contoh di atas, Anda dapat memanfaatkan fleksibilitas penuh TEXTIO VHDL untuk menggerakkan skenario tes kompleks sambil mempertahankan struktur testbench yang bersih dan mudah dipelihara.