/
test_etherbone.py
executable file
·164 lines (122 loc) · 4.76 KB
/
test_etherbone.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#!/usr/bin/env python3
#
# This file is part of LiteEth
#
# Copyright (c) 2020-2023 Florent Kermarrec <florent@enjoy-digital.fr>
# SPDX-License-Identifier: BSD-2-Clause
# LiteEth Etherbone test utility.
import sys
import time
import argparse
from litex import RemoteClient
from litex.tools.remote.comm_udp import CommUDP
# Constants ----------------------------------------------------------------------------------------
KiB = 1024
MiB = 1024*KiB
comms = {
"cli": RemoteClient,
"udp": CommUDP
}
# Identifier Test ----------------------------------------------------------------------------------
def ident_test(comm, port):
wb = comms[comm](port=port, csr_csv="csr.csv")
wb.open()
fpga_identifier = ""
for i in range(256):
c = chr(wb.read(wb.bases.identifier_mem + 4*i) & 0xff)
fpga_identifier += c
if c == "\0":
break
print(fpga_identifier)
wb.close()
# Access Test --------------------------------------------------------------------------------------
def access_test(comm, port):
wb = comms[comm](port=port, csr_csv="csr.csv")
wb.open()
data = 0x12345678
addr = 0x100
print("Write over Etherbone at 0x{:08x}: 0x{:08x}.".format(addr, data))
wb.write(wb.mems.sram.base + addr, data)
print("Read over Etherbone at 0x{:08x}: 0x{:08x}.".format(addr, wb.read(wb.mems.sram.base + addr)))
wb.close()
# SRAM Test ----------------------------------------------------------------------------------------
def sram_test(comm, port):
wb = comms[comm](port=port, csr_csv="csr.csv")
wb.open()
def mem_dump(base, length):
for addr in range(base, base + length, 4):
if (addr%16 == 0):
if addr != base:
print("")
print("0x{:08x}".format(addr), end=" ")
data = wb.read(addr)
for i in reversed(range(4)):
print("{:02x}".format((data >> (8*i)) & 0xff), end=" ")
print("")
def mem_write(base, datas):
for n, addr in enumerate(range(base, base + 4*len(datas), 4)):
if (addr%16 == 0):
if addr != base:
print("")
print("0x{:08x}".format(addr), end=" ")
data = datas[n]
for i in reversed(range(4)):
print("{:02x}".format((data >> (8*i)) & 0xff), end=" ")
wb.write(addr, data)
print("")
print("Fill SRAM with counter:")
mem_write(wb.mems.sram.base, [i for i in range(128//4)])
print("")
print("Dump SRAM:")
mem_dump(wb.mems.sram.base, 128)
print("")
print("Fill SRAM with 4 32-bit words:")
mem_write(wb.mems.sram.base, [0x01234567, 0x89abcdef, 0x5aa55aa5, 0xa55aa55a])
print("")
print("Dump SRAM:")
mem_dump(wb.mems.sram.base, 128)
print("")
wb.close()
# Speed Test ---------------------------------------------------------------------------------------
def speed_test(comm, port):
wb = comms[comm](port=port, csr_csv="csr.csv")
wb.open()
test_size = 16*KiB
burst_size = 255
print("Testing write speed... ", end="")
start = time.time()
for i in range(test_size//(4*burst_size)):
wb.write(wb.mems.sram.base, [j for j in range(burst_size)])
end = time.time()
duration = (end - start)
print("{:8.2f} KiB/s".format(test_size/(duration*KiB)))
print("Testing read speed... ", end="")
start = time.time()
for i in range(test_size//(4*burst_size)):
wb.read(wb.mems.sram.base, length=burst_size)
end = time.time()
duration = (end - start)
print("{:8.2f} KiB/s".format(test_size/(duration*KiB)))
wb.close()
# Run ----------------------------------------------------------------------------------------------
def main():
parser = argparse.ArgumentParser(description="LiteEth Etherbone test utility")
parser.add_argument("--port", default="1234", help="Host bind port")
parser.add_argument("--udp", action="store_true", help="Use CommUDP directly instead of RemoteClient")
parser.add_argument("--ident", action="store_true", help="Read FPGA identifier")
parser.add_argument("--access", action="store_true", help="Test single Write/Read access over Etherbone")
parser.add_argument("--sram", action="store_true", help="Test SRAM access over Etherbone")
parser.add_argument("--speed", action="store_true", help="Test speed over Etherbone")
args = parser.parse_args()
port = int(args.port, 0)
comm = "cli" if not args.udp else "udp"
if args.ident:
ident_test(comm=comm, port=port)
if args.access:
access_test(comm=comm, port=port)
if args.sram:
sram_test(comm=comm, port=port)
if args.speed:
speed_test(comm=comm, port=port)
if __name__ == "__main__":
main()