Home

Awesome

AXI SystemVerilog Modules for High-Performance On-Chip Communication

CI status GitHub tag (latest SemVer) SHL-0.51 license

This repository provides modules to build on-chip communication networks adhering to the AXI4 or AXI4-Lite standards. For high-performance communication, we implement AXI4+ATOPs from AXI5. For lightweight communication, we implement AXI4-Lite. We aim to provide a complete end-to-end communication platform, including endpoints such as DMA engines and on-chip memory controllers.

Our design goals are:

The design and microarchitecture of the modules in this repository is described in this paper (preprint). If you use our work in your research, please cite it.

List of Modules

In addition to the documents linked in the following table, we are setting up documentation auto-generated from inline docstrings. (Replace master in that URL with a tag to get the documentation for a specific version.)

NameDescriptionDoc
axi_atop_filterFilters atomic operations (ATOPs), i.e., write transactions that have a non-zero aw_atop value.
axi_burst_splitterSplit AXI4 burst transfers into single-beat transactions.
axi_burst_unwrapConvert AXI4 wrapping burst transfers into up to two incremental bursts.
axi_cdcAXI clock domain crossing based on a Gray FIFO implementation.
axi_cutBreaks all combinatorial paths between its input and output.
axi_delayerSynthesizable module which can (randomly) delays AXI channels.
axi_demux_simpleDemux without spill registers.Doc
axi_demuxDemultiplexes an AXI bus from one slave port to multiple master ports.Doc
axi_dw_converterA data width converter between AXI interfaces of any data width.
axi_dw_downsizerA data width converter between a wide AXI master and a narrower AXI slave.
axi_dw_upsizerA data width converter between a narrow AXI master and a wider AXI slave.
axi_err_slvAlways responds with an AXI decode/slave error for transactions which are sent to it.
axi_fifoA Fifo for each AXI4 channel to buffer requests.
axi_from_memThis module acts like an SRAM and makes AXI4 requests downstream.
axi_id_prependThis module prepends/strips the MSB from the AXI IDs.
axi_id_remapRemap AXI IDs from wide IDs at the slave port to narrower IDs at the master port.Doc
axi_id_serializeReduce AXI IDs by serializing transactions when necessary.Doc
axi_interleaved_xbarInterleaved version of the crossbar. This module is experimental; use at your own risk.
axi_intfThis file defines the interfaces we support.
axi_isolateA module that can isolate downstream slaves from receiving new AXI4 transactions.
axi_iw_converterConvert between any two AXI ID widths.Doc
axi_joinA connector that joins two AXI interfaces.
axi_lfsrAXI4-attached LFSR; read returns pseudo-random data, writes are compressed into a checksum.
axi_lite_demuxDemultiplexes an AXI4-Lite bus from one slave port to multiple master ports.Doc
axi_lite_dw_converterA data width converter between two AXI-Lite busses[Doc][doc.axi_lite_dw_converter]
axi_lite_from_memThis module acts like an SRAM and makes AXI4-Lite requests downstream.
axi_lite_joinA connector that joins two AXI-Lite interfaces.
axi_lite_lfsrAXI4-Lite-attached LFSR; read returns pseudo-random data, writes are compressed into a checksum.
axi_lite_mailboxA AXI4-Lite Mailbox with two slave ports and usage triggered irq.Doc
axi_lite_muxMultiplexes AXI4-Lite slave ports down to one master port.Doc
axi_lite_regsAXI4-Lite registers with optional read-only and protection features.Doc
axi_lite_to_apbAXI4-Lite to APB4 protocol converter.
axi_lite_to_axiAXI4-Lite to AXI4 protocol converter.
axi_lite_xbarFully-connected AXI4-Lite crossbar with an arbitrary number of slave and master ports.Doc
axi_modify_addressA connector that allows addresses of AXI requests to be changed.
axi_multicutAXI register which can be used to relax timing pressure on long AXI buses.
axi_muxMultiplexes the AXI4 slave ports down to one master port.Doc
axi_pkgContains AXI definitions, common structs, and useful helper functions.
axi_rw_joinJoins a read and a write slave into one single read / write master.
axi_rw_splitSplits a single read / write slave into one read and one write master.
axi_serializerSerializes transactions with different IDs to the same ID.
axi_slave_compareCompares two slave devices.
axi_throttleLimits the maximum number of outstanding transfers sent to the downstream logic.
axi_testA set of testbench utilities for AXI interfaces.
axi_to_axi_liteAXI4 to AXI4-Lite protocol converter.
axi_to_memAXI4 to memory protocol (req, gnt, rvalid) converter. Additional banked, interleaved, split variant.
axi_xbarFully-connected AXI4+ATOP crossbar with an arbitrary number of slave and master ports.Doc
axi_xbar_unmuxedDemux side of fully-connected AXI4+ATOP crossbar with an arbitrary number of slave and master ports.Doc
axi_xpAXI Crosspoint (XP) with homomorphous slave and master ports.
axi_zero_memAXI-attached /dev/zero. All reads will be zero, writes are absorbed.

