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

Bagaimana menautkan perpustakaan Quartus Prime IP ke VUnit

Pernahkah Anda ingin menjalankan simulasi VHDL yang menyertakan inti IP Quartus melalui kerangka kerja verifikasi VUnit?

Itulah yang ada dalam pikiran insinyur FPGA Konstantinos Paraskevopoulos, tetapi dia tidak dapat menemukan tutorial yang cocok untuk itu. Untungnya, dia menggunakan bakatnya untuk mencari tahu caranya dan cukup baik untuk membaginya dengan VHDLwhiz melalui artikel tamu ini .

Ayo beri tahu Konstantinos!

Seringkali diinginkan untuk memasukkan IP yang telah ditentukan sebelumnya dari Katalog IP Quartus ke dalam desain Anda saat mensimulasikan sistem Anda dengan VUnit. Dengan demikian, tutorial berikut bertujuan untuk membekali pembaca dengan pengetahuan tentang menghasilkan, menggabungkan, dan menautkan perpustakaan IP Quartus eksternal ke lingkungan VUnit.

Baru menggunakan VUnit? Lihat tutorial ini:Memulai dengan VUnit

Ringkasan

Tutorial ini terdiri dari tiga bagian utama :

  1. Deskripsi singkat tentang IP yang dipilih
  2. Langkah-langkah yang diperlukan untuk membuat dan menautkan library yang sesuai
  3. Verifikasi dengan menggunakan VUnit dan Modelsim

Persyaratan

Ini juga mengasumsikan memiliki pengetahuan dasar VHDL dan keterampilan ModelSim.

Desain sedang diuji

Untuk skenario kami, kami menggunakan IP Paralel Adder dari daftar IP Aritmatika Integer Kuartus.

Desain kami menerima tiga vektor input 16-bit dan mengeluarkan hasil tambahan dalam vektor 17-bit.

Langkah 1 :Hasilkan IP

Kami membuat penambah kami di jendela katalog IP dengan mengklik dua kali komponen penambah paralel di bawah Library/Basic functions/Arithmetic.

Setelah kami memberikan nama dan menyesuaikan komponen kami berdasarkan kebutuhan kami, kami mengklik tombol Hasilkan HDL di kanan bawah.

Pada titik ini, sebuah jendela akan muncul, seperti yang digambarkan pada gambar berikut.

Catatan: Kita harus mengatur Create simulation model di bawah Simulation bagian ke VHDL atau Verilog untuk menghasilkan file simulasi karena opsi default tidak ada. Jika kita tidak memilih salah satu, given_ip_name.spd file tidak akan dibuat, menyebabkan langkah berikutnya gagal.

Proses di atas menghasilkan file dan folder di bawah quartus direktori:

  1. Berkas:given_ip_name.ip
  2. Map:given_ip_name

Folder tersebut berisi .vhd dan .v file yang perlu ditambahkan nanti di run.py kami naskah.

Langkah 2:Buat file simulasi IP

  1. GUI: Pilih Tools Generate Simulator Setup Script for IP dan tentukan direktori keluaran di jendela prompt,
  2. CMD: Dengan menggunakan perintah Qsys, kita dapat membuat file yang sama dengan mengetikkan perintah berikut di terminal:

ip-setup-simulation --quartus-project= <project's_QPF_filepath>
--output-directory= <my_dir>

Dengan menggunakan salah satu dari dua metode di atas, kami menginstruksikan Quartus untuk membuat direktori untuk setiap simulator yang didukung yang menyimpan skrip untuk membuat dan mengompilasi pustaka IP.

Langkah 3:Buat dan kompilasi pustaka IP untuk Modelsim

Langkah selanjutnya adalah mencari msim_setup.tcl skrip di mentor folder yang dibuat oleh langkah sebelumnya dan duplikat dengan nama setup.tcl . Kemudian, di setup.tcl file, batalkan komentar pada perintah yang diilustrasikan dan atur $QSYS_SIMDIR variabel.


# # QSYS_SIMDIR is used in the Quartus-generated IP simulation script to
# # construct paths to the files required to simulate the IP in your Quartus
# # project. By default, the IP script assumes that you are launching the
# # simulator from the IP script location. If launching from another
# # location, set QSYS_SIMDIR to the output directory you specified when you
# # generated the IP script, relative to the directory from which you launch
# # the simulator.
# #
 set QSYS_SIMDIR <script generation output directory>
# #
# # Source the generated IP simulation script.
 source $QSYS_SIMDIR/mentor/msim_setup.tcl
# #
# # Set any compilation options you require (this is unusual).
# set USER_DEFINED_COMPILE_OPTIONS <compilation options>
# set USER_DEFINED_VHDL_COMPILE_OPTIONS <compilation options for VHDL>
# set USER_DEFINED_VERILOG_COMPILE_OPTIONS <compilation options for Verilog>
# #
# # Call command to compile the Quartus EDA simulation library.
 dev_com
