はじめに
Xilinx ZynqMP SoC VIP の中を調べる(その3)
今回は、左にある Simulation => RTL Simulation => Run Behavioral Simulation を実行したら、何をやっているのかをみていきます。
シミュレーション実行
zynqmpsoc.sim/sim_1/behav/xsim ディレクトリにてシミュレーションが実行されます。
生成されたファイルは、下記のようなものです。3種類(compile, elaborate, simulate) 時に使われて生成されたファイルです。
compile
elaborate
- elaborate.sh
- elaborate.log
- xvhdl.pb
- xvlog.pb
- xelab.pb
- xsim.dir
simulate
- protoinst_files
- simulate.sh
- simulate.log
- tb.tcl
- tb_behav.wdb
- xsim.ini
- xsim.in.bak
compile
compile.sh にて実行された時のログファイルがcompile.log です。compile.sh では下記のようなことを行っています。
#!/bin/bash -f # **************************************************************************** # Vivado (TM) v2022.1 (64-bit) # # Filename : compile.sh # Simulator : Xilinx Vivado Simulator # Description : Script for compiling the simulation design source files # # Generated by Vivado on Mon Jul 18 12:07:57 JST 2022 # SW Build 3526262 on Mon Apr 18 15:47:01 MDT 2022 # # IP Build 3524634 on Mon Apr 18 20:55:01 MDT 2022 # # usage: compile.sh # # **************************************************************************** set -Eeuo pipefail # compile Verilog/System Verilog design sources echo "xvlog --incr --relax -L uvm -L axi_vip_v1_1_12 -L zynq_ultra_ps_e_vip_v1_0_12 -L xilinx_vip -prj tb_vlog.prj" xvlog --incr --relax -L uvm -L axi_vip_v1_1_12 -L zynq_ultra_ps_e_vip_v1_0_12 -L xilinx_vip -prj tb_vlog.prj 2>&1 | tee compile.log # compile VHDL design sources echo "xvhdl --incr --relax -prj tb_vhdl.prj" xvhdl --incr --relax -prj tb_vhdl.prj 2>&1 | tee -a compile.log echo "Waiting for jobs to finish..." echo "No pending jobs, compilation finished."
最初に、xvlog コマンドにて、Verilog HDL関連のファイルをコンパイルしています。-L オプションにて、uvm, axi_vip_v1_1_12, zynq_ultra_ps_e_vip_v1_0_12, xilinx_vip ライブラリを指定しています。tb_vlog.prj (下記)ファイルにて、必要なファイルを指定しています。xvlog.log は xvlog コマンドのログファイルです。
zynqmpsoc.gen と zynqmpsoc_ip_user_files ディレクトリの下にあるファイルを使っています。ローカルなファイルは、glbl.v だけです。nosort コマンドを使って、ファイルの読み込み順番を保つようにしています。
# compile verilog/system verilog design source files verilog xil_defaultlib --include "../../../../zynqmpsoc.gen/sources_1/bd/mpsoc_preset/ipshared/ec67/hdl" --include "../ ../../../zynqmpsoc.gen/sources_1/bd/mpsoc_preset/ipshared/8cdf/hdl" --include "/mnt/usb/XILINX/Vivado/2022.1/Vivado/2022 .1/data/xilinx_vip/include" \ "../../../../zynqmpsoc.ip_user_files/bd/mpsoc_preset/ip/mpsoc_preset_axi_bram_ctrl_0_bram_0/sim/mpsoc_preset_axi_bram_ct rl_0_bram_0.v" \ "../../../../zynqmpsoc.ip_user_files/bd/mpsoc_preset/ip/mpsoc_preset_xbar_0/sim/mpsoc_preset_xbar_0.v" \ "../../../../zynqmpsoc.ip_user_files/bd/mpsoc_preset/ip/mpsoc_preset_auto_ds_0/sim/mpsoc_preset_auto_ds_0.v" \ "../../../../zynqmpsoc.ip_user_files/bd/mpsoc_preset/ip/mpsoc_preset_auto_pc_0/sim/mpsoc_preset_auto_pc_0.v" \ "../../../../zynqmpsoc.ip_user_files/bd/mpsoc_preset/ip/mpsoc_preset_auto_ds_1/sim/mpsoc_preset_auto_ds_1.v" \ "../../../../zynqmpsoc.ip_user_files/bd/mpsoc_preset/ip/mpsoc_preset_zynq_ultra_ps_e_0_0/sim/mpsoc_preset_zynq_ultra_ps_ e_0_0_vip_wrapper.v" \ "../../../../zynqmpsoc.ip_user_files/bd/mpsoc_preset/sim/mpsoc_preset.v" \ "../../../../zynqmpsoc.srcs/sources_1/imports/hdl/mpsoc_preset_wrapper.v" \ "../../../../zynqmpsoc.srcs/sim_1/imports/mpsoc_preset/mpsoc_tb.v" \ # compile glbl module verilog xil_defaultlib "glbl.v" # Do not sort compile order nosort
次は、xvhdl コマンドにてVHDL関連のファイルをコンパイルしています。tb_vhdl.prj (下記)ファイルにて、必要なファイルを指定しています。3つのファイル(IP)がVHDLのようです。このファイルでも nosort コマンドを使って、ファイルの読み込む順番を保つようにしています。xhdl.log は xvhdl コマンドのログファイルです。
# compile vhdl design source files
vhdl xil_defaultlib \
"../../../../zynqmpsoc.ip_user_files/bd/mpsoc_preset/ip/mpsoc_preset_axi_bram_ctrl_0_0/sim/mpsoc_preset_axi_bram_ctrl_0_
0.vhd" \
"../../../../zynqmpsoc.ip_user_files/bd/mpsoc_preset/ip/mpsoc_preset_axi_gpio_0_0/sim/mpsoc_preset_axi_gpio_0_0.vhd" \
"../../../../zynqmpsoc.ip_user_files/bd/mpsoc_preset/ip/mpsoc_preset_rst_ps8_0_100M_0/sim/mpsoc_preset_rst_ps8_0_100M_0.
vhd" \
# Do not sort compile order
nosort
elabrate
elaborate.sh にて、エラボレーションを行います。elaborate.log がログファイルです。xelab コマンドにいろいろな引数を渡し、snapshot として、tb_behav (--snapshot tb_behav) を生成しています。
#!/bin/bash -f # **************************************************************************** # Vivado (TM) v2022.1 (64-bit) # # Filename : elaborate.sh # Simulator : Xilinx Vivado Simulator # Description : Script for elaborating the compiled design # # Generated by Vivado on Mon Jul 18 12:08:19 JST 2022 # SW Build 3526262 on Mon Apr 18 15:47:01 MDT 2022 # # IP Build 3524634 on Mon Apr 18 20:55:01 MDT 2022 # # usage: elaborate.sh # # **************************************************************************** set -Eeuo pipefail # elaborate design echo "xelab --incr --debug typical --relax --mt 8 -L xil_defaultlib -L axi_bram_ctrl_v4_1_6 -L blk_mem_gen_v8_4_5 -L axi _lite_ipif_v3_0_4 -L lib_cdc_v1_0_2 -L interrupt_control_v3_1_4 -L axi_gpio_v2_0_28 -L generic_baseblocks_v2_1_0 -L axi_ infrastructure_v1_1_0 -L axi_register_slice_v2_1_26 -L fifo_generator_v13_2_7 -L axi_data_fifo_v2_1_25 -L axi_crossbar_v 2_1_27 -L axi_protocol_converter_v2_1_26 -L axi_clock_converter_v2_1_25 -L axi_dwidth_converter_v2_1_26 -L proc_sys_rese t_v5_0_13 -L axi_vip_v1_1_12 -L zynq_ultra_ps_e_vip_v1_0_12 -L uvm -L xilinx_vip -L unisims_ver -L unimacro_ver -L secur eip -L xpm --snapshot tb_behav xil_defaultlib.tb xil_defaultlib.glbl -log elaborate.log" xelab --incr --debug typical --relax --mt 8 -L xil_defaultlib -L axi_bram_ctrl_v4_1_6 -L blk_mem_gen_v8_4_5 -L axi_lite_ ipif_v3_0_4 -L lib_cdc_v1_0_2 -L interrupt_control_v3_1_4 -L axi_gpio_v2_0_28 -L generic_baseblocks_v2_1_0 -L axi_infras tructure_v1_1_0 -L axi_register_slice_v2_1_26 -L fifo_generator_v13_2_7 -L axi_data_fifo_v2_1_25 -L axi_crossbar_v2_1_27 -L axi_protocol_converter_v2_1_26 -L axi_clock_converter_v2_1_25 -L axi_dwidth_converter_v2_1_26 -L proc_sys_reset_v5_0 _13 -L axi_vip_v1_1_12 -L zynq_ultra_ps_e_vip_v1_0_12 -L uvm -L xilinx_vip -L unisims_ver -L unimacro_ver -L secureip -L xpm --snapshot tb_behav xil_defaultlib.tb xil_defaultlib.glbl -log elaborate.log
elaborate.log の最後で、tb_behv という名前の snapshot が生成されたことがわかります。
Built simulation snapshot tb_behav
この snapshot は、xsim.dir/tb_behav の下に生成され、xsimk というファイルが snapshot になります。
simulate
simulate.sh は次のような内容になっています。simulate.log は、simulate.sh の実行時のログファイルです。xsim コマンドで xelab コマンドで生成した shapshot (tb_behav) を使ってシミュレーションを行っています。
xsim tb_behav -key {Behavioral:sim_1:Functional:tb} -tclbatch tb.tcl -protoinst "protoinst_files/mpsoc_preset.protoinst" -log simulate.log
#!/bin/bash -f # **************************************************************************** # Vivado (TM) v2022.1 (64-bit) # # Filename : simulate.sh # Simulator : Xilinx Vivado Simulator # Description : Script for simulating the design by launching the simulator # # Generated by Vivado on Mon Jul 18 12:13:07 JST 2022 # SW Build 3526262 on Mon Apr 18 15:47:01 MDT 2022 # # IP Build 3524634 on Mon Apr 18 20:55:01 MDT 2022 # # usage: simulate.sh # # **************************************************************************** set -Eeuo pipefail # simulate design echo "xsim tb_behav -key {Behavioral:sim_1:Functional:tb} -tclbatch tb.tcl -protoinst "protoinst_files/mpsoc_preset.prot oinst" -log simulate.log" xsim tb_behav -key {Behavioral:sim_1:Functional:tb} -tclbatch tb.tcl -protoinst "protoinst_files/mpsoc_preset.protoinst" -log simulate.log
シミュレーション時のコマンドファイルは、tb.tcl で、-tclbatch オプションで指定されています。波形ファイルのコンフィグレーションをチェックし、波形ダンプするときは波形を追加しています。そうでないときはワーニングを表示します。その後、1000 ns 実行します。
前回、波形表示がおかしかったのは、この run 1000ns のためです。1000ns だと、まだリセットが終わる前の状態でした。
set curr_wave [current_wave_config] if { [string length $curr_wave] == 0 } { if { [llength [get_objects]] > 0} { add_wave / set_property needs_save false [current_wave_config] } else { send_msg_id Add_Wave-1 WARNING "No top level signals found. Simulator will start without a wave window. If you want to open a wave window go to 'File->New Waveform Configuration' or type 'create_wave_config' in the TCL console." } } run 1000ns
波形ダンプファイルは、 tb_behav.wdb です。こちらの波形ダンプファイルを xsim を使って表示するには、下記のように -gui オプションにて波形ダンプファイルをしていするだけです。
xsim -gui tb_behav.wdb
おわりに
今回は、Run Behaviral Simulation にて生成された各ファイルをみてみました。
次回は、Zynq MPSoC VIP の各コマンドにういて、詳しくみてみます。