Vengineerの戯言

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

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

はじめに

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

について、見てみました。