Implement wuser

This commit is contained in:
Alex Forencich
2020-12-01 17:58:50 -08:00
parent 0f93292f6e
commit b3c1e1d557

View File

@@ -34,7 +34,7 @@ from .axi_channels import AxiAWSource, AxiWSource, AxiBSink, AxiARSource, AxiRSi
# AXI master write helper objects # AXI master write helper objects
AxiWriteCmd = namedtuple("AxiWriteCmd", ["address", "data", "awid", "burst", "size", AxiWriteCmd = namedtuple("AxiWriteCmd", ["address", "data", "awid", "burst", "size",
"lock", "cache", "prot", "qos", "region", "user", "token"]) "lock", "cache", "prot", "qos", "region", "user", "wuser", "token"])
AxiWriteRespCmd = namedtuple("AxiWriteRespCmd", ["address", "length", "size", "cycles", AxiWriteRespCmd = namedtuple("AxiWriteRespCmd", ["address", "length", "size", "cycles",
"prot", "burst_list", "token"]) "prot", "burst_list", "token"])
AxiWriteResp = namedtuple("AxiWriteResp", ["address", "length", "resp", "user", "token"]) AxiWriteResp = namedtuple("AxiWriteResp", ["address", "length", "resp", "user", "token"])
@@ -105,8 +105,8 @@ class AxiMasterWrite(object):
cocotb.fork(self._process_write()) cocotb.fork(self._process_write())
cocotb.fork(self._process_write_resp()) cocotb.fork(self._process_write_resp())
def init_write(self, address, data, awid=None, burst=AxiBurstType.INCR, size=None, def init_write(self, address, data, awid=None, burst=AxiBurstType.INCR, size=None, lock=AxiLockType.NORMAL,
lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0, token=None): cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0, wuser=0, token=None):
if token is not None: if token is not None:
if token in self.active_tokens: if token in self.active_tokens:
raise Exception("Token is not unique") raise Exception("Token is not unique")
@@ -127,9 +127,17 @@ class AxiMasterWrite(object):
lock = AxiLockType(lock) lock = AxiLockType(lock)
prot = AxiProt(prot) prot = AxiProt(prot)
if wuser is None:
wuser = 0
elif isinstance(wuser, int):
pass
else:
wuser = list(wuser)
self.in_flight_operations += 1 self.in_flight_operations += 1
cmd = AxiWriteCmd(address, bytearray(data), awid, burst, size, lock, cache, prot, qos, region, user, token) cmd = AxiWriteCmd(address, bytearray(data), awid, burst, size, lock,
cache, prot, qos, region, user, wuser, token)
self.write_command_queue.append(cmd) self.write_command_queue.append(cmd)
self.write_command_sync.set() self.write_command_sync.set()
@@ -172,43 +180,43 @@ class AxiMasterWrite(object):
return None return None
async def write(self, address, data, awid=None, burst=AxiBurstType.INCR, size=None, async def write(self, address, data, awid=None, burst=AxiBurstType.INCR, size=None,
lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0): lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0, wuser=0):
token = object() token = object()
self.init_write(address, data, awid, burst, size, lock, cache, prot, qos, region, user, token) self.init_write(address, data, awid, burst, size, lock, cache, prot, qos, region, user, wuser, token)
await self.wait(token) await self.wait(token)
return self.get_write_resp(token) return self.get_write_resp(token)
async def write_words(self, address, data, ws=2, awid=None, burst=AxiBurstType.INCR, size=None, async def write_words(self, address, data, ws=2, awid=None, burst=AxiBurstType.INCR, size=None,
lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0): lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0, wuser=0):
words = data words = data
data = bytearray() data = bytearray()
for w in words: for w in words:
data.extend(w.to_bytes(ws, 'little')) data.extend(w.to_bytes(ws, 'little'))
await self.write(address, data, awid, burst, size, lock, cache, prot, qos, region, user) await self.write(address, data, awid, burst, size, lock, cache, prot, qos, region, user, wuser)
async def write_dwords(self, address, data, awid=None, burst=AxiBurstType.INCR, size=None, async def write_dwords(self, address, data, awid=None, burst=AxiBurstType.INCR, size=None,
lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0): lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0, wuser=0):
await self.write_words(address, data, 4, awid, burst, size, lock, cache, prot, qos, region, user) await self.write_words(address, data, 4, awid, burst, size, lock, cache, prot, qos, region, user, wuser)
async def write_qwords(self, address, data, awid=None, burst=AxiBurstType.INCR, size=None, async def write_qwords(self, address, data, awid=None, burst=AxiBurstType.INCR, size=None,
lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0): lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0, wuser=0):
await self.write_words(address, data, 8, awid, burst, size, lock, cache, prot, qos, region, user) await self.write_words(address, data, 8, awid, burst, size, lock, cache, prot, qos, region, user, wuser)
async def write_byte(self, address, data, awid=None, burst=AxiBurstType.INCR, size=None, async def write_byte(self, address, data, awid=None, burst=AxiBurstType.INCR, size=None,
lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0): lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0, wuser=0):
await self.write(address, [data], awid, burst, size, lock, cache, prot, qos, region, user) await self.write(address, [data], awid, burst, size, lock, cache, prot, qos, region, user, wuser)
async def write_word(self, address, data, ws=2, awid=None, burst=AxiBurstType.INCR, size=None, async def write_word(self, address, data, ws=2, awid=None, burst=AxiBurstType.INCR, size=None,
lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0): lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0, wuser=0):
await self.write_words(address, [data], ws, awid, burst, size, lock, cache, prot, qos, region, user) await self.write_words(address, [data], ws, awid, burst, size, lock, cache, prot, qos, region, user, wuser)
async def write_dword(self, address, data, awid=None, burst=AxiBurstType.INCR, size=None, async def write_dword(self, address, data, awid=None, burst=AxiBurstType.INCR, size=None,
lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0): lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0, wuser=0):
await self.write_dwords(address, [data], awid, burst, size, lock, cache, prot, qos, region, user) await self.write_dwords(address, [data], awid, burst, size, lock, cache, prot, qos, region, user, wuser)
async def write_qword(self, address, data, awid=None, burst=AxiBurstType.INCR, size=None, async def write_qword(self, address, data, awid=None, burst=AxiBurstType.INCR, size=None,
lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0): lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0, wuser=0):
await self.write_qwords(address, [data], awid, burst, size, lock, cache, prot, qos, region, user) await self.write_qwords(address, [data], awid, burst, size, lock, cache, prot, qos, region, user, wuser)
async def _process_write(self): async def _process_write(self):
while True: while True:
@@ -243,6 +251,8 @@ class AxiMasterWrite(object):
awid = self.cur_id awid = self.cur_id
self.cur_id = (self.cur_id+1) % self.id_count self.cur_id = (self.cur_id+1) % self.id_count
wuser = cmd.wuser
self.log.info("Write start addr: 0x%08x awid: 0x%x prot: %s data: %s", self.log.info("Write start addr: 0x%08x awid: 0x%x prot: %s data: %s",
cmd.address, awid, cmd.prot, ' '.join((f'{c:02x}' for c in cmd.data))) cmd.address, awid, cmd.prot, ' '.join((f'{c:02x}' for c in cmd.data)))
@@ -299,6 +309,14 @@ class AxiMasterWrite(object):
w.wstrb = strb w.wstrb = strb
w.wlast = n >= burst_length w.wlast = n >= burst_length
if isinstance(wuser, int):
w.wuser = wuser
else:
if wuser:
w.wuser = wuser.pop(0)
else:
w.wuser = 0
self.w_channel.send(w) self.w_channel.send(w)
cur_addr += num_bytes cur_addr += num_bytes
@@ -687,9 +705,9 @@ class AxiMaster(object):
lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0, token=None): lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0, token=None):
self.read_if.init_read(address, length, burst, size, lock, cache, prot, qos, region, user, token) self.read_if.init_read(address, length, burst, size, lock, cache, prot, qos, region, user, token)
def init_write(self, address, data, burst=AxiBurstType.INCR, size=None, def init_write(self, address, data, burst=AxiBurstType.INCR, size=None, lock=AxiLockType.NORMAL,
lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0, token=None): cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0, wuser=0, token=None):
self.write_if.init_write(address, data, burst, size, lock, cache, prot, qos, region, user, token) self.write_if.init_write(address, data, burst, size, lock, cache, prot, qos, region, user, wuser, token)
def idle(self): def idle(self):
return (not self.read_if or self.read_if.idle()) and (not self.write_if or self.write_if.idle()) return (not self.read_if or self.read_if.idle()) and (not self.write_if or self.write_if.idle())
@@ -764,41 +782,41 @@ class AxiMaster(object):
burst, size, lock, cache, prot, qos, region, user) burst, size, lock, cache, prot, qos, region, user)
async def write(self, address, data, awid=None, burst=AxiBurstType.INCR, size=None, async def write(self, address, data, awid=None, burst=AxiBurstType.INCR, size=None,
lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0): lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0, wuser=0):
return await self.write_if.write(address, data, awid, return await self.write_if.write(address, data, awid,
burst, size, lock, cache, prot, qos, region, user) burst, size, lock, cache, prot, qos, region, user, wuser)
async def write_words(self, address, data, ws=2, awid=None, burst=AxiBurstType.INCR, size=None, async def write_words(self, address, data, ws=2, awid=None, burst=AxiBurstType.INCR, size=None,
lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0): lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0, wuser=0):
return await self.write_if.write_words(address, data, ws, awid, return await self.write_if.write_words(address, data, ws, awid,
burst, size, lock, cache, prot, qos, region, user) burst, size, lock, cache, prot, qos, region, user, wuser)
async def write_dwords(self, address, data, awid=None, burst=AxiBurstType.INCR, size=None, async def write_dwords(self, address, data, awid=None, burst=AxiBurstType.INCR, size=None,
lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0): lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0, wuser=0):
return await self.write_if.write_dwords(address, data, awid, return await self.write_if.write_dwords(address, data, awid,
burst, size, lock, cache, prot, qos, region, user) burst, size, lock, cache, prot, qos, region, user, wuser)
async def write_qwords(self, address, data, awid=None, burst=AxiBurstType.INCR, size=None, async def write_qwords(self, address, data, awid=None, burst=AxiBurstType.INCR, size=None,
lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0): lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0, wuser=0):
return await self.write_if.write_qwords(address, data, awid, return await self.write_if.write_qwords(address, data, awid,
burst, size, lock, cache, prot, qos, region, user) burst, size, lock, cache, prot, qos, region, user, wuser)
async def write_byte(self, address, data, awid=None, burst=AxiBurstType.INCR, size=None, async def write_byte(self, address, data, awid=None, burst=AxiBurstType.INCR, size=None,
lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0): lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0, wuser=0):
return await self.write_if.write_byte(address, data, awid, return await self.write_if.write_byte(address, data, awid,
burst, size, lock, cache, prot, qos, region, user) burst, size, lock, cache, prot, qos, region, user, wuser)
async def write_word(self, address, data, ws=2, awid=None, burst=AxiBurstType.INCR, size=None, async def write_word(self, address, data, ws=2, awid=None, burst=AxiBurstType.INCR, size=None,
lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0): lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0, wuser=0):
return await self.write_if.write_word(address, data, ws, awid, return await self.write_if.write_word(address, data, ws, awid,
burst, size, lock, cache, prot, qos, region, user) burst, size, lock, cache, prot, qos, region, user, wuser)
async def write_dword(self, address, data, awid=None, burst=AxiBurstType.INCR, size=None, async def write_dword(self, address, data, awid=None, burst=AxiBurstType.INCR, size=None,
lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0): lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0, wuser=0):
return await self.write_if.write_dword(address, data, awid, return await self.write_if.write_dword(address, data, awid,
burst, size, lock, cache, prot, qos, region, user) burst, size, lock, cache, prot, qos, region, user, wuser)
async def write_qword(self, address, data, awid=None, burst=AxiBurstType.INCR, size=None, async def write_qword(self, address, data, awid=None, burst=AxiBurstType.INCR, size=None,
lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0): lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0, wuser=0):
return await self.write_if.write_qword(address, data, awid, return await self.write_if.write_qword(address, data, awid,
burst, size, lock, cache, prot, qos, region, user) burst, size, lock, cache, prot, qos, region, user, wuser)