Tingkatkan Verifikasi Hardware dengan Testbench Interaktif Berbasis Tcl
Sebuah testbench interaktif adalah pengaturan simulator di mana input ke device under test (DUT) disediakan oleh operator saat testbench berjalan. Sebagian besar waktu, ini berarti Anda memasukkan perintah di konsol simulator untuk memberikan stimulus kepada DUT.
Sementara Anda harus selalu membuat testbench self-checking, testbench interaktif dapat menjadi pelengkap yang bagus. Lebih mudah untuk melakukan pengujian ad-hoc dengan testbench interaktif di tangan, daripada mengubah kode testbench self-checking.
Seringkali, Anda akan menemukan masalah di lab yang ingin Anda coba di testbench. Dengan testbench interaktif, ini bisa semudah mengetik urutan input yang telah diamati untuk mereplikasi perilaku yang tidak diinginkan di simulator.
Tcl berinteraksi dengan VHDL
Sebagian besar simulator VHDL menggunakan Tcl sebagai bahasa konsolnya. Simulator memiliki sejumlah perintah khusus vendor, tetapi berita baiknya adalah mereka dapat diperlakukan seperti perintah Tcl lainnya. Anda dapat menggunakan Tcl untuk membuat skrip kompleks, sebagian besar portabel, untuk mengelola dan mendukung testbench VHDL Anda.
Mengubah sinyal VHDL dari Tcl
Untuk berinteraksi dengan VHDL, kita perlu menemukan perintah untuk mengubah nilai sinyal. Di ModelSim, ini adalah perintah “force”. Seperti yang ditentukan dalam dokumen referensi perintah, sinopsis perintah adalah:
Switch yang ingin Anda gunakan adalah bendera “-deposit”. Ini mengubah nilai sinyal VHDL secara instan, tetapi memungkinkan driver VHDL atau Tcl lain untuk mengubahnya menjadi sesuatu yang lain pada waktu lain.
Dengan mengabaikan opsi yang tidak kita gunakan, sinopsis yang disederhanakan terlihat seperti ini:
force -deposit <signal_name> <value>
The VHDL trigger
Sekarang setelah kita tahu cara mengontrol sinyal VHDL dari Tcl, kita perlu membuat jenis penerima proses dalam testbench VHDL kita. Kode di bawah ini menunjukkan contoh minimal dari testbench seperti itu.
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity interactive is end interactive; architecture sim of interactive is -- Controlled by Tcl signal trigger : std_logic := '0'; begin process is begin wait until trigger = '1'; report "Triggered!"; end process; end architecture;
Proses akan terbangun ketika sinyal trigger berubah dari sesuatu menjadi '1'. Ini akan mencetak “Triggered!” ke konsol ketika ini terjadi, memungkinkan kita untuk menguji konsep mengontrol proses VHDL dari Tcl.
Saya melakukan itu di konsol ModelSim. Perintah yang dikeluarkan, serta outputnya, dapat dilihat dalam transkrip di bawah ini.
VSIM 1> run 10 ns; VSIM 2> force -deposit /trigger '1' VSIM 3> run 0 ns; # ** Note: Triggered! # Time: 10 ns Iteration: 0 Instance: /interactive VSIM 4> force -deposit /trigger '0' VSIM 5> run 10 ns;
Saya menjalankan testbench selama 10 nanosekon setelah memulai simulasi.
Kemudian, saya memaksa sinyal trigger menjadi '1'. Pada baris berikutnya, saya menunggu 0 nanosekon. Tujuan dari ini adalah untuk membuat siklus delta. Saya ingin proses terpicu, tetapi saya tidak ingin waktu simulasi berlalu.
Terakhir, saya memaksa sinyal trigger kembali menjadi '0' sebelum melanjutkan testbench.
Kita dapat melihat bahwa proses VHDL terbangun setelah baris “run 0 ns”, dan mencetak “Triggered!” ke konsol.
Reading VHDL signal values in tcl
Untuk membaca nilai sinyal di ModelSim, Anda dapat menggunakan perintah “examine”. Kita dapat, misalnya, membaca nilai sinyal trigger dengan menggunakan perintah ini di konsol ModelSim:
VSIM 6> examine /trigger # 0
Anda akan ingin menetapkan nilai ke variabel Tcl saat menggunakan “examine” dalam skrip. Cobalah ini di konsol ModelSim:
VSIM 7> set triggerVal [examine /trigger] # 0
Kemudian kita dapat, misalnya, mencetak variabel dengan menggunakan perintah Tcl “puts”:
Cara termudah untuk menjalankan tes cukup lama agar DUT dapat bereaksi, adalah dengan menjalankan simulator untuk nilai waktu yang tetap. Misalnya, jika DUT harus bereaksi setelah dua siklus clock, dan periode clock adalah 10 nanosekon, kita akan menggunakan perintah “run 20 ns” dalam skrip Tcl kita.
Jika DUT tidak memiliki waktu reaksi yang tetap, pernyataan assert VHDL dapat digunakan untuk menghentikan simulasi dan menyerahkan kontrol ke fungsi callback Tcl. Di ModelSim, ini akan berarti menyetel breakpoint dari skrip Tcl Anda dengan menggunakan perintah “when”:
when [[-fast] [-id <id#>] [-label <label>] {<when_condition_expression>} {<command>}]
Anda juga harus mendefinisikan fungsi callback “onBreak” di Tcl yang akan dijalankan saat breakpoint terpicu. Fungsi “onBreak” ditentukan dalam referensi perintah ModelSim.
The drawbacks of Tcl-driven testing
Ada kekurangan dalam menggunakan testbench yang sangat bergantung pada skrip Tcl. Yang paling jelas adalah masalah kecepatan dan portabilitas.
Testbench yang didorong Tcl bekerja dengan memulai dan menghentikan simulator berkali-kali untuk berinteraksi dengan kode VHDL. Memulai dan menghentikan simulasi untuk menjalankan fungsi Tcl di antaranya, lebih memakan waktu daripada menjalankan testbench VHDL secara terus-menerus. Meskipun Tcl adalah bahasa yang diinterpretasikan, VHDL dikompilasi dalam simulator dan berjalan jauh lebih cepat dari Tcl.
Meskipun Tcl portabel ke simulator lain, perintah spesifik simulator yang akan Anda gunakan tidak demikian. Bahkan jika Anda menemukan perintah setara di simulator lain, mereka mungkin bekerja secara berbeda. Vendor simulator membuat aturan sendiri untuk perintah yang didukung mereka. Oleh karena itu, testbench yang didorong Tcl harus dianggap kurang portabel daripada testbench VHDL murni.
New VHDL and FPGA course
* Saya sedang membuat kursus VHDL dan FPGA baru yang akan mempelajari testbench secara menyeluruh. Anda akan mempelajari cara membuat desain FPGA dari nol. Setelah menyelesaikan kursus, Anda akan tahu cara membuat testbench self-checking, dan cara menggunakan kembali kode untuk membuat testbench interaktif.
* Updated 12th of October 2020: Saya telah menyelesaikan kursus. Klik gambar di bawah ini untuk mempelajari lebih lanjut.
Produk yang akan kita buat adalah modul pengontrol LED dot matrix. Kami akan menggunakan papan pengembangan Lattice iCEstick senilai $49. Di akhir, kami akan mengimplementasikan desain pada breadboard. Anda akan dapat mengetik pada keyboard komputer Anda, dan karakter akan muncul pada layar LED dot matrix yang dikontrol oleh FPGA.
Baca lebih lanjut tentang kursus Dot Matrix VHDL dan FPGA di sini!