All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
axi_lite_demux_intf
: Fix passing ofreq_t
andresp_t
parameters toaxi_lite_demux
.axi_lite_xbar
: Add missingslv_a{w,r}_cache_i
connections onaxi_lite_to_axi
instance.
axi_lite_regs
: Add memory-mapped registers with AXI4-Lite slave port and the option to make individual bytes read-only.
- Interfaces
AXI_LITE
andAXI_LITE_DV
: addaw_prot
andar_prot
signals.- The
AXI_LITE_ASSIGN*
andAXI_LITE_SET*
macros (ininclude/axi/assign.svh
) have been updated to include the two new interface signals. axi_test::axi_lite_driver
: A newprot
function argument has been added to thesend_aw
,send_ar
,recv_aw
, andrecv_ar
functions.axi_test::rand_axi_lite_master
:- A new
w_prot
andr_prot
function argument has been added to thewrite
andread
function, respectively. The new arguments have a default value of'0
. - The
send_aws
and thesend_ars
function now randomizes theprot
signal of each AW and AR, respectively.
- A new
axi_test::rand_axi_slave
: Displayprot
signal (but otherwise still ignore it).
- The
rand_axi_master
(inaxi_test
): Another fix to respect burst type restrictions when emitting ATOPs.
rand_axi_master
(inaxi_test
): Respect burst type restrictions when emitting ATOPs.
axi_pkg
: Addbufferable
andmodifiable
helper functions.axi_dw_converter
: Add support for single-beat fixed bursts in the downsizer and for fixed bursts of any length in the upsizer.
axi_dw_downsizer
(part ofaxi_dw_converter
): Downsize regardless of the modifiable bit of incoming transactions. Previously, non-modifiable transactions whose attributes would have to be modified for downsizing were rejected with a slave error. As of this change, transactions are downsized and their attributes modified even if their modifiable bit is not set. This is permitted by a note in the AXI specification (page A4-65 of IHI0022H).
axi_dw_downsizer
(part ofaxi_dw_converter
): Fix condition for keeping transactions that have a smallersize
than the master/downstream port unmodified.
axi_serializer
: serialize transactions with different IDs to the same ID.
axi_modify_address
:- Simplify redundant
slv_resp_t
andmst_resp_t
parameters to singleaxi_resp_t
parameter. - Remove unnecessary
slv_a{r,w}_addr_o
outputs, which were fed back from theslv_req_i
inputs. Those signals can instead be derived outsideaxi_modify_address
.
- Simplify redundant
axi_modify_address_intf
:- Change name of slave port to
slv
and master port tomst
and change name of associated parameters to align them with repository conventions. - Change type of parameters to
int unsigned
because their values are unsigned. - Add parameters for data, ID, and user width to avoid derivation from interface, which is incompatible with many tools.
- Add missing I/O suffixes to port names and align them with
axi_modify_address
.
- Change name of slave port to
axi_modify_address_intf
: Fix type parameters passed to actual implementation.
axi_pkg
: Addwrap_boundary
function to calculate the boundary of a wrapping burst.axi_test
: The random AXI masterrand_axi_master
can now emit wrapping bursts (but does not do so by default). Three new parameters control the burst types of the emitted transactions; not setting those parameters means the random master behaves as it did before this change.- Interface
AXI_BUS_DV
: AddMonitor
modport, in which all signals are inputs. axi/assign.svh
: AddAXI_ASSIGN_MONITOR
macro, which assigns anAXI_BUS
to anAXI_BUS_DV.Monitor
.- Package
axi_test
: Addaxi_scoreboard
class, which checks that data read from a memory address matches data written to that address.
axi_pkg
:- The
beat_addr
function now supports all burst types. Due to this, the function has two new arguments (the length and type of the burst). - The
beat_upper_byte
andbeat_lower_byte
functions internally callbeat_addr
, so they have two new arguments as well.
- The
axi_lite_to_axi
: ExposeAxCACHE
signals. It is now possible to define thecache
signal of AXI transactions coming out of this module by driving the addedslv_aw_cache_i
andslv_ar_cache_i
inputs. To retain the behavior prior to this change, tie those two inputs to zero.
axi_modify_address
: Fix unconnectedw_valid
.axi_dw_converter
: Fix internal inversion of up- and downconversion, which led to incorrect lane steering and serialization.rand_axi_master
(inaxi_test
): In ATOP mode, this module could get stuck receiving an R beat when only writes (without ATOP read responses) were left to complete. This has been fixed.assign.svh
: Remove spurious semicolons.axi_lite_to_apb
: Fix message of assertion checking the strobe width.
axi_dw_converter
: a data width converter between AXI interfaces of any data width. Depending on its parametrization, this module instantiates one of the following:axi_dw_downsizer
: a data width converter between a wide AXI master and a narrower slave.axi_dw_upsizer
: a data width converter between a narrow AXI master and a wider slave.
- Add
axi_isolate
to isolate downstream slaves from receiving new transactions.
axi_lite_to_axi
: Add mandatoryAxiDataWidth
parameter to enable fix mentioned below.
- Improve compatibility with Xcelium:
- by removing unsupported hierarchical argument to
$bits()
function inaxi_lite_to_axi
; - by removing unsupported
struct
assignment inaxi_lite_demux
.
- by removing unsupported hierarchical argument to
axi_err_slv
: Add optional parameter to define data returned by read response. The parameter defaults to a 64-bit value, so buses with data width larger than or equal to 64 bit see an additional 32-bit value in error responses compared to the prior version. Other than that, this change is fully backward compatible.
axi_atop_filter
: Fix underflow in counter forAxiMaxWriteTxns = 1
.
- Remove whitespace in and semicolon after macro calls.
axi_intf
: Improve Verilator compatibility by disabling unsupported assertions.
axi_cdc_intf
: Add interface variant of AXI clock domain crossing.
axi_cdc
: Remove unused globalimport axi_pkg::*
.axi_intf
: Remove globalimport axi_pkg::*
and explicitly use symbols fromaxi_pkg
.axi_lite_cut_intf
: Add missing assigns to and from interface ports.tb_axi_cdc
:- Remove global
import axi_pkg::*
. - Define channels with
AXI_TYPEDEF
macros instead of localtypedef
s.
- Remove global
- Remove unused
AXI_ARBITRATION
andAXI_ROUTING_RULES
interfaces.
axi_intf
: Add single-channel assertions toAXI_BUS_DV
.
axi_lite_to_apb
: Fix the interface version (axi_lite_to_apb_intf
) to match the changes from version0.15.0
.axi_demux
: WhenMaxTrans
was 1, theIdCounterWidth
became 0. This has been fixed.axi_atop_filter
:- The master interface of this module in one case depended on
aw_ready
before applyingw_valid
, which is a violation of the AXI specification that can lead to deadlocks. This issue has been fixed by removing that dependency. - The slave interface of this module could illegally change the value of B and R beats between valid and handshake. This has been fixed.
- The master interface of this module in one case depended on
rand_axi_master
(inaxi_test
):- Fix infinite wait in
send_ws
task. - Decouple generation of AWs from sending them. This allows to apply W beats before or simultaneous with AW beats.
- Fix infinite wait in
rand_axi_slave
(inaxi_test
):- Decouple receiving of Ws from receiving of AWs. This allows to receive W beats independent of AW beats.
- Update
common_cells
to1.16.4
to fix synthesis warning inid_queue
.
axi_burst_splitter
: Split AXI4 bursts to single-beat transactions.
axi_lite_to_apb
: Thepsel
field of theapb_req_t
struct is now a single bit. That is, every APB slave has its own request struct. Accordingly,apb_req_o
is now an array withNoApbSlaves
entries.axi_decerr_slv
has been replaced by a more genericaxi_err_slv
, which takes the kind of error as parameter. Thisaxi_err_slv
no longer has aFallThrough
parameter; instead, a response (i.e., B or R beat) now always comes one cycle after the AW or AR beat (as required by the AXI Spec) but the slave can accept a W beat in the same cycle as the corresponding AW beat. Additionally,axi_err_slv
got a parameterATOPs
that defines if it supports atomic operations.axi_to_axi_lite
: Rework module to structs and add burst support.
axi_demux
: Thecase
statement controlling the counters had not been specifiedunique
even though it qualified for it. This has been fixed.axi_lite_mux_intf
: Fix signal names in internal assignments, names of parameters ofaxi_lite_mux
instance, and typos in assertion messages.
- Add
axi_lite_mailbox
: AXI4-Lite mailbox.
axi_xbar_intf
: Add interface variant of crossbar.
axi_atop_filter
: Fix ModelSim warnings by addingdefault
statement. The signal in thecase
has a single bit, and both values were correctly handled in synthesis. However, when starting simulation, the signal has an undefined value, and ModelSim threw warnings that this violated theunique
condition.axi_demux
: Movetypedef
outsidegenerate
for compatibility with VCS.axi_id_prepend
:- Fix text of some assertion messages.
- Fix case of prepending a single-bit ID.
tb_axi_xbar
: Fix for localparamAxiIdWidthSlaves
to be dependent on the number of masters.
axi_lite_to_apb
: AXI4-Lite to APB4 converter.
axi_cdc
: Add a safe AXI clock domain crossing (CDC) implementation.
- The interface variants of
axi_demux
andaxi_mux
have been changed to match the convention for interface variants in this repository:axi_demux_wrap
: Change name toaxi_demux_intf
and change parameter names to ALL_CAPS.axi_mux_wrap
: Change name toaxi_mux_intf
, and change parameter names to ALL_CAPS.
axi_demux
: Default parameters to0
.
axi_demux
: Add parameter case forNoMstPorts == 1
.
axi_atop_filter
: Remove unreachabledefault
inunique case
block.axi_demux_wrap
: Fix signals passed to demux.axi_lite_demux_intf
: Fix signal passed to demux.axi_lite_mux
: Add missing declaration ofr_fifo_push
.
axi_lite_xbar
: Fix synthesis forNoMstPorts == 1
.
axi_lite_xbar
: fully-connected AXI4-Lite crossbar.axi_lite_demux
: AXI4-Lite demultiplexer from one slave port to a configurable number of master ports.axi_lite_mux
: AXI4-Lite multiplexer from a configurable number of slave ports to one master port.
axi_test
: Extended package with random AXI4-Lite master and slave test bench classes.
axi_pkg
: Fix value ofCUT_ALL_PORTS
(inxbar_latency_e
) in Vivado synthesis.
axi_decerr_slv
: Fix parameter to be UpperCamelCase
axi_test
: Constrained randomizing AXI master (rand_axi_master
) and slave (rand_axi_slave
).rand_axi_master
issues a configurable number of read and write transactions to configurable memory regions (address ranges with associated memory types) and with random properties within constraints (e.g., burst length, exclusive accesses, atomic operations).rand_axi_slave
responds to transactions with random delays and data.
axi_pkg
: AXI memory types (mem_type_t
) and functionsget_arcache
andget_awcache
to calculateAxCACHE
bits for a given memory type.- Add
axi_decerr_slv
. - Add
axi_id_prepend
. - Add fully compliant
axi_xbar
. - Add documentation on
axi_mux
,axi_demux
andaxi_xbar
- Module overview to
README.md
axi_test
: Thereset
tasks inaxi_driver
andaxi_lite_driver
are now functions.- Bump
common_cells
to1.16.0
which contains the address decoding logic used inaxi_xbar
.
axi_intf
move import into interface bodies.axi_pkg
make functions automatic, fixing a problem with Synopsys.
src_files.yml
: Addonly_local
flag foraxi_test
.axi_test
:- Add missing default parameters to
axi_lite_driver
. - Move wildcard import from
axi_test
into package to prevent pollution of compilation unit.
- Add missing default parameters to
axi_pkg
: Functions to calculate addresses and byte positions within a beat.
All modules have been changed from SystemVerilog interfaces to struct ports. Thus, all modules in
this repository are now available in tools that do not support interfaces. Interfaces are now
opt-in: every module has a variant with _intf
suffix that is functionally equivalent but has
interfaces instead of struct ports. If you would like to keep using interfaces, please add an
_intf
suffix to any module you are using from this repository. Some _intf
variants require more
parameters (e.g., to define the ID width) than the module prior to this release, but otherwise the
_intf
variants are drop-in replacements.
We encourage the use of structs to build AXI infrastructure, and we have added a set of typdef
macros and have extended the assign
macros to keep designers productive and prevent mismatches.
Additionally, we have removed a set of modules that had known issues. We will provide new implementations for these modules in near-term releases and no longer support the removed modules.
The individual changes for each module follow.
assign.svh
:- Macros for setting an AXI or AXI-Lite interface from channel or request/response structs inside
a process (
AXI_SET_FROM_*
andAXI_LITE_SET_FROM_*
) and outside a process like an assignment (AXI_ASSIGN_FROM_*
andAXI_LITE_ASSIGN_FROM_*
). - Macros for setting channel or request/response structs to the signals of an AXI or AXI-Lite
interface inside a process (
AXI_SET_TO_*
andAXI_LITE_SET_TO_*
) and outside a process like an assignment (AXI_ASSIGN_TO_*
,AXI_LITE_ASSIGN_TO_*
).
- Macros for setting an AXI or AXI-Lite interface from channel or request/response structs inside
a process (
typedef.svh
: Macros for defining AXI or AXI-Lite channel (AXI_TYPEDEF_*_CHAN_T
andAXI_LITE_TYPEDEF_*_CHAN_T
) and request/response structs (AXI_TYPEDEF_RE{Q,SP}_T
andAXI_LITE_TYPEDEF_RE{Q,SP}_T
).
axi_atop_filter
has been changed from interfaces to struct ports. Please use the newly addedaxi_atop_filter_intf
module if you prefer interfaces.axi_cut
has been changed from interfaces to struct ports. Please use the newly addedaxi_cut_intf
module if you prefer interfaces.axi_delayer
has been changed from interfaces to struct ports. Please use the newly addedaxi_delayer_intf
module if you prefer interfaces.axi_join
has been renamed toaxi_join_intf
, andaxi_lite_join
has been renamed toaxi_lite_join_intf
. To join two structs, simply assign them instead.axi_multicut
has been changed from interfaces to struct ports. Please use the newly addedaxi_multicut_intf
module if you prefer interfaces.axi_modify_address
has been changed from interfaces to struct ports. Please use the newly addedaxi_modify_address_intf
module if you prefer interfaces.axi_lite_to_axi
has been changed from interfaces to struct ports. Please use the newly addedaxi_lite_to_axi_intf
module if you prefer interfaces.
axi_lite_xbar
: This interconnect module was not a full crossbar and its routing rules interface no longer fits our demands. A replacement will be provided in a near-term release.axi_address_resolver
was used together withaxi_lite_xbar
and is removed along with it. If a standalone replacement for this module is required, please useaddr_decoder
fromcommon_cells
.axi_arbiter
was used together withaxi_lite_xbar
and is removed along with it. If a standalone replacement of this module is required, please userr_arb_tree
fromcommon_cells
. A near-term release will introduce an AXI multiplexer and demultiplexer to suit protocol-specific needs.axi_id_remap
had problems with ordering and ATOPs. A new, correct implementation will be provided in a near-term release.axi_lite_cut
has been rendered unnecessary by changingaxi_cut
to struct ports. To get a cut with AXI-Lite ports, simply pass AXI-Lite channels and request/response structs as parameters. If you prefer interfaces, please replace anyaxi_lite_cut
with the newly addedaxi_lite_cut_intf
module.axi_lite_multicut
: same rationale and transition procedure as foraxi_lite_cut
.- In
axi_pkg
, the*Width
localparam
s and theid_t
,addr_t
, etc.typedef
s have been removed. There is no one-fits-all value of these parameters, so we cannot provide a generic definition for them in this package. Please use the added macros intypedef.svh
to define your own types with a few lines of code (which you can put into your own package, for example).
- axi_to_axi_lite: Fix underflow in internal buffers.
- axi_to_axi_lite: Remove restriction on size of internal buffers.
- axi_multicut: Simplified implementation without changing I/O behavior.
- src_files: Removed
axi_test.sv
from synthesized files. - tb_axi_lite_xbar: Fixed AW->W dependency.
- The
in
andout
modports have been removed from the interface definition of both AXI and AXI Lite. These modports were "aliases" ofSlave
andMaster
, respectively, and caused problems because many tools did not recognize the aliases as being identical toSlave
andMaster
.
- AXI interfaces now include the
aw_atop
signal. Interfaces, macros, and existing modules and TBs in this repository have been updated. The ReadMe has been updated to guide users of this repository on how to deal with theaw_atop
signal.
- Add AXI atomic operations (ATOPs) filter.
- Replace non-ASCII characters in Solderpad license text.
- Add a trailing semicolon to the
AXI_ASSIGN()
andAXI_LITE_ASSIGN()
macros inassign.svh
(#8). Those macros can now be used without a semicolon. Existing code that uses the macros with a semicolon do not break.
- Add axi channel delayer
- Remove clock from
AXI_BUS
andAXI_LITE
. Such a clock signal is useful for testing purposes but confusing (or even harmful) in hardware designs. For testing purposes, theAXI_BUS_DV
andAXI_LITE_DV
(suffix for "design verification") interfaces have been defined instead.
- Update
src_files.yml
to matchBender.yml
. - Add missing
axi_test
to compile script.
- Fix
common_cells
dependency to open-source repo
- Make
axi_cut
andaxi_multicut
verilator compatible
- Add license file and adjust copyright headers.
- Add test mode signal to
axi_to_axi_lite
adapter, used in the FIFOs. - Remove
axi_find_first_one
from src_files.yml - Fix release ID issue in ID
axi_id_remap
- Remove time unit from test package. Fixes an issue in the AXI driver.
- Add AXI ID remapper.
- Fixed typos in the AXI and AXI-Lite multicuts.
- Fixed ID width in AXI ID remapper.
- AXI join now asserts if width of outgoing ID is larger or equal to width of incoming ID.
- AXI and AXI-Lite multicuts
- Remove
axi_find_first_one.sv
from manifest
- AXI cut
- Initial release with various interfaces, drivers for testbenches, and utility modules.