This core can be used to test read/write performance of a 32-bit AXI-4 memory.
It can also be used to validate read data.
Accesses are performed as pipelined AXI-4 burst operations.
##################################################################
# run_ram_test: Write pattern to RAM array
##################################################################
def run_ram_test(bus_if, base, size, pattern, clock_ns, burst_len=32):
# Configure
bus_if.write32(RAM_TEST_BASE, base)
bus_if.write32(RAM_TEST_END, base + size)
if pattern != None:
bus_if.write32(RAM_TEST_WRITE, pattern)
# Burst length
cfg = ((burst_len/4)-1) << RAM_TEST_CFG_BURST_LEN_SHIFT
# Type
if pattern != None:
cfg |= (1 << RAM_TEST_CFG_USER_SHIFT)
else:
cfg |= (1 << RAM_TEST_CFG_INCR_SHIFT)
if pattern != None:
print "# Write RAM to 0x%08x" % pattern
else:
print "# Write RAM to INCR"
bus_if.write32(RAM_TEST_CFG, cfg)
while True:
status = bus_if.read32(RAM_TEST_STS)
if (status & (1 << RAM_TEST_STS_BUSY_SHIFT)) == 0:
break
cycles = bus_if.read32(RAM_TEST_TIME)
time_ns = clock_ns * cycles
bw = (1000000000.0 / time_ns) * size
print "|- %d bytes written in %d cycles (%dMB/s)" % (size, cycles, bw / 1000000)
print "# Read RAM and compare"
bus_if.write32(RAM_TEST_CFG, cfg | (1 << RAM_TEST_CFG_READ_SHIFT))
while True:
status = bus_if.read32(RAM_TEST_STS)
if (status & (1 << RAM_TEST_STS_BUSY_SHIFT)) == 0:
break
errors = bus_if.read32(RAM_TEST_ERRORS)
cycles = bus_if.read32(RAM_TEST_TIME)
time_ns = clock_ns * cycles
bw = (1000000000.0 / time_ns) * size
print "|- %d bytes read in %d cycles (%dMB/s)" % (size, cycles, bw / 1000000)
print "|- Errors: %d" % errors
if errors > 0:
print "ERROR: RAM read errors encountered"
sys.exit(1)
##################################################################
# Test sequence
##################################################################
clock_ns = 20
burst_len = 64
print "# User clock: %fns (%fMHz)" % (clock_ns, 1000/clock_ns)
print "# Burst Length: %d bytes" % (burst_len)
base = 0x80000000
size = (1 * 1024 * 1024)
run_ram_test(bus_if, base, size, 0x00000000, clock_ns, burst_len)
run_ram_test(bus_if, base, size, 0xFFFFFFFF, clock_ns, burst_len)
run_ram_test(bus_if, base, size, 0x5555aaaa, clock_ns, burst_len)
run_ram_test(bus_if, base, size, None, clock_ns, burst_len)