Skip to content
STIMSMITH

AXI interface

Concept WIKI v3 · 7/11/2026

The AXI (Advanced eXtensible Interface) on-chip bus protocol is used in three verification/emulation contexts described in the evidence: (1) in the Condominium FPGA-based co-emulation framework, where hardened Zynq AXI interfaces and DPI-C-issued AXI transactions connect the PS host to PL-Shell CSRs and FIFOs for DUT control and memory access; (2) in the Zynq-Parrot / ZP Cosim emulation of BlackParrot on the Ultra96v2 board, where high-performance master and slave Zynq AXI interfaces connect the PS to DRAM, the FPGA shell, and BlackParrot's slave port; and (3) in the RISC-V multi-core system-level UVM verification environment, where AXI master/slave VIPs and a Pulp AXI crossbar exercise memory, peripheral, and DMA traffic on the CPU subsystem.

AXI interface

Overview

AXI (Advanced eXtensible Interface) is an on-chip bus protocol used to connect processor subsystems to memory, peripherals, and DMA infrastructure. The evidence describes three distinct uses of AXI:

  1. In the Condominium FPGA-based co-emulation framework, AXI provides the bridge between the Zynq Processing System (PS) host software and the Programmable Logic (PL) DUT, both via the Zynq's hardened AXI interfaces and via DPI-C transactions injected into software RTL simulation.
  2. In the Zynq-Parrot / ZP Cosim emulation of BlackParrot on the Avnet Ultra96v2 board, AXI is the on-chip bus exposed by the Zynq UltraScale+ MPSoC PS and is used in 32-bit configuration over the hardened high-performance master/slave ports to reach DRAM, the FPGA shell, and the BlackParrot slave port.
  3. In the RISC-V multi-core system-level verification environment (2025 RISC-V Summit Europe paper Verification of a RISC-V system with multiple cores), AXI is the on-chip interconnect protocol exposed by the CPU subsystem and is modelled in the UVM testbench using VIPs from the Pulp project.

Condominium: AXI between PS and PL-Shell

Zynq-based architecture

Zynq FPGA boards couple hardened ARM cores (the PS) with programmable fabric (the PL). The PS communicates with the PL over hardened AXI interfaces:

  • The PS's master ports are general-purpose (GP) AXI ports covering a small address space.
  • The PS's client (slave) ports are higher-performance (HP) AXI ports that allow the PL to directly access dedicated DDR controllers for PS DRAM, bypassing the ARM L2 cache-coherence system and avoiding PS-Linux-stack interference.

Condominium decomposes the prototyped system into these functional domains by mapping the subsystem DUT to the PL fabric while leveraging PS software for memory access, peripheral modelling, and emulation configuration. Compared with PCIe tunnels, hardened Zynq AXI interfaces provide direct and low-latency access to design peripherals such as host DRAM, supporting high-performance emulation of designs that require low-latency on-chip memory access.

Identical host code over AXI on FPGA or simulation

Condominium aims to provide reproducible emulation with identical host controller code on both FPGA and software RTL simulator targets. To interface with the PL-Shell, target-specific APIs initiate AXI read and write requests to MMIO locations in the PL-Shell:

  • On the Zynq PS (FPGA target): the APIs perform MMIO reads and writes that are translated to AXI transactions over the Zynq's hardened AXI interfaces.
  • On software RTL simulators (e.g., Verilator): the same APIs leverage DPI-C interfaces to issue AXI transactions directly at the PL-Shell ports.

Because many commercial simulators disallow native multi-threading, Condominium uses C++ coroutines to service each AXI transaction in parallel and to avoid deadlock while handling parallel AXI transactions and design simulation.

C++ host-side AXI helpers

Example host-side helper functions operating on the PS's MMIO-mapped GP0 region (shown in Figure 3.2) include:

