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