soc/interconnect/axi: add connect methods for convenience

This commit is contained in:
Jędrzej Boczar 2020-07-15 15:47:06 +02:00
parent 78a631f392
commit f3072d4984
1 changed files with 23 additions and 0 deletions

View File

@ -55,6 +55,23 @@ def r_description(data_width, id_width):
("id", id_width) ("id", id_width)
] ]
def _connect_axi(master, slave):
channel_modes = {
"aw": "master",
"w" : "master",
"b" : "slave",
"ar": "master",
"r" : "slave",
}
r = []
for channel, mode in channel_modes.items():
if mode == "master":
m, s = getattr(master, channel), getattr(slave, channel)
else:
s, m = getattr(master, channel), getattr(slave, channel)
r.extend(m.connect(s))
return r
class AXIInterface: class AXIInterface:
def __init__(self, data_width=32, address_width=32, id_width=1, clock_domain="sys"): def __init__(self, data_width=32, address_width=32, id_width=1, clock_domain="sys"):
self.data_width = data_width self.data_width = data_width
@ -68,6 +85,9 @@ class AXIInterface:
self.ar = stream.Endpoint(ax_description(address_width, id_width)) self.ar = stream.Endpoint(ax_description(address_width, id_width))
self.r = stream.Endpoint(r_description(data_width, id_width)) self.r = stream.Endpoint(r_description(data_width, id_width))
def connect(self, slave):
return _connect_axi(self, slave)
# AXI Lite Definition ------------------------------------------------------------------------------ # AXI Lite Definition ------------------------------------------------------------------------------
def ax_lite_description(address_width): def ax_lite_description(address_width):
@ -138,6 +158,9 @@ class AXILiteInterface:
r.append(pad.eq(sig)) r.append(pad.eq(sig))
return r return r
def connect(self, slave):
return _connect_axi(self, slave)
def write(self, addr, data, strb=None): def write(self, addr, data, strb=None):
if strb is None: if strb is None:
strb = 2**len(self.w.strb) - 1 strb = 2**len(self.w.strb) - 1