From 344ec8d4cee8269e6f4d747112c6137e6f6aa182 Mon Sep 17 00:00:00 2001 From: Alex Forencich Date: Mon, 22 Mar 2021 21:21:34 -0700 Subject: [PATCH] Return event object from init_read and init_write; remove get_write_resp and get_read_data --- cocotbext/axi/axi_master.py | 72 +++++++++--------------------------- cocotbext/axi/axil_master.py | 72 +++++++++--------------------------- 2 files changed, 36 insertions(+), 108 deletions(-) diff --git a/cocotbext/axi/axi_master.py b/cocotbext/axi/axi_master.py index ca5f242..a6470d1 100644 --- a/cocotbext/axi/axi_master.py +++ b/cocotbext/axi/axi_master.py @@ -64,7 +64,6 @@ class AxiMasterWrite(Reset): self.write_command_queue = Queue() self.current_write_command = None - self.write_resp_queue = Queue() self.id_count = 2**len(self.aw_channel.bus.awid) self.cur_id = 0 @@ -108,7 +107,10 @@ class AxiMasterWrite(Reset): def init_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, wuser=0, event=None): - if event is not None and not isinstance(event, Event): + if event is None: + event = Event() + + if not isinstance(event, Event): raise ValueError("Expected event object") if awid is None or awid < 0: @@ -140,6 +142,8 @@ class AxiMasterWrite(Reset): cache, prot, qos, region, user, wuser, event) self.write_command_queue.put_nowait(cmd) + return event + def idle(self): return not self.in_flight_operations @@ -147,18 +151,9 @@ class AxiMasterWrite(Reset): while not self.idle(): await self._idle.wait() - def write_resp_ready(self): - return not self.write_resp_queue.empty() - - def get_write_resp(self): - if not self.write_resp_queue.empty(): - return self.write_resp_queue.get_nowait() - return 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, wuser=0): - event = Event() - self.init_write(address, data, awid, burst, size, lock, cache, prot, qos, region, user, wuser, event) + event = self.init_write(address, data, awid, burst, size, lock, cache, prot, qos, region, user, wuser) await event.wait() return event.data @@ -239,10 +234,6 @@ class AxiMasterWrite(Reset): if cmd.event: cmd.event.set(None) - while not self.write_resp_queue.empty(): - resp = self.write_resp_queue.get_nowait() - self.log.warning("Flushed write response during reset: %s", resp) - self.in_flight_operations = 0 self._idle.set() else: @@ -401,10 +392,7 @@ class AxiMasterWrite(Reset): write_resp = AxiWriteResp(cmd.address, cmd.length, resp, user) - if cmd.event is not None: - cmd.event.set(write_resp) - else: - self.write_resp_queue.put_nowait(write_resp) + cmd.event.set(write_resp) self.current_write_resp_command = None @@ -428,7 +416,6 @@ class AxiMasterRead(Reset): self.read_command_queue = Queue() self.current_read_command = None - self.read_data_queue = Queue() self.id_count = 2**len(self.ar_channel.bus.arid) self.cur_id = 0 @@ -470,7 +457,10 @@ class AxiMasterRead(Reset): def init_read(self, address, length, arid=None, burst=AxiBurstType.INCR, size=None, lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0, event=None): - if event is not None and not isinstance(event, Event): + if event is None: + event = Event() + + if not isinstance(event, Event): raise ValueError("Expected event object") if length < 0: @@ -497,6 +487,8 @@ class AxiMasterRead(Reset): cmd = AxiReadCmd(address, length, arid, burst, size, lock, cache, prot, qos, region, user, event) self.read_command_queue.put_nowait(cmd) + return event + def idle(self): return not self.in_flight_operations @@ -504,18 +496,9 @@ class AxiMasterRead(Reset): while not self.idle(): await self._idle.wait() - def read_data_ready(self): - return not self.read_data_queue.empty() - - def get_read_data(self): - if not self.read_data_queue.empty(): - return self.read_data_queue.get_nowait() - return None - async def read(self, address, length, arid=None, burst=AxiBurstType.INCR, size=None, lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0): - event = Event() - self.init_read(address, length, arid, burst, size, lock, cache, prot, qos, region, user, event) + event = self.init_read(address, length, arid, burst, size, lock, cache, prot, qos, region, user) await event.wait() return event.data @@ -595,10 +578,6 @@ class AxiMasterRead(Reset): if cmd.event: cmd.event.set(None) - while not self.read_data_queue.empty(): - resp = self.read_data_queue.get_nowait() - self.log.warning("Flushed read response during reset: %s", resp) - self.in_flight_operations = 0 self._idle.set() else: @@ -748,10 +727,7 @@ class AxiMasterRead(Reset): read_resp = AxiReadResp(cmd.address, data, resp, user) - if cmd.event is not None: - cmd.event.set(read_resp) - else: - self.read_data_queue.put_nowait(read_resp) + cmd.event.set(read_resp) self.current_read_resp_command = None @@ -771,11 +747,11 @@ class AxiMaster: def init_read(self, address, length, arid=None, burst=AxiBurstType.INCR, size=None, lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0, event=None): - self.read_if.init_read(address, length, arid, burst, size, lock, cache, prot, qos, region, user, event) + return self.read_if.init_read(address, length, arid, burst, size, lock, cache, prot, qos, region, user, event) def init_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, wuser=0, event=None): - self.write_if.init_write(address, data, awid, burst, size, lock, cache, prot, qos, region, user, wuser, event) + return self.write_if.init_write(address, data, awid, burst, size, lock, cache, prot, qos, region, user, wuser, event) def idle(self): return (not self.read_if or self.read_if.idle()) and (not self.write_if or self.write_if.idle()) @@ -791,18 +767,6 @@ class AxiMaster: async def wait_write(self): await self.write_if.wait() - def read_data_ready(self): - return self.read_if.read_data_ready() - - def get_read_data(self): - return self.read_if.get_read_data() - - def write_resp_ready(self): - return self.write_if.write_resp_ready() - - def get_write_resp(self): - return self.write_if.get_write_resp() - async def read(self, address, length, arid=None, burst=AxiBurstType.INCR, size=None, lock=AxiLockType.NORMAL, cache=0b0011, prot=AxiProt.NONSECURE, qos=0, region=0, user=0): return await self.read_if.read(address, length, arid, diff --git a/cocotbext/axi/axil_master.py b/cocotbext/axi/axil_master.py index 0e3a217..0179db7 100644 --- a/cocotbext/axi/axil_master.py +++ b/cocotbext/axi/axil_master.py @@ -60,7 +60,6 @@ class AxiLiteMasterWrite(Reset): self.write_command_queue = Queue() self.current_write_command = None - self.write_resp_queue = Queue() self.int_write_resp_command_queue = Queue() self.current_write_resp_command = None @@ -88,7 +87,10 @@ class AxiLiteMasterWrite(Reset): self._init_reset(reset, reset_active_level) def init_write(self, address, data, prot=AxiProt.NONSECURE, event=None): - if event is not None and not isinstance(event, Event): + if event is None: + event = Event() + + if not isinstance(event, Event): raise ValueError("Expected event object") self.in_flight_operations += 1 @@ -96,6 +98,8 @@ class AxiLiteMasterWrite(Reset): self.write_command_queue.put_nowait(AxiLiteWriteCmd(address, bytearray(data), prot, event)) + return event + def idle(self): return not self.in_flight_operations @@ -103,17 +107,8 @@ class AxiLiteMasterWrite(Reset): while not self.idle(): await self._idle.wait() - def write_resp_ready(self): - return not self.write_resp_queue.empty() - - def get_write_resp(self): - if not self.write_resp_queue.empty(): - return self.write_resp_queue.get_nowait() - return None - async def write(self, address, data, prot=AxiProt.NONSECURE): - event = Event() - self.init_write(address, data, prot, event) + event = self.init_write(address, data, prot) await event.wait() return event.data @@ -182,10 +177,6 @@ class AxiLiteMasterWrite(Reset): if cmd.event: cmd.event.set(None) - while not self.write_resp_queue.empty(): - resp = self.write_resp_queue.get_nowait() - self.log.warning("Flushed write response during reset: %s", resp) - self.in_flight_operations = 0 self._idle.set() else: @@ -268,10 +259,7 @@ class AxiLiteMasterWrite(Reset): write_resp = AxiLiteWriteResp(cmd.address, cmd.length, resp) - if cmd.event is not None: - cmd.event.set(write_resp) - else: - self.write_resp_queue.put_nowait(write_resp) + cmd.event.set(write_resp) self.current_write_resp_command = None @@ -295,7 +283,6 @@ class AxiLiteMasterRead(Reset): self.read_command_queue = Queue() self.current_read_command = None - self.read_data_queue = Queue() self.int_read_resp_command_queue = Queue() self.current_read_resp_command = None @@ -321,7 +308,10 @@ class AxiLiteMasterRead(Reset): self._init_reset(reset, reset_active_level) def init_read(self, address, length, prot=AxiProt.NONSECURE, event=None): - if event is not None and not isinstance(event, Event): + if event is None: + event = Event() + + if not isinstance(event, Event): raise ValueError("Expected event object") self.in_flight_operations += 1 @@ -329,6 +319,8 @@ class AxiLiteMasterRead(Reset): self.read_command_queue.put_nowait(AxiLiteReadCmd(address, length, prot, event)) + return event + def idle(self): return not self.in_flight_operations @@ -336,17 +328,8 @@ class AxiLiteMasterRead(Reset): while not self.idle(): await self._idle.wait() - def read_data_ready(self): - return not self.read_data_queue.empty() - - def get_read_data(self): - if not self.read_data_queue.empty(): - return self.read_data_queue.get_nowait() - return None - async def read(self, address, length, prot=AxiProt.NONSECURE): - event = Event() - self.init_read(address, length, prot, event) + event = self.init_read(address, length, prot) await event.wait() return event.data @@ -414,10 +397,6 @@ class AxiLiteMasterRead(Reset): if cmd.event: cmd.event.set(None) - while not self.read_data_queue.empty(): - resp = self.read_data_queue.get_nowait() - self.log.warning("Flushed read response during reset: %s", resp) - self.in_flight_operations = 0 self._idle.set() else: @@ -488,10 +467,7 @@ class AxiLiteMasterRead(Reset): read_resp = AxiLiteReadResp(cmd.address, data, resp) - if cmd.event is not None: - cmd.event.set(read_resp) - else: - self.read_data_queue.put_nowait(read_resp) + cmd.event.set(read_resp) self.current_read_resp_command = None @@ -510,10 +486,10 @@ class AxiLiteMaster: self.read_if = AxiLiteMasterRead(bus.read, clock, reset, reset_active_level) def init_read(self, address, length, prot=AxiProt.NONSECURE, event=None): - self.read_if.init_read(address, length, prot, event) + return self.read_if.init_read(address, length, prot, event) def init_write(self, address, data, prot=AxiProt.NONSECURE, event=None): - self.write_if.init_write(address, data, prot, event) + return self.write_if.init_write(address, data, prot, event) def idle(self): return (not self.read_if or self.read_if.idle()) and (not self.write_if or self.write_if.idle()) @@ -529,18 +505,6 @@ class AxiLiteMaster: async def wait_write(self): await self.write_if.wait() - def read_data_ready(self): - return self.read_if.read_data_ready() - - def get_read_data(self): - return self.read_if.get_read_data() - - def write_resp_ready(self): - return self.write_if.write_resp_ready() - - def get_write_resp(self): - return self.write_if.get_write_resp() - async def read(self, address, length, prot=AxiProt.NONSECURE): return await self.read_if.read(address, length, prot)