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

Bagaimana menghentikan simulasi di testbench VHDL

Bagaimana Anda menghentikan simulator VHDL ketika simulasi selesai? Ada beberapa cara untuk melakukannya. Dalam artikel ini, kita akan membahas cara paling umum untuk mengakhiri uji coba yang sukses.

Kode VHDL yang disajikan di sini bersifat universal, dan harus berfungsi di semua simulator VHDL yang mumpuni. Untuk metode yang melibatkan Tcl, saya akan mencantumkan perintah untuk simulator ModelSim dan Vivado.

Anda dapat mengunduh proyek contoh dengan empat bangku tes yang berbeda dari artikel ini jika Anda telah menginstal ModelSim. Masukkan alamat email Anda di formulir di bawah ini untuk menerima file Zip!

Menggunakan selesai prosedur

VHDL selesai prosedur adalah cara favorit saya untuk menghentikan testbench VHDL yang selesai tanpa kesalahan. Anda harus mengimpor "selesai" dari paket STD.ENV, dan Anda harus mengkompilasi testbench di VHDL-2008 atau yang lebih baru untuk menggunakannya.

Kode di bawah ini mengakhiri simulasi ketika kita mencapai baris terakhir dari proses sequencer testbench.

use std.env.finish;

...

SEQUENCER_PROC : process
begin

  -- Replace this line with your testbench logic
  wait until stop_condition;

  report "Calling 'finish'";
  finish;

end process;


Perhatikan bahwa selesai keluar dari simulasi secara default. Jika Anda menjalankan ModelSim dalam versi GUI, akan muncul popup yang mengatakan "Apakah Anda yakin ingin menyelesaikan?". Jika Anda mengklik Ya, ModelSim akan keluar.

Itu mungkin bukan yang Anda inginkan. Untungnya, kita dapat mencegah perilaku ini dengan menambahkan opsi “-onfinish stop” ke perintah vsim, seperti yang ditunjukkan di bawah ini. Dengan melakukan itu, selesai prosedur akan berperilaku dengan cara yang sama seperti stop prosedur yang akan kita bahas di bagian selanjutnya dari artikel ini.

vsim -onfinish stop work.using_finish_tb

Keuntungan menggunakan selesai adalah Anda dapat menggunakan perilaku default saat melakukan simulasi dalam mode batch. Jika Anda menggunakan skrip untuk memulai simulasi, Anda ingin mengembalikan kontrol ke skrip pemanggilan setelah simulasi selesai.

Contoh di bawah ini menunjukkan testbench menggunakan selesai prosedur dimulai dalam mode batch ModelSim di Linux. Setelah testbench selesai, simulator berhenti, dan pada baris terakhir, kita kembali ke shell Linux.

jonas@ubuntu:~/stop_tb$ vsim -c -do 'vsim work.using_finish_tb; run -all'
Reading pref.tcl

# 10.5b

# vsim work.using_finish_tb
# vsim work.using_finish_tb 
# Start time: 22:58:31 on Jun 21,2020
# Loading std.standard
# Loading std.env(body)
# Loading work.using_finish_tb(sim)
#  run -all
# ** Note: Calling 'finish'
#    Time: 1 ms  Iteration: 0  Instance: /using_finish_tb
# End time: 22:58:31 on Jun 21,2020, Elapsed time: 0:00:00
# Errors: 0, Warnings: 8
jonas@ubuntu:~/stop_tb$ 

VHDL selesai prosedur didefinisikan dalam paket ENV standar. Seperti yang dapat kita lihat dari kode di bawah ini, ia hadir dalam dua rasa yang kelebihan beban. Ada versi tanpa parameter apa pun, yang selalu saya gunakan, dan ada versi lain yang menggunakan status integer sebagai input konstan.

procedure FINISH (STATUS: INTEGER);
procedure FINISH;

Anda akan berpikir bahwa status integer menjadi kode keluar saat dipanggil dari shell Linux, tetapi bukan itu masalahnya, setidaknya tidak dengan ModelSim. Masalah dengan menggunakan kode status ini adalah apa yang dilakukannya tergantung pada simulator. Kata-kata dalam standar VHDL-2008 adalah “nilai parameter STATUS dapat digunakan dalam implementasi yang ditentukan oleh simulator host “.

Namun, Anda dapat mengontrol nilai kode keluar Linux di ModelSim dengan menggunakan perintah Tcl exit -code <value> , tapi itu cerita lain.

Menggunakan stop prosedur

