API/疑似コード - 2022.1 日本語

Vitis 統合ソフトウェア プラットフォームの資料: アプリケーション アクセラレーション開発 (UG1393)

Document ID
UG1393
Release Date
2022-05-25
Version
2022.1 日本語

API/疑似コードの場合、トランザクション全体に AXI4 メモリ マップ トランザクションの単一インスタンスが使用されます。これは、ザイリンクス SystemC モジュールでペイロードがどのように使用されているかに対応します。AXI4 マスターの場合は、b_transport(aximm_packet) API があります。呼び出しの後、aximm_packetAXI4 スレーブによって指定された応答で更新されます。AXI4 スレーブの場合は、sample_transaction() API と send_response(aximm_packet) API があります。

次のコード部分は、C++ のコンテキストでの API の使用方法を示しています。

  • C++ マスターのコード部分:
    auto payload = generate_random_transaction(); //Custom Random transaction generator. Users can configure AXI propeties on the payload.
    /* Or User can set the AXI transaction properties as follows
    payload->set_addr(std::rand() * 4);
    payload->set_len(1 + (std::rand() % 255));
    payload->set_size(1 << (std::rand() % 3));
    */
     
    master_uti.b_transport(*payload.get(), std::rand() % 0x10); //A blocking call. Response will be updated in the same payload. Each AXI MM transaction will use same payload for whole transaction
    std::cout << "-----------Transaction Response------------" << std::endl;
    std::cout << *payload << std::endl; //Prints AXI transaction info
  • C++ スレーブのコード部分:
    auto& payload = slave_util.sample_transaction(); // Sample the transaction
     
    //If it is read transaction, give read data
    if(payload.cmd() == xtlm_ipc::aximm_packet_command_READ)
    {
        rd_resp.resize(payload.len()*payload.size());
        std::generate(rd_resp.begin(), rd_resp.end(), []()
        {   return std::rand()%0x100;});
    }
     
    //Set AXI response (for Read & Write)
    payload.set_resp(std::rand()%4);
    slave_util.send_response(payload); //Send the response to the master

次のコード部分は、Python のコンテキストでの API の使用方法を示しています。

次のように、PYTHONPATH を設定する必要があります。

  • たとえば、C シェルでは次のようになります。
    setenv PYTHONPATH $XILINX_VIVADO/data/emulation/hw_em/lib/python: $XILINX_VIVADO/data/emulation/ip_utils/xtlm_ipc/xtlm_ipc_v1_0/python
  • Python マスターのコード部分:
    aximm_payload = xtlm_ipc.aximm_packet()
    random_packet(aximm_payload) # Custom function to set AXI Properties randomly
    #Or user can set AXI properties as required
    #aximm_payload.addr = int(random.randint(0, 1000000)*4)
    #aximm_payload.len = random.randint(1, 64)
    #aximm_payload.size = 4
     
    master_util.b_transport(aximm_payload)
    #After this call aximm_payload will have updated response as set by the AXI Slave.
  • Python スレーブのコード部分:
    aximm_payload = slave_util.sample_transaction()
    aximm_payload.resp = random.randint(0,3)
    if not aximm_payload.cmd: #if it is a read transction set Random data
        tot_bytes = aximm_payload.len * aximm_payload.size
        for i in range(0, int(tot_bytes/SIZE_OF_EACH_DATA_IN_BYTES)):
            aximm_payload.data += bytes(bytearray(struct.pack(">I", random.randint(0,60000)))) # Binary data should be aligned with C struct
             
    slave_util.send_resp(aximm_payload)