AXI5 Components Overview¶
The AXI5 component family covers transaction generation and verification for AXI5: master and slave interfaces, packets, randomization, timing profiles, and a compliance checker. All of it sits on GAXI — the same infrastructure the AXI4, AXI-Lite, and AXI-Stream components are built on — so the channel objects, memory models, and statistics behave the way they do elsewhere in the framework. What this family adds is the AXI5 signal set and everything that rides on it: atomic operations, memory tagging, security contexts, chunked transfers, poison indicators, and a compliance checker that knows the new rules.
Key Differences from AXI4¶
AXI5 drops a couple of signals and adds quite a few more.
Removed Signals:
- ARREGION, AWREGION — the region signals are gone from the spec
Added Signals (Address Channels):
- ATOP (AW only) — atomic operation type (6 bits)
- NSAID — Non-secure Access ID (4 bits)
- TRACE — transaction tracing enable (1 bit)
- MPAM — Memory Partitioning and Monitoring (11 bits)
- MECID — Memory Encryption Context ID (16 bits)
- UNIQUE — unique/exclusive access indicator (1 bit)
- TAGOP — memory tagging operation (2 bits)
- TAG — memory tag values (width depends on data width)
- CHUNKEN (AR only) — chunking enable (1 bit)
Added Signals (Data/Response Channels):
- POISON (W, R) — data poison indicator (1 bit)
- TAGUPDATE (W) — tag update indicators
- CHUNKV, CHUNKNUM, CHUNKSTRB (R) — chunked transfer response fields
- TAGMATCH (B, R) — tag match result (1 bit)
- TRACE (B) — transaction trace echo (1 bit)
Framework Integration¶
GAXI Infrastructure Foundation¶
Most of the heavy lifting comes straight from GAXI:
Unified Field Configuration: transaction field layouts come from the framework-wide field configuration system, so adapting to your RTL's widths is a parameter change, not new code Memory Model Support: slaves can source and sink data through memory models, which is what makes self-checking tests practical Statistics Integration: performance metrics and transaction tracking, built in Signal Resolution: automatic signal detection and mapping across different naming conventions Advanced Debugging: multi-level debug support with detailed transaction logging
Memory-Mapped Protocol Specialization¶
On top of that base, the AXI5 layer is shaped around what the new spec actually adds:
Five Channel Architecture: AR, R, AW, W, and B, all covered Atomic Operations: AtomicStore, AtomicLoad, AtomicSwap, and AtomicCompare as first-class transactions Memory Tagging Extension (MTE): TAG, TAGOP, TAGUPDATE, and TAGMATCH, end to end Security Context Management: NSAID, MPAM, and MECID signal handling Chunked Transfer Support: CHUNKEN/CHUNKV/CHUNKNUM/CHUNKSTRB for wide data buses Poison Indicators: data-integrity marking that travels with the beat Transaction Tracing: TRACE signal for debug and profiling infrastructure
Core Components Architecture¶
graph TB
subgraph Ecosystem["AXI5 Component Ecosystem"]
subgraph Components["Core Components"]
MasterRd["AXI5MasterRead<br/>(AR/R)"]
MasterWr["AXI5MasterWrite<br/>(AW/W/B)"]
SlaveRd["AXI5SlaveRead<br/>(AR/R)"]
SlaveWr["AXI5SlaveWrite<br/>(AW/W/B)"]
end
subgraph FieldConfig["AXI5 Field Configurations"]
AR[AR Config]
R[R Config]
AW[AW Config]
W[W Config]
B[B Config]
end
subgraph Advanced["Advanced AXI5 Features"]
Compliance[Compliance Checker]
Random[Randomization]
Timing[Timing Config]
Factories[Factories]
PktUtils[Packet Utils]
TxnSupport[Transaction Tracking]
end
subgraph GAXI["GAXI Infrastructure"]
SigRes[Signal Resolution]
MemModels[Memory Models]
Stats[Statistics]
FieldHandle[Field Handling]
Debug[Debug Support]
Config[Configuration]
end
end
Components --> FieldConfig
FieldConfig --> Advanced
Advanced --> GAXI
Component Capabilities¶
AXI5MasterRead - Memory Read Operations¶
The AXI5MasterRead component drives AXI5 read transactions as a master.
Address Request Management: - AR Channel Control: full ARADDR, ARLEN, ARSIZE, ARBURST, ARID management - Outstanding Transactions: multiple read requests in flight at once - AXI5 Security Context: NSAID, MPAM, and MECID signal generation - Tag Operations: TAGOP signaling for Memory Tagging Extension reads - Chunked Reads: CHUNKEN support for wide-data-bus transfers
Read Data Reception: - R Channel Monitoring: RDATA, RRESP, RID, RLAST handled automatically - Poison Detection: RPOISON indicator checked and flagged - Chunk Response Handling: CHUNKV, CHUNKNUM, CHUNKSTRB processing - Tag Match Results: TAGMATCH extracted from responses
AXI5MasterWrite - Memory Write Operations¶
The AXI5MasterWrite component drives AXI5 write transactions as a master.
Address and Data Management: - AW Channel Control: full AWADDR, AWLEN, AWSIZE, AWBURST management - Atomic Operations: AWATOP signaling for atomic read-modify-write - Memory Tagging: AWTAGOP and AWTAG support for MTE writes - Security Context: AWNSAID, AWMPAM, AWMECID signal generation
Write Data and Response:
- W Channel Control: WDATA, WSTRB, WLAST, WPOISON, WTAG, WTAGUPDATE coordination across the burst
- B Channel Processing: BRESP, BID, BTRACE, BTAGMATCH response verification
- Atomic Convenience: a dedicated atomic_operation() method, so you never hand-roll ATOP traffic
AXI5SlaveRead - Memory Read Response¶
The AXI5SlaveRead component responds to AXI5 read transactions as a slave.
Address Processing: - AR Channel Monitoring: read address requests detected automatically - Out-of-Order Responses: configurable reordering, random or deterministic - Memory Model Integration: data sourced directly from a memory model
Data Response Generation: - R Channel Control: RDATA, RRESP, RID, RLAST generation - Chunk Response: CHUNKV, CHUNKNUM, CHUNKSTRB generation for chunked reads - Poison Injection: configurable RPOISON generation — the easy way to find out whether your master actually handles poisoned data
AXI5SlaveWrite - Memory Write Response¶
The AXI5SlaveWrite component responds to AXI5 write transactions as a slave.
Write Transaction Processing: - AW/W Channel Coordination: address and data phases kept in sync - Atomic Handling: ATOP-aware write response generation - Tag Processing: TAGOP/TAGUPDATE in, TAGMATCH out
Write Response Generation: - B Channel Control: BRESP, BID, BTRACE, BTAGMATCH response generation - Memory Integration: memory model updates with tag awareness
Field Configuration System¶
AXI5FieldConfigHelper - Channel-Specific Configuration¶
Every width from the constructor tables lands in a field configuration. AXI5FieldConfigHelper builds them per channel, or all five in one call:
# AR Channel Configuration
ar_config = AXI5FieldConfigHelper.create_ar_field_config(
id_width=8, addr_width=32, user_width=1,
nsaid_width=4, mpam_width=11, mecid_width=16, tagop_width=2
)
# AW Channel Configuration
aw_config = AXI5FieldConfigHelper.create_aw_field_config(
id_width=8, addr_width=32, user_width=1,
nsaid_width=4, mpam_width=11, mecid_width=16,
atop_width=6, tagop_width=2, tag_width=4, data_width=32
)
# R Channel Configuration
r_config = AXI5FieldConfigHelper.create_r_field_config(
id_width=8, data_width=32, user_width=1,
chunknum_width=4, tag_width=4
)
# W Channel Configuration
w_config = AXI5FieldConfigHelper.create_w_field_config(
data_width=32, user_width=1, tag_width=4
)
# B Channel Configuration
b_config = AXI5FieldConfigHelper.create_b_field_config(
id_width=8, user_width=1, tag_width=4, data_width=32
)
# All channels at once
all_configs = AXI5FieldConfigHelper.create_all_field_configs(
id_width=8, addr_width=32, data_width=64, user_width=1
)
Advanced Features¶
AXI5ComplianceChecker - Protocol Verification¶
A passive protocol monitor, gated by an environment variable, that checks live traffic against the AXI5 rule set. Full API documentation lives in components_axi5_compliance.md.
AXI5Randomization - Realistic Test Scenarios¶
Randomization is profile-driven: pick a profile (or a feature helper) and the manager varies the parameters that matter for it.
Transaction Randomization:
from CocoTBFramework.components.axi5 import (
AXI5RandomizationConfig, AXI5RandomizationProfile,
create_unified_randomization
)
# Create unified randomization manager
manager = create_unified_randomization(data_width=64, performance_mode='normal')
# Configure for atomic operations testing
manager.configure_for_atomic_testing()
# Configure for MTE testing
manager.configure_for_mte_testing()
# Configure for security context testing
manager.configure_for_security_testing()
Industry-Specific Profiles:
- BASIC — standard randomization
- COMPLIANCE — strict protocol adherence
- PERFORMANCE — high-throughput stress testing
- ATOMIC — atomic operation focused
- MTE — Memory Tagging Extension focused
- SECURITY — NSAID/MPAM/MECID focused
- AUTOMOTIVE — conservative, safety-oriented
- DATACENTER — wide bus, high bandwidth
- MOBILE — power-efficient, mixed workloads
Usage Patterns and Integration¶
Basic Read Transaction¶
Build the interface, then read — a single beat, or a burst with the AXI5 knobs turned:
from CocoTBFramework.components.axi5 import create_axi5_master_rd
# Create AXI5 master read interface
master_rd = create_axi5_master_rd(
dut=dut, clock=clk, prefix="m_axi_",
data_width=32, id_width=8, addr_width=32
)
# Perform single read
data = await master_rd['interface'].single_read(address=0x1000, id=1)
# Perform burst read with AXI5 features
responses = await master_rd['interface'].read_transaction(
address=0x2000,
burst_len=4,
id=2,
nsaid=1, # Security context
trace=1, # Enable tracing
tagop=1, # Tag transfer operation
chunken=0 # No chunking
)
Basic Write Transaction¶
Same shape on the write side — a plain single write, then an atomic swap:
from CocoTBFramework.components.axi5 import create_axi5_master_wr
# Create AXI5 master write interface
master_wr = create_axi5_master_wr(
dut=dut, clock=clk, prefix="m_axi_",
data_width=32, id_width=8, addr_width=32
)
# Perform single write
result = await master_wr['interface'].single_write(
address=0x1000, data=0x12345678, id=1
)
# Perform atomic swap operation
result = await master_wr['interface'].atomic_operation(
address=0x2000,
data=0xCAFEBABE,
atop=0x30, # AtomicSwap
id=3
)
Complete Testbench Setup¶
One call builds all four interfaces; pull the pieces you need out of the dictionary:
from CocoTBFramework.components.axi5 import create_complete_axi5_testbench_components
# Create all master and slave interfaces
components = create_complete_axi5_testbench_components(
dut=dut,
clock=clk,
master_prefix="m_axi_",
slave_prefix="s_axi_",
data_width=64,
id_width=4,
addr_width=40
)
# Access individual components
master_write = components['master_write']['interface']
master_read = components['master_read']['interface']
slave_write = components['slave_write']['interface']
slave_read = components['slave_read']['interface']
Timing Configuration¶
Timing Profiles¶
Timing profiles bundle per-channel delays for a given scenario, and there's a helper that returns timing tuned for a specific AXI5 feature:
from CocoTBFramework.components.axi5 import (
create_axi5_timing_from_profile,
get_axi5_timing_profiles,
get_timing_for_axi5_feature
)
# Available profiles
profiles = get_axi5_timing_profiles()
# ['axi5_normal', 'axi5_fast', 'axi5_slow', 'axi5_backtoback',
# 'axi5_stress', 'axi5_atomic', 'axi5_mte', 'axi5_secure', 'axi5_chunked']
# Get timing for a specific AXI5 feature
atomic_timing = get_timing_for_axi5_feature('atomic')
mte_timing = get_timing_for_axi5_feature('mte')
Configuration Examples¶
Hardware Parameter Matching¶
The constructor kwargs line up one-to-one with the parameters on a SystemVerilog AXI5 interface, so matching your DUT is transcription, not translation:
# Match SystemVerilog AXI5 interface parameters
# parameter AXI_DATA_WIDTH = 64,
# parameter AXI_ADDR_WIDTH = 40,
# parameter AXI_ID_WIDTH = 4,
# parameter AXI_USER_WIDTH = 0,
# parameter AXI_NSAID_WIDTH = 4
master_read = create_axi5_master_rd(
dut=dut,
clock=clk,
prefix="m_axi_",
data_width=64,
addr_width=40,
id_width=4,
user_width=0,
nsaid_width=4
)
Feature-Specific Configurations¶
If you only care about one AXI5 feature area, there are convenience factories that preconfigure for it:
from CocoTBFramework.components.axi5 import (
create_axi5_with_mte,
create_axi5_with_atomic,
create_axi5_with_security
)
# Memory Tagging Extension configuration
mte_components = create_axi5_with_mte(
dut=dut, clock=clk, prefix="m_axi_",
tag_width=4
)
# Atomic operations configuration
atomic_components = create_axi5_with_atomic(
dut=dut, clock=clk, prefix="m_axi_",
atop_width=6
)
# Security features configuration
security_components = create_axi5_with_security(
dut=dut, clock=clk, prefix="m_axi_",
nsaid_width=4, mpam_width=11, mecid_width=16
)
Coming from the AXI4 components? The channel objects, memory models, and statistics all work the same way here — start with the differences list at the top of this page, and the rest is the AXI5 fields plus the checks that ride on them.