# #
# # Call command to compile the Quartus-generated IP simulation files.
 com
# #

Setelah mengubah dan menyimpan setup.tcl , kita dapat dengan aman mengeksekusi file Tcl menggunakan vsim perintah.


vsim -c -do "do setup.tcl; quit"

Itu menghasilkan perpustakaan yang dikompilasi di mentor folder.

Langkah 4:Tautan VUnit

Sekarang setelah pustaka IP telah dibuat, kita harus menautkannya dengan menggunakan python run.py naskah.

Lihat gambar di bawah ini untuk lebih memahami struktur direktori contoh kami. Topologi awal terdiri dari folder root demo , tb , vunit , dan quartus folder. Semua subfolder dan file di bawah quartus folder dihasilkan melalui kerangka kerja Quartus setelah membuat proyek dan menyelesaikan langkah 1 hingga 3.

Catatan: Quartus menghasilkan lebih banyak file dan folder, tetapi gambar di bawah menunjukkan hal-hal yang menarik bagi kami.

Dengan menggunakan tampilan topologi yang berbeda ini sebagai referensi, kita dapat menentukan jalur ROOT dan jalur ke pustaka yang dihasilkan, seperti yang ditunjukkan di bawah ini.

Perhatikan bahwa sim_files adalah direktori yang kami tentukan di langkah 2 tempat folder mentor disimpan.


from vunit import VUnit
from os.path 
import join, dirname, abspath
# ROOT
root = join(dirname(__file__), '../')
# Path to generated libraries
path_2_lib = '/quartus/sim_files/mentor/libraries/'
# ROOT


Setelah membuat instance VUnit yang disebut vu , kita dapat menentukan pustaka desain untuk kode VHDL kita dan menautkan pustaka eksternal apa pun yang diperlukan:

# Create VUnit instance by parsing command line arguments
vu = VUnit.from_argv()
# create design's library
my_lib = vu.add_library('my_lib')
# Link external library
vu.add_external_library("parallel_adder", root + path_2_lib + "parallel_adder")

Dan akhirnya, tambahkan file sumber kami. Ini terletak di tiga subfolder di bawah given_ip_name direktori:

  1. parallel_add_191
  2. synth
  3. sim

synth dan sim dirs berisi informasi yang sama, yaitu desain tingkat atas dari IP kita. Namun, pemformatan file-file ini dalam kasus kami adalah dalam VHDL. Mereka bisa berada di Verilog, dan ini tergantung pada bahasa yang dipilih pada langkah 1.

Jika desain tingkat atas kami memerlukan sub-komponen, kami juga harus menyertakan file sumbernya. Mereka berada di bawah subfolder di given_ip_name direktori, seperti  parallel_add_191 komponen dalam kasus kami.

 
my_lib.add_source_files(join(root,'quartus','parallel_adder','sim','parallel_adder.vhd'))
my_lib.add_source_files(join(root,'quartus','parallel_adder','parallel_add_191','sim','parallel_adder_parallel_add_191_oh4guxa.vhd'))
my_lib.add_source_files(join(root,'tb','tb_demo.vhd'))
testbench = my_lib.entity("tb_demo") 
vu.main()

Testbench

Untuk memulainya, Anda dapat melihat tautan ini untuk mempelajari tentang dasar-dasar pembentukan testbench VUnit.

Kembali ke testbench kami, kami menambahkan pustaka VUnit yang diperlukan bersama dengan pustaka lain yang ingin kami gunakan dan mendefinisikan sinyal kami.

Catatan: Eksekusi proses dalam contoh kita adalah sekuensial. Dengan demikian, sinyal kontrol (disebut sebagai bendera ) digunakan untuk memberi tahu suatu proses apakah akan dimulai atau dihentikan.

library IEEE;
use IEEE.std_logic_1164.all;
use ieee.numeric_std.all;
library vunit_lib;
context vunit_lib.vunit_context;

entity tb_demo is 
generic ( runner_cfg : string:= runner_cfg_default); 
end tb_demo;
architecture sim of tb_demo is
constant clk_period : time := 10 ns;
signal clk : std_logic := '0';
signal rst : std_logic := '0';
-- INPUTS
signal data_a : std_logic_vector(0 to 15):= (others => '0');
signal data_b : std_logic_vector(0 to 15):= (others => '0');
signal data_c : std_logic_vector(0 to 15):= (others => '0');
-- OUTPUTS
signal result : std_logic_vector(0 to 16);
-- CONTROL FLAGS
signal reset_done :boolean := false;
signal sim_done   :boolean := false;
signal start_sim  :boolean := false;

Menindaklanjuti, kami membuat instance UUT kami. Quartus memasok contoh instance komponen untuk VHDL dan Verilog di bawah konvensi nama file ip_name_inst.vhd dan ip_name_inst.v .

