def driver_init(self): yield WaitWriteOnly() self.intf.en.write(self._enabled)
def monitor(self): """ Collect data from interface If onMonitorReady is present run it before setting ready and before data is read from the channel """ start = self.sim.now yield WaitCombRead() if not self._enabled: return if self.notReset(): yield WaitWriteOnly() if not self._enabled: return if self._readyComnsummed: # try to run onMonitorReady if there is any to preset value on signals potentially # going against main data flow of this channel onMonitorReady = getattr(self, "onMonitorReady", None) if onMonitorReady is not None: onMonitorReady() self._readyComnsummed = False # update rd signal only if required if self._lastRd != 1: self.set_ready(1) self._lastRd = 1 else: yield WaitCombRead() assert int(self.get_ready()) == self._lastRd, ( "Something changed the value of ready without notifying this agent" " which is responsible for this", self.sim.now, self.get_ready(), self._lastRd) if not self._enabled: return # wait for response of master yield WaitCombStable() if not self._enabled: return vld = self.get_valid() try: vld = int(vld) except ValueError: raise AssertionError(self.sim.now, self.intf, "vld signal is in invalid state") if vld: # master responded with positive ack, do read data d = self.get_data() if self._debugOutput is not None: name = self.intf._getFullName() self._debugOutput.write( f"{name:s}, read, {self.sim.now:d}: {d}\n") self.data.append(d) if self._afterRead is not None: self._afterRead() # data was read from th channel next ready bellongs to a different data chunk self._readyComnsummed = True else: self._readyComnsummed = True if self._lastRd != 0: yield WaitWriteOnly() # can not receive, say it to masters self.set_ready(0) self._lastRd = 0 else: assert int(self.get_ready()) == self._lastRd assert start == self.sim.now
def data_feed(): for d in test_data: yield WaitWriteOnly() io.inp.write(d) yield Timer(CLK_PERIOD)
def driver(self): """ Push data to interface set vld high and wait on rd in high then pass new data """ start = self.sim.now yield WaitWriteOnly() if not self._enabled: return # pop new data if there are not any pending if self.actualData is NOP and self.data: self.actualData = self.data.popleft() doSend = self.actualData is not NOP # update data on signals if is required if self.actualData is not self._lastWritten: if doSend: data = self.actualData else: data = None self.set_data(data) self._lastWritten = self.actualData yield WaitCombRead() if not self._enabled: return en = self.notReset() vld = int(en and doSend) if self._lastVld is not vld: yield WaitWriteOnly() self.set_valid(vld) self._lastVld = vld if not self._enabled: # we can not check rd it in this function because we can not wait # because we can be reactivated in this same time yield self.checkIfRdWillBeValid() return # wait for response of slave yield WaitCombStable() if not self._enabled: return rd = self.get_ready() try: rd = int(rd) except ValueError: raise AssertionError(self.sim.now, self.intf, "rd signal in invalid state") from None if not vld: assert start == self.sim.now return if rd: # slave did read data, take new one if self._debugOutput is not None: name = self.intf._getFullName() self._debugOutput.write( f"{name:s}, wrote, {self.sim.now:d}: {self.actualData}\n") a = self.actualData # pop new data, because actual was read by slave if self.data: self.actualData = self.data.popleft() else: self.actualData = NOP # try to run onDriverWriteAck if there is any onDriverWriteAck = getattr(self, "onDriverWriteAck", None) if onDriverWriteAck is not None: onDriverWriteAck() onDone = getattr(a, "onDone", None) if onDone is not None: onDone() assert start == self.sim.now