Vengineerの戯言

人生は短いけど、長いです。人生を楽しみましょう!

Xilinx ZynqMP SoC VIP の中を調べる(その3)

はじめに

Xilinx ZynqMP SoC VIP の中を調べる(その3)

今回は、左にある Simulation => RTL Simulation => Run Behavioral Simulation を実行したら、何をやっているのかをみていきます。

シミュレーション実行

zynqmpsoc.sim/sim_1/behav/xsim ディレクトリにてシミュレーションが実行されます。

生成されたファイルは、下記のようなものです。3種類(compile, elaborate, simulate) 時に使われて生成されたファイルです。

compile

  • glbl.v
  • compile.sh
  • compile.log
  • xvhdl.log
  • xvlog.log
  • tb_vhdl.prj
  • tb_vlog.prj

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 の各コマンドにういて、詳しくみてみます。