はじめに
Xilinx ZynqMP SoC VIP の中を調べる(その7)
今回は、zynq_ultra_ps_e_vip_v1_0_12_apis.sv の中を ちょっと違うmemory 関連について見ていきます。
memory 関連のAPIとは?
Zynq Ultrascale+ MPSoC VIP の中にはDDRとOCMのメモリが内部にあります。これらのメモリにアクセスするために 色々なAPI があります。
まずは、普通にメモリにアクセスする API です。read_memory と write_memory です。
- read_memory
- write_memory
read_memory は task で、3つの引数、start_addr, no_of_bytes , data があります。start_addr は開始アドレス、no_of_bytes は転送するサイズ(バイト)、data はデータ です。data は出力です。
task automatic read_mem; input [addr_width-1:0] start_addr; input [max_burst_bytes_width :0] no_of_bytes; output[max_burst_bits-1 :0] data;
write_memory は task で、3つの引数、data, tart_addr, no_of_bytes があります。data はデータ、start_addr は開始アドレス、no_of_bytes は転送するサイズ(バイト)です。何故か?data の順番が違います。
task automatic write_mem; input [max_burst_bits-1 :0] data; input [addr_width-1:0] start_addr; input [max_burst_bytes_width:0] no_of_bytes;
pre_load_mem は、start_addr に開始アドレス、no_of_bytes で転送するサイズ(バイト)に対して、data_type[1:0] で指定したデータを設定します。data_type[1:0] に関しては、ドキュメント に次のように書いてあります。00 または 11 は ランダム、01 は "0"、10 は "1" のようです。
[1:0] data_type: 00 - Random 01 - Zeros 10 - Ones 11 - Random
task automatic pre_load_mem; input [1:0] data_type; input [addr_width-1:0] start_addr; input [int_width-1:0] no_of_bytes;
ファイルを使って、メモリを設定したり、メモリの状態をファイルにダンプすることができます。
- pre_load_mem_from_file
- peek_mem_to_file
pre_load_mem_from_file は、file_name のファイルの中のデータを start_addr でした開始アドレスから no_of_bytes のサイズ分、設定します。ファイル内のデータ並びは、ドキュメントには、
Num lines: Number of lines (each row should match 32 bits)
とあります。つまり、1行に32ビットのデータを書くことになります。
task automatic pre_load_mem_from_file; input [(max_chars*16)-1:0] file_name; input [addr_width-1:0] start_addr; input [int_width-1:0] no_of_bytes;
peek_mem_to_file は、start_addr でした開始アドレスから no_of_bytes のサイズ分、を file_name のファイルにダンプします。ダンプされるデータは、pre_load_mem_from_file と同じ
task automatic peek_mem_to_file; input [(max_chars*8)-1:0] file_name; input [addr_width-1:0] start_addr; input [int_width-1:0] no_of_bytes;
Num lines: Number of lines (each row should match 32 bits)
とあります。つまり、1行に32ビットのデータを書くことになります。
wait_mem_update という API は、address に何かデータが書き込まれるまでウエイトするというものです。
task automatic wait_mem_update; input[addr_width-1:0] address; input[data_width-1:0] data_in; output[data_width-1:0] data_out;
ドキュメントには、下記のようにあります。data_in を指定することで期待値を指定できます。期待値とマッチすればいいのですが、マッチしないと、fatal error になり、シミュレーションが止まるようです。
Use this API to poll for a specific location. This is a blocking task to poll for a write to a specific location. Data written can either match a specific value or a new value. If the value does not match the expected data pattern, then a fatal error is issued and the simulation halts. Only one instance of this API is used at a time.
今回は、メモリ関連の
- read_memory
- write_memory
- pre_load_mem
- pre_load_mem_from_file
- peek_mem_to_file
- wait_mem_update
について、見てみました。