The AxiRam, AxiLiteRam, and ApbRam classes are specialized slaves that implement memory. They use SparseMemory internally to support emulating very large memory regions efficiently.
Connection
from cocotbext.axi import AxiBus, AxiRam
# Create a 4GB RAM slave
axi_ram = AxiRam(AxiBus.from_prefix(dut, "m_axi"), dut.clk, dut.rst, size=2**32)
Accessing Memory
You can access memory via the mem attribute (the underlying mmap or SparseMemory object) or via standard master-like API calls:
axi_ram.write(0x0000, b'test')
data = axi_ram.read(0x0000, 4)
# Debugging
axi_ram.hexdump(0x0000, 4, prefix="RAM")
Multi-port RAM
To create a multi-port memory (e.g., for a dual-port RAM), pass the mem attribute of the first instance to subsequent instances:
axi_ram_p1 = AxiRam(AxiBus.from_prefix(dut, "m00_axi"), dut.clk, dut.rst, size=2**32)
axi_ram_p2 = AxiRam(AxiBus.from_prefix(dut, "m01_axi"), dut.clk, dut.rst, mem=axi_ram_p1.mem)
from cocotbext.axi import AxiBus, AxiRam
# Create a 4GB RAM slave
axi_ram = AxiRam(AxiBus.from_prefix(dut, "m_axi"), dut.clk, dut.rst, size=2**32)
# Accessing memory
await axi_ram.write(0x0000, b'test')
data = await axi_ram.read(0x0000, 4)
axi_ram.hexdump(0x0000, 4, prefix="RAM")