読み出しデータを取得する方法には次の 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_* を参照してください。