はじめに
Xilinx ZynqMP SoC VIP の中を調べる(その4)
今回は、テストベンチの tb_behav.v の中に、Zynq MPSoC VIP のコマンドを追加して、どのようなことが起こるかをみてみます。
set_debug_level_info
set_debug_level_info にて、デバッグメッセージの表示を制御してみました。デフォルトでは、1'b1 が設定されているようなので、1'b0 を設定して、compile.sh, elaborate.sh, simulate.sh を実行し、ログファイル(simulate.log) の差分を取ってみました。
tb_behav.v の 最初のpor_srstb_reset APIを呼ぶ前に、set_debug_level_info(1'b0) を追加しました。
repeat(5) @(posedge tb_ACLK); tb.mpsoc_sys.mpsoc_preset_i.zynq_ultra_ps_e_0.inst.set_debug_level_info(1'b0); tb.mpsoc_sys.mpsoc_preset_i.zynq_ultra_ps_e_0.inst.por_srstb_reset(1'b1);
ログファイル(simulate.log) の差分です。< の部分が set_debug_level_info で 0 を設定した時のログファイルで、> の部分が set_debug_level_info で 1 を設定した時のログファイルです。set_debug_level_info で 1 を設定すると、メッセージが追加されています。
5,6c5,6 < # Start of session at: Mon Jul 18 13:23:57 2022 < # Process ID: 19793 --- > # Start of session at: Mon Jul 18 13:16:24 2022 > # Process ID: 19540 82c82,88 < [510] : *ZYNQ_MPSoC_BFM_INFO : Setting Debug Level Info as 0 --- > [510] : *ZYNQ_MPSoC_BFM_INFO : Setting Debug Level Info as 1 > [510] : *ZYNQ_MPSoC_BFM_INFO : POR and STRB Reset called for 0x1 > [710] : *ZYNQ_MPSoC_BFM_INFO : POR and STRB Reset called for 0x0 > [710] : *ZYNQ_MPSoC_BFM_INFO : FPGA Soft Reset called for 0x1 > [2710] : *ZYNQ_MPSoC_BFM_INFO : POR and STRB Reset called for 0x1 > [2710] : *ZYNQ_MPSoC_BFM_INFO : FPGA Soft Reset called for 0x0 > [4710] : M_AXI_HPM0_FPD : *ZYNQ_MPSoC_BFM_INFO : Starting Address(0xa0000000) -> AXI Write -> 4 bytes 83a90,92 > [5185] : M_AXI_HPM0_FPD : *ZYNQ_MPSoC_BFM_INFO : Done AXI Write for Starting Address(0xa0000000) with Response 'OKAY' > [5385] : M_AXI_HPM0_FPD : *ZYNQ_MPSoC_BFM_INFO : Starting Address(0xa0000000) -> AXI Read -> 4 bytes > [5715] : M_AXI_HPM0_FPD : *ZYNQ_MPSoC_BFM_INFO : Done AXI Read for Starting Address(0xa0000000) with Response 'OKAY' 84a94 > [5915] : M_AXI_HPM0_FPD : *ZYNQ_MPSoC_BFM_INFO : Starting Address(0xa0010000) -> AXI Write -> 4 bytes 85a96,98 > [6195] : M_AXI_HPM0_FPD : *ZYNQ_MPSoC_BFM_INFO : Done AXI Write for Starting Address(0xa0010000) with Response 'OKAY' > [6395] : M_AXI_HPM0_FPD : *ZYNQ_MPSoC_BFM_INFO : Starting Address(0xa0010000) -> AXI Read -> 4 bytes > [6515] : M_AXI_HPM0_FPD : *ZYNQ_MPSoC_BFM_INFO : Done AXI Read for Starting Address(0xa0010000) with Response 'OKAY' 90c103 < quit --- > quit 103c116 < INFO: [Common 17-206] Exiting xsim at Mon Jul 18 13:24:38 2022... --- > INFO: [Common 17-206] Exiting xsim at Mon Jul 18 13:16:46 2022...
下記の部分でGPIO へアクセスしています。
[4710] (ns)で、0xa0000000 への 4バイトライトサイクルが開始され、[5185] (ns) で Respose "OKAY" が返ってきています。
[5385] (ns)で、0xa0000000 への4バイトリードサイクルが開始され、[5715] (ns) で Respose "OKAY" が返ってきています。
> [4710] : M_AXI_HPM0_FPD : *ZYNQ_MPSoC_BFM_INFO : Starting Address(0xa0000000) -> AXI Write -> 4 bytes 83a90,92 > [5185] : M_AXI_HPM0_FPD : *ZYNQ_MPSoC_BFM_INFO : Done AXI Write for Starting Address(0xa0000000) with Response 'OKAY' > [5385] : M_AXI_HPM0_FPD : *ZYNQ_MPSoC_BFM_INFO : Starting Address(0xa0000000) -> AXI Read -> 4 bytes > [5715] : M_AXI_HPM0_FPD : *ZYNQ_MPSoC_BFM_INFO : Done AXI Read for Starting Address(0xa0000000) with Response 'OKAY'
下記の部分でBlockRAM へアクセスしています。
[5915 (ns)で、0xa0010000 への 4バイトライトサイクルが開始され、[6195] (ns) で Respose "OKAY" が返ってきています。
[6395] (ns)で、0xa0010000 への4バイトリードサイクルが開始され、[6515] (ns) で Respose "OKAY" が返ってきています。
> [5915] : M_AXI_HPM0_FPD : *ZYNQ_MPSoC_BFM_INFO : Starting Address(0xa0010000) -> AXI Write -> 4 bytes 85a96,98 > [6195] : M_AXI_HPM0_FPD : *ZYNQ_MPSoC_BFM_INFO : Done AXI Write for Starting Address(0xa0010000) with Response 'OKAY' > [6395] : M_AXI_HPM0_FPD : *ZYNQ_MPSoC_BFM_INFO : Starting Address(0xa0010000) -> AXI Read -> 4 bytes > [6515] : M_AXI_HPM0_FPD : *ZYNQ_MPSoC_BFM_INFO : Done AXI Read for Starting Address(0xa0010000) with Response 'OKAY'
Zynq MPSoC VIP はどこにある?
Zynq MPSoC VIP は、下記のディレクトリにあります。
data/ip/xilinx/zynq_ultra_ps_e_vip_v1_0
zynq_ultra_ps_e_vip_v1_0_vl_rfs.sv: の中の zynq_ultra_ps_e_vip_v1_0_12 が VIP のようです。
APIは、zynq_ultra_ps_e_vip_v1_0_12_apis.sv の中で定義されていて、このファイルを `include で取り込んでいます。
set_debug_level_info は?
set_debug_level_info は、zynq_ultra_ps_e_vip_v1_0_12_apis.sv の中で次のように定義されています。各ポートの DEBUG_INFO パラメータに set_debug_level_info の引数であるLEVELが設定されています。
/* API for setting the Message verbosity */ task automatic set_debug_level_info; input LEVEL; begin $display("[%0d] : %0s : Setting Debug Level Info as %0b",$time, DISP_INFO, LEVEL); DEBUG_INFO = LEVEL; M_AXI_HPM0_FPD.DEBUG_INFO = LEVEL; M_AXI_HPM1_FPD.DEBUG_INFO = LEVEL; M_AXI_HPM0_LPD.DEBUG_INFO = LEVEL; S_AXI_HPC0_FPD.DEBUG_INFO = LEVEL; S_AXI_HPC1_FPD.DEBUG_INFO = LEVEL; S_AXI_HP0_FPD.DEBUG_INFO = LEVEL; S_AXI_HP1_FPD.DEBUG_INFO = LEVEL; S_AXI_HP2_FPD.DEBUG_INFO = LEVEL; S_AXI_HP3_FPD.DEBUG_INFO = LEVEL; S_AXI_HPM0_LPD.DEBUG_INFO = LEVEL; S_AXI_ACP.DEBUG_INFO = LEVEL; S_AXI_ACE.DEBUG_INFO = LEVEL; end endtask
set_verbosity
set_verbosity API を使おうとしましたが、コンパイルエラーになりました。、zynq_ultra_ps_e_vip_v1_0_12_apis.sv の中にもないので、どこかで仕様がかわったのでしょうか?
その他のAPI
ドキュメントには載っていませんが、zynq_ultra_ps_e_vip_v1_0_12_apis.sv には、以下のようなAPIがあるようです。
- set_stop_on_err
- set_channel_level_info
- set_function_level_info
また、ドキュメントには、各APIの引数が明記されていませんので、実際にこれらAPIを使うときは、zynq_ultra_ps_e_vip_v1_0_12_apis.sv の中を確認して、引数を設定する必要がありますね。
おわりに
今回は、Zynq MPSoC VIP の set_debug_level_info の引数を変えることで何が発生するかをみてみました。