Posted at

ModelSimでVivado IPをシミュレーションする方法

タイトル通りModelSimを使ったVivado IPのコンパイル方法です。

ModelSim以外にもSynopsys VCS(VCSMX)やCadence NC-Verilog等のシミュレータでも同じ方法でいけます。


環境

今回は無償で使えるModelSim-Altera Starter Editionを使って解説します。

またVivadoの操作はGUIでの解説をしていますがもちろんTCLコマンドからでも同じようにできます。


適当なIPを生成する

IP Catalogから適当なIPを生成します。

今回は"AXI Uartlite"を生成しました。

生成したIPのディレクトを覗くと下記のようになってるかと思います。

.

└── axi_uartlite_0
├── axi_uartlite_0_board.xdc
├── axi_uartlite_0_ooc.xdc
├── axi_uartlite_0.veo
├── axi_uartlite_0.vho
├── axi_uartlite_0.xci
├── axi_uartlite_0.xdc
├── axi_uartlite_0.xml
├── doc
│   └── axi_uartlite_v2_0_changelog.txt
├── hdl
│   ├── axi_lite_ipif_v3_0_vh_rfs.vhd
│   ├── axi_uartlite_v2_0_vh_rfs.vhd
│   ├── lib_cdc_v1_0_rfs.vhd
│   ├── lib_pkg_v1_0_rfs.vhd
│   └── lib_srl_fifo_v1_0_rfs.vhd
├── sim
│   └── axi_uartlite_0.vhd
└── synth
└── axi_uartlite_0.vhd

シミュレーションに必要なRTLはsim/にあります。


試しにコンパイルしてみる

ターゲットはVHDLなのでvcomでコンパイルします。VerilogHDLならvlogです。

$ vcom project_1/project_1.srcs/axi_uartlite_0/sim/axi_uartlite_0.vhd

するとライブラリがないとエラーがでます。

** Error: project_1/project_1.srcs/sources_1/ip/axi_uartlite_0/sim/axi_uartlite_0.vhd(56): (vcom-1598) Library "axi_uartlite_v2_0_23" not found.

** Error: project_1/project_1.srcs/sources_1/ip/axi_uartlite_0/sim/axi_uartlite_0.vhd(57): (vcom-1136) Unknown identifier "axi_uartlite_v2_0_23".
** Error: project_1/project_1.srcs/sources_1/ip/axi_uartlite_0/sim/axi_uartlite_0.vhd(59): VHDL Compiler exiting
End time: 11:52:39 on Nov 08,2019, Elapsed time: 0:00:00
Errors: 3, Warnings: 0


ModelSim用のライブラリを作成

出力されたエラーにはaxi_uartlite_v2_0_23がないと出ますが実際には他にも必要があります。

この必要なライブラリはVivadoのcompile_simlibを使って生成できます。

Tools > Compile Simulation Libraries...をクリックすると設定画面がでます。

SimulatorはModelSimが選択を選択します。

AdvancedのCompile Xilinx IPにチェックを入れCompileをクリックしライブラリを生成します。

いくつかのライブラリに関してはModelSimのバージョンが古いため失敗します。

01_msim.PNG

しばらくすると{project_name}.cache/compile_simlib/modelsim/

大量のシミュレーション用ライブラリが生成されます。


VivadoからModelSimを実行する

VivadoのSettingsを開き、Simulation > Target simulatorからModelSimを選択します。

02_msim.PNG

Simulation Sourcesで生成したIPがTOPに選択されていることを確認し、

SIMULATION > Run Simulationを実行します。

成功するとModelSimが立ち上がります。邪魔なので閉じます。


検証環境に組み込むには

実際に検証環境に組み込む場合は必要なライブラリをコピーして使うといいと思います。

VivadoからModelSimを実行すると{project_name}.sim/sim_1/

コンパイルとシミュレーションそれぞれのスクリプトが生成されます。

.

└── sim_1
└── behav
└── modelsim
├── axi_uartlite_0_compile.do ←これ
├── axi_uartlite_0_simulate.do ←とこれ
├── axi_uartlite_0.udo
├── axi_uartlite_0_wave.do
├── compile.log
├── compile.sh
├── modelsim.ini
├── modelsim_lib
│   ├── msim
│   │   ├── _info
│   │   └── xil_defaultlib
│   │   ├── _info
│   │   ├── _lib1_0.qdb
│   │   ├── _lib1_0.qpg
│   │   ├── _lib1_0.qtl
│   │   ├── _lib.qdb
│   │   └── _vmake
│   └── work
│   └── _info
└── simulate.sh

axi_uartlite_0_simulate.doを開き-Lオプションで指定されるものが必要なライブラリになります。

axi_uartlite_0_simulate.doを参考にコンパイルスクリプトを作成します。

今回は必要ありませんが、VerilogHDLを含むIPではglblが必要な場合があります。

glblVivado/version/data/verilog/src/glbl.vをコンパイルします。

またvsimを実行する際には-Lオプションでライブラリを指定する必要があります。


compile.sh

vlib work

vmap axi_lite_ipif_v3_0_4 /path/to/simlib_dir/axi_lite_ipif_v3_0_4
vmap lib_pkg_v1_0_2 /path/to/simlib_dir/lib_pkg_v1_0_2
vmap lib_srl_fifo_v1_0_2 /path/to/simlib_dir/lib_srl_fifo_v1_0_2
vmap lib_cdc_v1_0_2 /path/to/simlib_dir/lib_cdc_v1_0_2
vmap axi_uartlite_v2_0_23 /path/to/simlib_dir/axi_uartlite_v2_0_23
vmap secureip /path/to/simlib_dir/secureip
vmap xpm /path/to/simlib_dir/xpm

vcom /path/to/axi_uartlite_0/sim/axi_uartlite_0.vhd

vlog /path/to/Vivado/${vivado_version}/data/verilog/src/glbl.v

vsim -c -voptargs="+acc" \
-L axi_lite_ipif_v3_0_4 \
-L lib_pkg_v1_0_2 \
-L lib_srl_fifo_v1_0_2 \
-L lib_cdc_v1_0_2 \
-L axi_uartlite_v2_0_23 \
-L secureip \
-L xpm \
glbl \
${top_model} \
-do "run -all ; quit"



おわりに

今回はModelSimでやりましたが冒頭でも書いたように他のシミュレータでも同じやり方でいけます。

ただし例えばVCSですとsynopsys.setupにすべてのライブラリがマッピングされているため

何が必要なライブラリかひと目でわかりません。

なので一度ModelSimとかで必要なライブラリを確認するといいと思います。


参考