File stimulus dibaca di testbench menggunakan TEXTIO
Membaca nilai sinyal dari file adalah cara alternatif untuk menghasilkan rangsangan untuk perangkat yang diuji (DUT). Urutan dan waktu testbench dikodekan dalam file stimulus yang dibaca oleh testbench VHDL, baris demi baris. Ini memungkinkan Anda dengan mudah mengubah pola bentuk gelombang yang ingin Anda masukkan ke objek uji.
Terkadang Anda memiliki pola pengujian atau urutan kejadian yang sangat spesifik yang ingin Anda lakukan pada DUT Anda. Anda dapat mencapai ini dengan menentukan dalam file ASCII nilai sinyal yang harus dimiliki setiap sinyal, serta waktu simulasi relatif yang harus diubah. Peran testbench VHDL dalam strategi semacam itu adalah membaca data dari file stimulus dan menerapkan nilai ke input DUT pada waktu yang tepat.
Artikel ini adalah yang kedua dari seri tentang akses file di VHDL. Kami melihat cara membaca nilai heksadesimal, oktal, dan biner dari file di posting blog sebelumnya, kembali dan membacanya jika Anda ingin tahu lebih banyak tentang membaca dari file menggunakan TEXTIO perpustakaan di VHDL.
Posting blog ini adalah bagian dari seri tentang penggunaan perpustakaan TEXTIO di VHDL. Baca artikel lainnya di sini:
Cara menginisialisasi RAM dari file menggunakan TEXTIO
Gambar bitmap file BMP dibaca menggunakan TEXTIO
Kasus uji
Contoh DUT akan menjadi 4-input multiplexer (MUX) yang diambil dari salah satu posting blog saya sebelumnya. Ini adalah MUX 4-ke-1 asinkron standar dengan lebar data satu byte. Cara kerjanya tidak penting untuk artikel ini karena kami tidak akan melakukan pemeriksaan output apa pun, ini hanya untuk tujuan demonstrasi.
Entitas MUX ditunjukkan di bawah ini.
entity mux_4 is
port(
-- Data in
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);
-- Selector
sel : in unsigned(1 downto 0);
-- Data out
dout : out unsigned(7 downto 0));
end entity;
Setelah mengimpor paket yang diperlukan di bagian atas file VHDL, kami melanjutkan untuk mendeklarasikan sinyal input yang akan kami sambungkan ke DUT. Seperti yang dapat Anda lihat dari daftar di bawah, itu adalah cetak biru dari deklarasi entitas MUX.
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);
Kami menggunakan metode instantiasi entitas untuk membuat instance MUX dengan label "DUT" di bagian atas wilayah arsitektur testbench kami. Sinyal entitas terhubung ke sinyal testbench lokal dengan nama yang sama, seperti yang ditunjukkan pada kode di bawah ini.
File stimulus dapat memiliki banyak format berbeda, yang disajikan di sini hanyalah contoh yang saya buat dari atas kepala saya saat menulis artikel ini. Namun demikian, ketika Anda memahami bagaimana saya membuatnya, Anda seharusnya dapat memodifikasinya sesuai dengan kebutuhan Anda.
Daftar di bawah ini menunjukkan file stimulus lengkap yang digunakan dalam contoh ini.
# Column description:
# wait_time | sel | din_0 | din_1 | din_2 | din3 # 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
Mari kita abaikan komentar untuk saat ini, yang ditandai dengan warna hijau, selalu dimulai dengan karakter '#'. Setiap baris mewakili satu langkah waktu dalam simulasi. Ada enam kolom perintah pada setiap baris, sebenarnya tujuh kolom teks, tetapi dua kolom pertama memiliki item data yang sama.
Kolom teks satu dan dua menggambarkan nilai waktu, untuk berapa lama simulator harus berhenti pada baris itu sebelum menerapkan nilai yang tercantum di kolom lain. Dengan demikian, waktu simulasi absolut saat perintah dieksekusi adalah relatif terhadap kejadian yang dijelaskan oleh baris sebelumnya. Kami hanya menggunakan 0, 1, atau 10 nanodetik, tetapi bisa berupa apa saja, 1000 nanodetik atau 1000 jam (1000 hr ) dalam hal ini.
Lima kolom teks yang tersisa menjelaskan nilai sinyal untuk diterapkan pada input DUT. Mereka diberikan sebagai literal heksadesimal dan urutan sinyalnya adalah sel , din_0 , din_1 , din_2 , dan akhirnya din_3 .
Sekarang, ke komentar. Ada dua jenis komentar; komentar satu baris dan komentar tambahan. Mereka akan diperlakukan berbeda oleh testbench kami. Komentar satu baris, seperti yang ada di bagian atas file, akan diabaikan. Komentar tambahan, di sisi lain, akan dicetak ke konsol simulator. Kita dapat menggunakannya untuk memberi kita petunjuk tentang apa yang terjadi saat simulasi berjalan.
Membaca file stimulus dalam VHDL
VHDL bukan bahasa terbaik untuk pemrosesan teks, tetapi ia berhasil. Dukungan untuk string dinamis terbatas, dan rutinitas kenyamanannya kurang, misalnya untuk menghapus atau melewatkan spasi. Untuk memudahkan diri kita sendiri, kita akan berasumsi bahwa file stimulus ditulis dengan baik. Mari kita berhati-hati untuk memastikan bahwa selalu ada satu spasi antara elemen teks dan satu spasi antara karakter '#' dan teks komentar. Juga, tidak ada spasi tambahan di depan atau di belakang di mana pun dalam file stimulus.
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
Wilayah deklaratif dari PROC_SEQUENCER prosedur ditunjukkan di atas. Pertama, kami mendeklarasikan file special khusus objek, tipe penangan file VHDL. Kemudian, kita mendeklarasikan variabel bertipe line . Ini hanyalah tipe akses ke string, pointer ke objek string yang dialokasikan secara dinamis. ok variabel tipe Boolean adalah untuk memeriksa apakah operasi baca berhasil. Akhirnya, kami mendeklarasikan keempat variabel char , wait_time , selector , dan data . Variabel ini untuk mengekstrak data dari setiap kolom dari setiap baris teks.
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;
Di badan proses, kita langsung masuk ke while-loop yang akan mengulangi setiap baris teks dalam file stimulus. readline prosedur menetapkan baris teks baru ke text_line variabel pada setiap iterasi dari loop ini. Setelah membaca baris, kami memeriksa apakah baris itu kosong atau jika karakter pertama adalah '#', dalam hal ini kami segera pergi ke baris berikutnya dengan menggunakan next kata kunci untuk melewati iterasi dari loop. Perhatikan bahwa kami menggunakan text_line.all untuk mendapatkan akses ke string di dalam line objek.
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;
Berikutnya mengikuti sejumlah pembacaan dari text_line obyek. read dan hread pemanggilan prosedur melewati spasi awal sehingga kita tidak perlu melakukan pembacaan dummy untuk memindahkan posisi awal pembacaan internal di dalam text_line obyek. Kita bisa saja menghilangkan pernyataan assert, tetapi saya ingin simulasi berhenti jika pembacaan gagal. Setidaknya di ModelSim, simulasi tidak berhenti secara otomatis ketika ini terjadi. Kami menetapkan setiap variabel yang berhasil dibaca ke sinyal DUT yang relevan kecuali untuk wait_time variabel yang tidak memiliki input DUT yang sesuai.
wait for wait_time;
Setelah menetapkan nilai sinyal, kami menunggu waktu yang ditentukan. Menekan pernyataan tunggu menyebabkan nilai sinyal terjadwal menjadi efektif dengan siklus delta yang sama.
-- 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;
Akhirnya, ketika program bangun dari pernyataan tunggu, kami mencari komentar tambahan di text_line obyek. Setiap komentar dicetak ke konsol dengan menggunakan laporan laporan setelah kami menghapus karakter '#' dan spasi putih berikut menggunakan pembacaan dummy.
Setelah baris terakhir teks dari file stimulus telah diproses, while-loop berakhir. Ada finish VHDL-2008 kata kunci di akhir proses yang bertanggung jawab untuk menghentikan testbench.
Keluaran
Contoh testbench mencetak teks yang ditunjukkan di bawah ini ke konsol simulator saat dijalankan di ModelSim. Kita dapat melihat bahwa komentar-komentar tersebut berasal dari file stimulus. Nilai waktu yang dicetak adalah akumulasi waktu simulasi berdasarkan penundaan nanodetik yang ditentukan dalam file stimulus.
# ** 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
Bentuk gelombang untuk simulasi ditunjukkan di bawah ini. Ini menunjukkan representasi visual tentang bagaimana nilai dari file stimulus kami diterapkan ke sinyal pada waktu simulasi yang ditentukan.
Pemikiran terakhir
Membaca rangsangan testbench dari file bisa menguntungkan jika Anda memiliki pola tes yang sangat spesifik yang perlu Anda terapkan. Seluruh testbench tidak harus dikontrol oleh file teks, contoh ini hanya dimaksudkan untuk menunjukkan kemungkinan akses file dalam VHDL.
Namun, satu hal yang belum kita bahas adalah memeriksa output DUT. Contoh testbench kami tidak memeriksa output sama sekali. Anda dapat memverifikasi perilaku DUT seperti yang akan Anda lakukan di testbench VHDL penuh, misalnya dengan menggunakan model perilaku untuk dibandingkan. Atau Anda dapat memodifikasi kode dan file stimulus untuk memasukkan nilai keluaran yang diharapkan. Strategi apa pun yang Anda pilih, pastikan Anda membuat testbench pemeriksaan mandiri dan tidak mengandalkan pemeriksaan bentuk gelombang secara manual.