FC2カウンター FPGAの部屋 Vivado シミュレータでDPI-C を使用してZynq VIPを使う3

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Vivado シミュレータでDPI-C を使用してZynq VIPを使う3

Vivado シミュレータでDPI-C を使用してZynq VIPを使う2”の続き。

前回は、コンパイルとエラボレートを行った。今回はいよいよxsim を走らせて、シミュレーション波形を出してみよう。

最初に、simulate.sh を開いて編集する。xsim のコマンドラインに -g を追加した。GUI を上げるためのオプションだ。
DPI_examples_26_170813.png

tb.tcl を開いて編集した。 run 1000 ns を run all に変更した。
DPI_examples_27_170813.png

.simulate.sh を実行した。
DPI_examples_34_170813.png

xsim のGUI が上がって、波形が表示された。
DPI_examples_28_170813.png

拡大した波形を示す。うまく行っているようだ。
DPI_examples_32_170813.png

シミュレーションを実行中の ~/Vivado/zynq_base_ex_172/zynq_base_ex_172.sim/sim_1/behav ディレクトリの内容を示す。
DPI_examples_33_170813.png

シミュレーションのログを貼っておく。

start_gui
source xsim.dir/tb_behav/xsim_script.tcl
# load_feature core
# current_fileset
INFO: [IP_Flow 19-234] Refreshing IP repositories
INFO: [IP_Flow 19-1704] No user IP repositories specified
INFO: [IP_Flow 19-2313] Loaded Vivado IP repository '/opt/Xilinx/Vivado/2017.2/data/ip'.
# xsim {tb_behav} -autoloadwcfg -tclbatch {tb.tcl} -key {Behavioral:sim_1:Functional:tb}
Vivado Simulator 2017.2
Time resolution is 1 ps
open_wave_config /home/masaaki/Vivado/zynq_base_ex_172/zynq_base_ex_172.sim/sim_1/behav/tb_behav.wcfg
source tb.tcl
## 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 all
Block Memory Generator module tb.zynq_sys.base_zynq_i.blk_mem_gen_0.inst.native_mem_mapped_module.blk_mem_gen_v8_3_6_inst is using a behavioral model for simulation which will not precisely model memory collision behavior.
XilinxAXIVIP: Found at Path: tb.zynq_sys.base_zynq_i.processing_system7_0.inst.M_AXI_GP0.master
[0] : *ZYNQ_BFM_INFO : M_AXI_GP0 : Port is ENABLED.
XilinxAXIVIP: Found at Path: tb.zynq_sys.base_zynq_i.processing_system7_0.inst.M_AXI_GP1.master
[0] : *ZYNQ_BFM_INFO : M_AXI_GP1 : Port is DISABLED.
XilinxAXIVIP: Found at Path: tb.zynq_sys.base_zynq_i.processing_system7_0.inst.S_AXI_GP0.slave
[0] : *ZYNQ_BFM_INFO : S_AXI_GP0 : Port is DISABLED.
XilinxAXIVIP: Found at Path: tb.zynq_sys.base_zynq_i.processing_system7_0.inst.S_AXI_GP1.slave
[0] : *ZYNQ_BFM_INFO : S_AXI_GP1 : Port is DISABLED.
XilinxAXIVIP: Found at Path: tb.zynq_sys.base_zynq_i.processing_system7_0.inst.S_AXI_HP0.slave
[0] : *ZYNQ_BFM_INFO : S_AXI_HP0 : Port is DISABLED.
XilinxAXIVIP: Found at Path: tb.zynq_sys.base_zynq_i.processing_system7_0.inst.S_AXI_HP1.slave
[0] : *ZYNQ_BFM_INFO : S_AXI_HP1 : Port is DISABLED.
XilinxAXIVIP: Found at Path: tb.zynq_sys.base_zynq_i.processing_system7_0.inst.S_AXI_HP2.slave
[0] : *ZYNQ_BFM_INFO : S_AXI_HP2 : Port is DISABLED.
XilinxAXIVIP: Found at Path: tb.zynq_sys.base_zynq_i.processing_system7_0.inst.S_AXI_HP3.slave
[0] : *ZYNQ_BFM_INFO : S_AXI_HP3 : Port is DISABLED.
XilinxAXIVIP: Found at Path: tb.zynq_sys.base_zynq_i.processing_system7_0.inst.S_AXI_ACP.slave
[0] : *ZYNQ_BFM_INFO : S_AXI_ACP : Port is DISABLED.
running the tb
[150] : *ZYNQ_BFM_INFO : FPGA Soft Reset called for 0x1
[150] : *ZYNQ_BFM_INFO : FPGA Soft Reset called for 0x0
[150] : M_AXI_GP0 : *ZYNQ_BFM_INFO : Starting Address(0x41200000) -> AXI Write -> 4 bytes
[1490] : M_AXI_GP0 : *ZYNQ_BFM_INFO : Done AXI Write for Starting Address(0x41200000) with Response 'OKAY'
LEDs are toggled, observe the waveform
[1490] : M_AXI_GP0 : *ZYNQ_BFM_INFO : Starting Address(0x40000000) -> AXI Write -> 4 bytes
[1790] : M_AXI_GP0 : *ZYNQ_BFM_INFO : Done AXI Write for Starting Address(0x40000000) with Response 'OKAY'
[1790] : M_AXI_GP0 : *ZYNQ_BFM_INFO : Starting Address(0x40000000) -> AXI Read -> 4 bytes
[1950] : M_AXI_GP0 : *ZYNQ_BFM_INFO : Done AXI Read for Starting Address(0x40000000) with Response 'OKAY'
1950000, running the testbench, data read from BRAM was 32'hdeadbeef
AXI VIP Test PASSED
Simulation completed


次に、2番目のWrite と Read のアドレスを 0x4000004 にしてみよう。更に、Write の delay を 500 にしてみる。
DPI_examples_39_170816.png

これで、compile.sh , elaborate.sh , simulate.sh を再実行した。波形を示す。
DPI_examples_37_170816.png

AWADDR を見ると 40000004 になっているのが分かる。更に、前のWrite のBVALID がアサートされ、ディアサートされた後から、今回のWrite のAWVALID がアサートされるまでの時間は、500.001 ns だった。正しく delay が効いているようだ。

Write の delay を 500 から 0 にしたときをもう一度、確かめてみよう。
DPI_examples_38_170816.png

前のWrite のBVALID がアサートされ、ディアサートされた後から、今回のWrite のAWVALID がアサートされるまでの時間は、20.001 ns だった。

Zynq VIP のレジスタWrite は完全にBVALID 、BRADY がアサートされたら終了なのかもしれない?複数のトランザクションを重ねることはできるのだろうか?
  1. 2017年08月16日 04:45 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/3885-946c40f7
この記事にトラックバックする(FC2ブログユーザー)