VHDL berhenti prosedur menyebabkan simulasi berhenti. Itu mungkin berguna jika Anda ingin memeriksa nilai sinyal secara manual atau bahkan melanjutkan simulasi nanti. Simulator memperlakukannya seperti breakpoint.

Contoh di bawah ini menunjukkan cara mengimpor dan menggunakan stop prosedur.

use std.env.stop;

...

SEQUENCER_PROC : process
begin

  -- Replace this line with your testbench logic
  wait until stop_condition;

  report "Calling 'stop'";
  stop;

end process;

Masalah dengan menggunakan stop dalam pengaturan berbasis skrip adalah bahwa itu tidak keluar dari simulasi. Alih-alih mengembalikan kontrol ke pemanggil, ModelSim membuka shell perintah Tcl, menyebabkan skrip panggilan hang tanpa batas.

Daftar di bawah ini menunjukkan output dari menjalankan testbench yang menggunakan stop prosedur dalam mode batch. Setelah simulasi berhenti, kita masih berada di ModelSim. Untuk keluar dari shell Tcl, kita harus mengetikkan “exit”.

jonas@ubuntu:~/stop_tb$ vsim -c -do 'vsim work.using_stop_tb; run -all'
Reading pref.tcl

# 10.5b

# vsim work.using_stop_tb
# vsim work.using_stop_tb 
# Start time: 22:58:56 on Jun 21,2020
# Loading std.standard
# Loading std.env(body)
# Loading work.using_stop_tb(sim)
#  run -all
# ** Note: Calling 'stop'
#    Time: 1 ms  Iteration: 0  Instance: /using_stop_tb
# Break in Process SEQUENCER_PROC at ~/stop_tb/src/using_stop_tb.vhd line 23
# Stopped at ~/stop_tb/src/using_stop_tb.vhd line 23
VSIM 3> 

Sama seperti selesai prosedur, berhenti membutuhkan VHDL-2008 atau yang lebih baru. Seperti yang ditunjukkan di bawah ini, ada versi prosedur yang kelebihan beban. Dibutuhkan nilai status integer, tetapi perilakunya bervariasi di antara simulator.

procedure STOP (STATUS: INTEGER);
procedure STOP;

Menggunakan menegaskan kata kunci

Cara failsafe dan universal untuk menghentikan testbench VHDL adalah dengan membuat pernyataan gagal. Itulah cara pertama seseorang mengajari saya untuk mengakhiri simulasi ketika saya belajar VHDL di universitas.

Tidak diperlukan impor tambahan, dan ini berfungsi di semua versi VHDL. Pastikan untuk menggunakan tingkat keparahan kegagalan , seperti yang ditunjukkan pada contoh di bawah ini.

SEQUENCER_PROC : process
begin

  -- Replace this line with your testbench logic
  wait until stop_condition;

  assert false report "Test: OK" severity failure;

end process;

Dan mengapa saya membenci cara menghentikan simulasi yang sukses ini?

Pertama-tama, terlihat aneh dan membingungkan untuk melihat hasil cetakan dari contoh di atas:

# ** Failure: Test: OK

Dikatakan bahwa itu adalah "kegagalan", tetapi tesnya "OK" pada saat yang sama. Itu karena pernyataan pernyataan seharusnya menunjukkan kondisi kesalahan dan bukan penyelesaian simulasi yang berhasil.

Masalah menjengkelkan lainnya yang dapat saya pikirkan adalah menjadi sulit untuk mengetahui secara terprogram apakah simulasi berhasil.

Sebagian besar profesional VHDL memulai simulasi dari skrip di beberapa titik, misalnya, sebagai bagian dari skema pengujian regresi yang lebih besar. Jika testbench juga berhenti pada kegagalan pernyataan ketika tidak ada yang salah, kita tidak dapat menggunakannya sebagai penanda untuk menentukan kesehatan modul VHDL.

Menggunakan Tcl

Metode terakhir untuk menghentikan simulasi yang akan saya bahas adalah dengan menggunakan Tcl dalam kombinasi dengan VHDL. Alih-alih menghentikan testbench dari file VHDL, kami menetapkan sinyal VHDL biasa saat waktunya berhenti. Dan sebelumnya, kami mengonfigurasi simulator untuk mendengarkan perubahan pada sinyal pemicu ini.

Baca juga:
Mengapa Anda perlu mempelajari Tcl

Lihat contoh di bawah ini, yang menetapkan sinyal bernama stop_condition ketika semua kasus uji telah selesai.

  signal stop_condition : boolean;

begin

  -- Replace this line with your DUT instantiation
  stop_condition <= not stop_condition after 1 ms;

  SEQUENCER_PROC : process
  begin

    -- Put your testbench logic here

    -- Pause this process forever after all tests are done
    wait;

  end process;

