对于 API/伪代码,将 AXI4 存储器映射传输事务的单个实例用于整个传输事务。这与赛灵思 SystemC 模块中有效载荷的使用方式相符。对于 AXI4 主接口,可使用 b_transport(aximm_packet)
API。完成调用后,将以 AXI4 从接口提供的响应来更新 aximm_packet
。对于 AXI4 从接口,可使用 sample_transaction()
和 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 Shell 上:
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)