Synthesizable Verification Modules

The following modules are meant to be used for verification purposes only but are synthesizable to be used in FPGA environments.

NameDescription
axi_bus_compareCompares two buses of the same type (and in the same clock domain), returns events on mismatch.
axi_slave_compareCompares two slave devices of the same type (and in the same clock domain), returns events on mismatch.

Simulation-Only Modules

In addition to the modules above, which are available in synthesis and simulation, the following modules are available only in simulation. Those modules are widely used in our testbenches, but they are also suitable to build testbenches for AXI modules and systems outside this repository.

NameDescription
axi_chan_compareNon-synthesizable module comparing two AXI channels of the same type
axi_chan_loggerLogs the transactions of an AXI4(+ATOPs) port to files.
axi_driverLow-level driver for AXI4(+ATOPs) that can send and receive individual beats on any channel.
axi_dumperDumps log to file to be interpreted by axi_dumper_interpret script for debugging purposes.
axi_file_masterAXI4 master for file-based testbenches
axi_lite_driverLow-level driver for AXI4-Lite that can send and receive individual beats on any channel.
axi_lite_rand_masterAXI4-Lite master component that issues random transactions within user-defined constraints.
axi_lite_rand_slaveAXI4-Lite slave component that responds to transactions with constrainable random delays and data.
axi_rand_masterAXI4(+ATOPs) master component that issues random transactions within user-defined constraints.
axi_rand_slaveAXI4(+ATOPs) slave component that responds to transactions with constrainable random delays and data.
axi_scoreboardScoreboard that models a memory that only gets changed by the monitored AXI4(+ATOPs) port.
axi_sim_memInfinite memory with AXI4 slave port.

Atomic Operations

AXI4+ATOPs means the full AXI4 specification plus atomic operations (ATOPs) as defined in Section E1.1 of the AMBA 5 specification. This has the following implications for modules that do not implement ATOPs and systems that include such modules:

Masters and slaves that do support ATOPs must adhere to Section E1.1 of the AMBA 5 specification. In particular:

Which EDA Tools Are Supported?

Our code is written in standard SystemVerilog (IEEE 1800-2012, to be precise), so the more important question is: Which subset of SystemVerilog does your EDA tool support?

We aim to be compatible with a wide range of EDA tools. For this reason, we strive to use as simple language constructs as possible, especially for our synthesizable modules. We encourage contributions that further simplify our code to make it compatible with even more EDA tools. We also welcome contributions that work around problems that specific EDA tools may have with our code, as long as:

In addition, we suggest to report issues with the SystemVerilog language support directly to the EDA vendor. Our code is fully open and can / should be shared with the EDA vendor as a testcase for any language problem encountered.

All code in each release and on the default branch is tested on a recent version of at least one industry-standard RTL simulator and synthesizer. You can examine the CI settings to find out which version of which tool we are running.