cpp int axi_read(int addr) { while (!pl->read(SHELL_FIFO_Y_CNT)) ; // wait for response in FIFO Y return *((int *)(gp0_ptr + addr)); }

void axi_write(int addr, int data) { *((int *)(gp0_ptr + addr)) = data; }

cpp // Write 0xcafe to FIFO X and read response from FIFO Y pl->write(SHELL_FIFO_X, 0xcafe); int val2 = pl->read(SHELL_FIFO_Y);

init() maps the PS-side MMIO region (gp0_ptr = mmap(GP0_PADDR)) and allocates the PL DRAM buffer (dram_ptr = cma_alloc(PL_DRAM_SIZE)), so that subsequent axi_read/axi_write calls become MMIO transactions translated into AXI on the Zynq or into DPI-C-driven AXI on Verilator.

Zynq-Parrot / ZP Cosim: AXI between PS and BlackParrot on Ultra96v2

Zynq-Parrot is a customizable FPGA shell built around the open-source BlackParrot processor and was originally conceived as a flexible AXI wrapper around accelerators and soft processors for Zynq-7000 boards. In the thesis evidence, the discussion focuses on evaluating BlackParrot on the Avnet Ultra96v2 board, which uses the Xilinx Zynq UltraScale+ MPSoC ZU3EG A484 — a quad-core ARM Cortex-A53 PS with NEON SIMD, single/double-precision floating point, and 2 GB of LPDDR4.

AXI interfaces used between the PS and the PL

Zynq-Parrot communicates with the PL through the hardened PS-PL interfaces on the Zynq UltraScale+ MPSoC, all in 32-bit configuration:

  • 2 of 6 high-performance slave AXI interfaces are used for DRAM communication (port m00 in Figure 3.3), giving the PL direct access to PS DRAM.
  • 2 high-performance master AXI interfaces are used for:
    • Communication with the FPGA shell (port s01 in Figure 3.3), over which the PS reads/writes the parameterized synchronous FIFOs and general-purpose registers hosted in the shell.
    • Communication with the slave port of BlackParrot (port s00 in Figure 3.3), over which the PS loads RISC-V program binaries and writes BlackParrot configuration registers.

The bus that carries AXI Full traffic to DRAM is labelled "AXI Full to DRAM" in Figure 3.3.

The PS-side control program

The PS runs a control program (ps.cpp, in C++ or Python) that memory-maps the AXI address space into user memory and uses it to:

  • Flash the system bitstream on the PL using PYNQ APIs.
  • Reset BlackParrot hardware, and initialize DRAM pointers and other configuration registers in the shell (PL) by writing to CSRs in the shell.
  • Load RISC-V-compliant program binaries and write configuration registers in the address space of BlackParrot.
  • Process and respond to environment calls, and interpret termination signals from BlackParrot.
  • Read and write FIFOs and registers in the FPGA shell for auxiliary information such as profiling data.

FPGA shell behaviour over AXI

The FPGA shell wraps a unicore BlackParrot configuration and hosts a parameterized number of synchronous FIFOs and general-purpose registers that can be read and written by the PS via the s01 AXI master port. This is the same AXI-based PS↔PL-Shell control model used in Condominium, but instantiated for BlackParrot on Ultra96v2.

RISC-V multi-core verification: AXI in the UVM testbench

In the system-level UVM environment described in Verification of a RISC-V system with multiple cores, AXI is the on-chip bus used to connect the CPU subsystem to memory, peripherals, and DMA infrastructure.

AXI endpoints on the CPU subsystem

The CPU-subsystem DUT exposes AXI endpoints alongside JTAG and interrupt signals:

  • AXI – Slave Memories that emulate main memory, SRAM, and bootrom, modelled with the axi-mem component from the Pulp project.
  • AXI – Master VIP to support verification of the DMA bridge and to exchange and access different design blocks of the RTL through DMA.
  • AXI crossbar from the Pulp project, used to connect both an SRAM and the UART to the peripheral bus.

Testbench composition

These AXI components are integrated into the testbench alongside:

  • PLIC / CLINT UVM agents that generate external, timer, and software interrupts at the subsystem level and verify their handling by the RTL.
  • A UART model attached to the peripheral bus via the Pulp AXI crossbar.
  • A JTAG VIP and debug module.

Role in the verification flow

  • The AXI slave memories back the bootrom loaded from an .elf file by the Spike-based reference model.
  • The AXI master VIP drives DMA traffic into the subsystem's slave port to verify the DMA bridge.
  • The AXI crossbar multiplexes peripheral traffic between the SRAM and UART, providing realistic peripheral-bus behaviour to the DUT.

The testbench also reuses core-uvm (in passive mode), JTAG VIP, and the Spike DPI reference model alongside the AXI components.

Related concepts

  • Condominium uses AXI as the PS↔PL transport, both via hardened Zynq AXI and via DPI-C transactions in software simulation. Condominium also builds upon the BaseJump STL library to provide generic and open bridges to commonly available AXI and UART interfaces.
  • Zynq-Parrot uses hardened Zynq UltraScale+ high-performance master/slave AXI interfaces (in 32-bit configuration) to connect the PS control program to DRAM, the FPGA shell, and the BlackParrot slave port; it is the emulation substrate for ZP Cosim running on Verilator, Synopsys VCS, and the FPGA.
  • The CPU-Subsystem UVM environment for the RISC-V multi-core design integrates AXI slave memories, an AXI master VIP, and a Pulp AXI crossbar into the system-level testbench.

LINKED ENTITIES

2 links

CITATIONS

8 sources
8 citations
[1] Zynq FPGA boards couple hardened ARM cores (PS) with a programmable fabric (PL) and the PS communicates with the PL via hardened AXI interfaces; PS master ports are GP AXI and PS client ports are HP AXI allowing PL to directly access PS DRAM controllers. Condominium thesis chapter (UW digital library)
[2] Condominium's host-side APIs initiate AXI read/write requests to MMIO locations in the PL-Shell; on the Zynq PS they are translated to AXI over hardened interfaces, and on Verilator they use DPI-C to issue AXI transactions directly at the PL-Shell ports. Condominium thesis chapter (UW digital library)
[3] Condominium uses C++ coroutines to service each AXI transaction in parallel because many commercial simulators disallow native multi-threading, providing parallelism and deadlock avoidance for parallel AXI transactions and design simulation. Condominium thesis chapter (UW digital library)
[4] Zynq-Parrot is a customizable FPGA shell that presents a flexible AXI wrapper around accelerators and soft processors such as BlackParrot, hosted on Zynq boards including the Ultra96v2 with Zynq UltraScale+ MPSoC ZU3EG A484 (quad-core Cortex-A53, NEON, FP, 2 GB LPDDR4). Zynq-Parrot thesis chapter (UW digital library)
[5] Zynq-Parrot uses 2 of 6 high-performance slave AXI interfaces in 32-bit configuration for DRAM communication (m00), and 2 high-performance master AXI interfaces in 32-bit configuration for the FPGA shell (s01) and the slave port of BlackParrot (s00). Zynq-Parrot thesis chapter (UW digital library)
[6] The Zynq-Parrot PS control program (ps.cpp, C++ or Python) memory-maps the AXI interface address space to user memory and uses it to flash the bitstream (PYNQ), reset BlackParrot, initialize DRAM pointers and shell CSRs, load RISC-V binaries, configure BlackParrot registers, handle environment calls, and read/write FIFOs and registers in the FPGA shell. Zynq-Parrot thesis chapter (UW digital library)
[7] The Zynq-Parrot FPGA shell wraps a unicore BlackParrot configuration and exposes a parameterized number of synchronous FIFOs and general-purpose registers that the PS reads and writes via the s01 AXI master port. Zynq-Parrot thesis chapter (UW digital library)
[8] ZP Cosim supports simulating BlackParrot in Verilator and Synopsys VCS and emulating ZP Cosim on the FPGA via Zynq-Parrot, with Verilator generating functional models for the ZP Cosim hardware infrastructure (synthesizable on the FPGA) and BlackParrot, linked with the control program and Dramajo cosimulation libraries. Zynq-Parrot thesis chapter (UW digital library)

VERSION HISTORY

v3 · 7/11/2026 · minimax/minimax-m3 (current)
v2 · 7/4/2026 · minimax/minimax-m3
v1 · 6/18/2026 · minimax/minimax-m3