Anda dapat menempatkan proses testbench apa pun yang telah melakukan tugasnya untuk tidur dengan satu menunggu pernyataan sebelum proses akhir menandai. Itu akan mencegahnya memulai ulang. Kode Tcl untuk benar-benar menghentikan simulasi berbeda antar simulator.

Dalam ModelSim

Yang kita inginkan adalah menghentikan testbench ketika stop_condition Sinyal VHDL menjadi benar . Kita dapat melakukannya dengan menyiapkan panggilan balik di Tcl sebelum kita menjalankan testbench VHDL.

Menurut Manual Referensi Perintah ModelSim, kita dapat mencapainya dengan menggunakan Tcl ketika memerintah. Dalam kode Tcl di bawah ini, kami mendaftarkan panggilan balik seperti itu, dan kemudian kami memulai simulator menggunakan run -all .

when {stop_condition} {
  stop
  echo "Test: OK"
}

run -all

Perhatikan bahwa kode di dalam kurung kurawal tidak akan berjalan sampai panggilan balik terjadi. Ketika kode VHDL mengubah stop_condition sinyal ke benar , simulator akan menjeda dan mengeksekusi dua baris. Dalam contoh, kami menghentikan simulasi dan mencetak "Test:OK" ke konsol. Anda juga bisa memiliki Tcl keluar perintah di sana, yang akan keluar dari simulator, seperti VHDL selesai prosedur.

# vsim 
# Start time: 22:31:11 on Jun 22,2020
# Loading std.standard
# Loading work.using_tcl_tb(sim)
# Test: OK
# Simulation stop requested.

Daftar di atas menunjukkan output yang dicetak ke konsol ModelSim ketika testbench Tcl / VHDL selesai. Jika Anda ingin mencobanya di komputer Anda, gunakan formulir di bawah ini untuk mengunduh proyek ModelSim dengan semua contoh dari artikel ini!

Di Vivado

Menurut Panduan Referensi Perintah Tcl Vivado Design Suite, kita dapat mendaftarkan panggilan balik Tcl menggunakan add_condition memerintah. Kode di bawah ini menunjukkan padanan Xilinx untuk versi ModelSim yang telah dibahas sebelumnya.

set sim_fileset sim_1
launch_simulation -simset [get_filesets $sim_fileset]

add_condition -notrace stop_condition {
    stop
    puts "Test: OK"
}

run all

-notrace switch mencegah baris kode dalam fungsi panggilan balik digaungkan ke terminal saat dijalankan. Saya lebih suka tidak memiliki kekacauan ekstra di konsol.

Daftar di bawah ini menunjukkan kutipan dari simulasi yang berjalan di konsol simulator Vivado.

launch_simulation: ...
add_condition -notrace stop_condition {
    stop
    puts "Test: OK"
}
condition8
run all
Test: OK

Pemikiran terakhir

Seperti yang Anda lihat, ada banyak cara untuk menghentikan simulasi VHDL. Namun, satu-satunya yang pernah saya gunakan adalah VHDL-2008 selesai prosedur.

Semua simulator mendukung VHDL-2008 sekarang, dan Anda tidak perlu mengkompilasi kode RTL pada 2008, hanya testbench. selesai prosedur adalah metode yang paling portabel, dan memungkinkan Anda untuk menghentikan simulator saat berjalan dalam mode GUI, atau berhenti saat menjalankan dalam mode batch. Persis perilaku yang paling saya inginkan.

Tetapi ada keuntungan dari metode Tcl yang berada di luar cakupan artikel ini. Ketika Anda telah menjeda simulator dalam panggilan balik Tcl, Anda dapat melakukan lebih dari sekadar menghentikan simulator dan keluar. Anda dapat memeriksa sinyal VHDL dan bahkan memanipulasinya menggunakan Tcl, saat Anda melakukan panggilan balik. Itu verifikasi menggunakan Tcl.


VHDL

  1. Cara membuat daftar string di VHDL
  2. Cara membuat testbench berbasis Tcl untuk modul kunci kode VHDL
  3. Cara membuat pengontrol PWM di VHDL
  4. Cara menghasilkan angka acak di VHDL
  5. Testbench interaktif menggunakan Tcl
  6. Cara membuat testbench pemeriksaan mandiri
  7. Cara membuat Daftar Tertaut di VHDL
  8. Cara menggunakan Prosedur dalam Proses di VHDL
  9. Cara menggunakan Fungsi di VHDL
  10. Cara Menghentikan Karat