Vengineerの妄想(準備期間)

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

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

はじめに

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 の引数を変えることで何が発生するかをみてみました。