Vengineerの戯言

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

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

はじめに

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

今回は、AXI-Master 関連のAPIを見ていきます

AXI-Master API とは?

Zynq Ultrascale+ MPSoC には、AXI Master port があります。この AXI Master port へのトランザクションを発生するのが AXI Master API です。

  • read_data
  • write_data
  • read_from_file
  • write_from_file

read_data APIは、リードトランザクションを発生します。start_addrが開始アドレス、rd_size は転送サイズ、rd_data がリードデータ、respose はステータスです。

 task automatic read_data;
   input [addr_width-1:0] start_addr;
   input [max_transfer_bytes_width:0] rd_size;
   output[(max_transfer_bytes*8)-1:0] rd_data;
   output [axi_rsp_width-1:0] response;

write_data APIは、ライト、トランザクションを発生します。start_addrが開始アドレス、wr_size は転送サイズ、wr_data がライトデータ、respose はステータスです。

 task automatic write_data;
   input [addr_width-1:0] start_addr;
   input [max_transfer_bytes_width:0] wr_size;
   input [(max_transfer_bytes*8)-1:0] w_data;
   output [axi_rsp_width-1:0] response;

read_to_file は、read_data に対して、リードデータを file_name で指定したファイルにダンプします。ドキュメントによると、

Num lines: Number of lines (each row should match 32 bits)

とあります。

 task automatic read_to_file;
   input [(max_chars*8)-1:0] file_name;
   input [addr_width-1:0] start_addr;
   input [int_width-1:0] rd_size;
   output [axi_rsp_width-1:0] response;

write_from_file は、rwrite_data に対して、ライトデータを file_name で指定したファイルから読み出します。ドキュメントによると、

Num lines: Number of lines (each row should match 32 bits)

とあります。

 task automatic write_from_file;
   input [(max_chars*8)-1:0] file_name;
   input [addr_width-1:0] start_addr;
   input [int_width-1:0] wr_size;
   output [axi_rsp_width-1:0] response;

AXI の burst transaction への API としては、下記の4つがあります。read_burst と write_burst は普通の burst transaction です。write_burst_concurrent と write_burst_strb は、ドキュメントに、This is hook to call the AXI VIP API.とあります。ちょっと凝ったアクセスをしたいときに使うようです。

  • read_burst
  • write_burst
  • write_burst_concurrent
  • write_burst_strb
 task automatic read_burst;
   input [addr_width-1:0] start_addr;
   input [axi_len_width-1:0] len;
   input [axi_size_width-1:0] siz;
   input [axi_brst_type_width-1:0] burst;
   input [axi_lock_width-1:0] lck;
   input [axi_cache_width-1:0] cache;
   input [axi_prot_width-1:0] prot;
   output [(axi_max_mdata_width*axi_burst_len)-1:0] data;
   output [(axi_rsp_width*axi_burst_len)-1:0] response;
 task automatic write_burst(
    input [addr_width-1:0] start_addr,
    input [axi_len_width-1:0] len,
    input [axi_size_width-1:0] siz,
    input [axi_brst_type_width-1:0] burst,
    input [axi_lock_width-1:0] lck,
    input [axi_cache_width-1:0] cache,
    input [axi_prot_width-1:0] prot,
    input [(axi_max_mdata_width*axi_burst_len)-1:0] data,
    input integer datasize, 
    output [axi_rsp_width-1:0] response
    );
 task automatic write_burst_strb(
    input [addr_width-1:0] start_addr,
    input [axi_len_width-1:0] len,
    input [axi_size_width-1:0] siz,
    input [axi_brst_type_width-1:0] burst,
    input [axi_lock_width-1:0] lck,
    input [axi_cache_width-1:0] cache,
    input [axi_prot_width-1:0] prot,
    input [(axi_max_mdata_width*axi_burst_len)-1:0] data,
    input strb_en,input [(axi_mgp_data_width*axi_burst_len)/8-1:0] strb,
    input integer datasize, 
    output [axi_rsp_width-1:0] response
    );
 task automatic write_burst_concurrent(
    input [addr_width-1:0] start_addr,
    input [axi_len_width-1:0] len,
    input [axi_size_width-1:0] siz,
    input [axi_brst_type_width-1:0] burst,
    input [axi_lock_width-1:0] lck,
    input [axi_cache_width-1:0] cache,
    input [axi_prot_width-1:0] prot,
    input [(axi_max_mdata_width*axi_burst_len)-1:0] data,
    input integer datasize, 
    output [axi_rsp_width-1:0] response
    );

おわりに

今回は、AXI関連のAPIである

  • write_data
  • read_data
  • read_from_file
  • write_from_file
  • read_burst
  • write_burst
  • write_burst_concurrent
  • write_burst_strb

をみてみました。