begin 
-- Unit Under Test 
UUT : entity work.parallel_adder
port map ( 
data0x => data_a, -- parallel_add_input.data0x 
data1x => data_b, --                   .data1x 
data2x => data_c, --                   .data2x 
result => result  -- parallel_add_output.result
); 

Dua proses pertama yang dimulai adalah clk_process dan reset_rel . Sementara yang terakhir ditangguhkan setelah mengatur ulang dan mengemudikan reset_done tandai ke true , clk_process beroperasi sepanjang waktu simulasi.

clk_process : process
begin 
  clk <= '1';
  wait for clk_period/2;
  clk <= '0'; 
  wait for clk_period/2; 
end process clk_process;

reset_rel : process
begin
  rst <= '1'; 
  wait for clk_period*2; 
  wait until rising_edge(clk); 
  rst <= not rst; 
  reset_done <= true; 
  wait; 
end process reset_rel;

Sekarang setelah reset selesai, kita dapat memanggil test_runner proses untuk menjalankan pengujian kami. Selanjutnya, pelari uji tetap aktif sampai sim_done bendera didorong ke true , yang terjadi pada proses terakhir.

test_runner : process
begin
  test_runner_setup(runner, runner_cfg);
  wait until reset_done and rising_edge(clk);

  iterate : while test_suite loop
    start_sim <= true;
    if run("test_case_1") then
      info ("Start");
      info (running_test_case);
      wait until sim_done;
    end if;
  end loop;
  test_runner_cleanup(runner);
end process test_runner;

Terakhir, data_generator proses mengeksekusi beberapa penambahan dengan menetapkan nilai ke tiga input dari penambah paralel kami dengan menggunakan for lingkaran.

Catatan: Proses ini dipicu ketika test_runner proses menginstruksikannya dengan mengatur start_sim bendera. Sedangkan pada akhir proses ini akan memunculkan sim_done flag, memerintahkan pelari uji untuk menjeda simulasi.

data_generator : process 
  constant tag2 : log_level_t := new_log_level("INFO", fg => blue, bg => black, style => bright);
  variable a,b,c,d : integer; 
begin 
  wait until start_sim;
   wait until rising_edge(clk); 
   show(display_handler, tag2);
   if running_test_case = "test_case_1" then
     for i in 0 to 10 loop
       data_a <= std_logic_vector(to_unsigned(i+10,data_a'length));
       data_b <= std_logic_vector(to_unsigned(i+20,data_a'length));
       data_c <= std_logic_vector(to_unsigned(i+30,data_a'length)); 
       wait until rising_edge(clk); 
       a := to_integer(unsigned(data_a)); 
       b := to_integer(unsigned(data_b)); 
       c := to_integer(unsigned(data_c)); 
       d := to_integer(unsigned(result)); 
       log( integer'image(a) &" + "& integer'image(b) &" + "& integer'image(c) 
          &" = "& integer'image(d), tag2); 
     end loop;
   end if; 
   sim_done <= true;
end process data_generator;

Verifikasi

Untuk menjalankan test case dan memverifikasi bahwa semuanya berfungsi seperti yang diharapkan, kita dapat menjalankan run.py script dari direktori itu terletak hanya dengan mengetik di terminal perintah berikut.


python ./run.py -v

Catatan: Logger yang disesuaikan telah digunakan untuk ilustrasi yang lebih baik dalam output kami yang terlihat dengan memberikan -v verbose pilihan. Selain itu, karena hanya satu kasus uji yang ditentukan, kami tidak perlu memberikan opsi untuk menentukannya.

Terakhir, untuk memverifikasi hasil kami di ModelSim, kami dapat mengetikkan perintah berikut:

python ./run.py --gui

(Klik gambar untuk memperbesar)

Kesimpulan

Sebagai penutup, kita belajar dalam tutorial ini tentang cara menggabungkan dan menguji IP Quartus yang berada di katalog IP ke VUnit. Kami menggunakan IP yang telah ditentukan sebelumnya. Namun, kami juga dapat mengintegrasikan IP khusus yang dikemas dengan cara ini di lingkungan VUnit kami.


Lihat tutorial VUnit ini jika Anda belum melakukannya:
Memulai VUnit


VHDL

  1. Apa Itu SigFox?
  2. Memulai dengan VUnit
  3. Cara membuat daftar string di VHDL
  4. Bagaimana menghentikan simulasi di testbench VHDL
  5. Cara membuat pengontrol PWM di VHDL
  6. Cara membuat testbench pemeriksaan mandiri
  7. Bagaimana Teknologi Menyediakan Tautan Penting dalam Rantai Pasokan yang Etis
  8. Mesin Anggar Rantai Tautan:Cara kerjanya dan penerima manfaat
  9. cara mengunggulkan pompa roda gigi hidraulik
  10. cara mengunggulkan pompa hidrolik traktor ford