はじめに
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
をみてみました。