読み出しデータの受信方法 - 1.1 日本語

AXI Verification IP v1.1 LogiCORE IP 製品ガイド (PG267)

Document ID
PG267
Release Date
2017-10-04
Version
1.1 日本語

読み出しデータを取得する方法には次の 2 つがあります。

マスター エージェントの読み出しドライバーから受信する方法 ( *mst_stimulus.sv ファイルの driver_rd_data_method_one driver_rd_data_method_two を参照)。

VIP のモニターから取得する方法 ( *exdes_generic.sv ファイルの monitor_rd_data_method_one monitor_rd_data_method_two を参照)。

モニターからデータを受信するには、次の手順を実行します。

1. item_collected_port からモニター トランザクションを取得します。この例では、マスター エージェントから取得します。

2. モニター トランザクションで cmd タイプが XIL_AXI_READ の場合、 get_data_beat get_data_block を使用して読み出しデータを取得します。

モニター トランザクションで cmd タイプが XIL_AXI_WRITE の場合、 get_data_beat get_data_block を使用して書き込みデータを取得します。 monitor_rd_data_method_one は、モニター トランザクションからデータ ビートを受信する方法を示しています。 monitor_rd_data_method_two は、モニター トランザクションからデータ ブロックを受信する方法を示しています。

読み出しドライバーからデータを受信するには、次の手順を実行します。

1. マスター エージェントの読み出しドライバーを使用して読み出しトランザクション ハンドルを作成します。

2. 読み出しトランザクションをランダム化します。特定の読み出しコマンドを生成する場合は、 axi_transaction クラスの API を使用してアドレスやバースト長などを設定するか、特定の値でトランザクションをランダム化します。

3. 読み出しトランザクションの driver_return_item_policy を次のいずれかの値に設定します。

XIL_AXI_PAYLOAD_RETURN または XIL_AXI_CMD_PAYLOAD_RETURN

4. 読み出しドライバーを使用して読み出しトランザクションを送出します。

5. 読み出しドライバーを使用して応答を待ちます。

6. get_data_beat / get_data_block を使用して、応答トランザクションからのデータを検査します。
driver_rd_data_method_one は、読み出しドライバーからデータ ビートを取得する方法を示しています。
driver_rd_data_method_two は、読み出しドライバーからデータ ブロックを取得する方法を示しています。

注記: API get_data_beat : get_data_beat は、指定したビートの値を返します。常に 1024 ビットを返します。上位バイトを下位バイトに揃え、未使用バイトを 0 に設定します。

これは必ずしも RDATA の表現とは一致しません。データ幅が 32 ビットでトランザクションがサブサイズ バースト (この例では 1B) の場合、有効なのは get_data_beat の最後のバイトのみです。これは物理バスとは大きく異なります。

get_data_bit             Physical Bus

1024  ...      0          32        0

----------------         -----------

|             X| |        X|

|             X| |      X  |

|             X| |    X    |

|             X| | X       |

----------------         -----------

注記: API get_data_block : get_data_block は、トランザクションに対して 4K バイトのペイロードを返します。これは必ずしも RDATA の表現とは一致しません。データ幅が 32 ビットでトランザクションがサブサイズ バースト (この例では 1B) の場合、上位バイトを下位バイトに揃え、未使用バイトを 0 に設定します。

get_data_block          Physical Bus

32    ...      0         32        0

0 ----------------         -----------

| D   C   B   A| |        A|

| 0   0   0   0| |      B  |

| 0   0   0   0| |    C    |

| 0   0   0   0| | D       |

| 0   0   0   0|          -----------

| 0   0   0   0|

1k----------------

task monitor_rd_data_method_one(input axi_monitor_transaction updated);

xil_axi_data_beat                       mtestDataBeat[];

mtestDataBeat = new[updated.get_len()+1];

for( xil_axi_uint beat=0; beat<updated.get_len()+1; beat++) begin

mtestDataBeat[beat] = updated.get_data_beat(beat);

//  $display(" Read data from Monitor: beat index %d, Data beat %h", beat, mtestDataBeat[beat]);

end

endtask

task monitor_rd_data_method_two(input axi_monitor_transaction updated);

bit[8*4096-1:0]                         data_block;

data_block = updated.get_data_block();

// $display(" Read data from Monitor: Block Data %h ", data_block);

endtask

task driver_rd_data_method_one();

axi_transaction                         rd_transaction;

xil_axi_data_beat                       mtestDataBeat[];

rd_transaction = agent.rd_driver.create_transaction("read transaction with randomization");

RD_TRANSACTION_FAIL_1a:assert(rd_transaction.randomize());

rd_transaction.set_driver_return_item_policy(XIL_AXI_PAYLOAD_RETURN);

agent.rd_driver.send(rd_transaction);

agent.rd_driver.wait_rsp(rd_transaction);

mtestDataBeat = new[rd_transaction.get_len()+1];

for( xil_axi_uint beat=0; beat<rd_transaction.get_len()+1; beat++) begin

mtestDataBeat[beat] = rd_transaction.get_data_beat(beat);

//   $display("Read data from Driver: beat index %d, Data beat %h ", beat, mtestDataBeat[beat]);

end

endtask

task driver_rd_data_method_two();

axi_transaction                         rd_transaction;

bit[8*4096-1:0]                         data_block;

rd_transaction = agent.rd_driver.create_transaction("read transaction with

randomization");

RD_TRANSACTION_FAIL_1a:assert(rd_transaction.randomize());

rd_transaction.set_driver_return_item_policy(XIL_AXI_PAYLOAD_RETURN);

agent.rd_driver.send(rd_transaction);

agent.rd_driver.wait_rsp(rd_transaction);

data_block = rd_transaction.get_data_block();

// $display("Read data from Driver: Block Data %h ", data_block);

endtask

詳細は、Vivado サンプル デザインの simset sim_adv_mst_active_* を参照してください。