Exemplo n.º 1
0
 def driver_init(self):
     yield WaitWriteOnly()
     self.intf.en.write(self._enabled)
Exemplo n.º 2
0
    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
Exemplo n.º 3
0
 def data_feed():
     for d in test_data:
         yield WaitWriteOnly()
         io.inp.write(d)
         yield Timer(CLK_PERIOD)
Exemplo n.º 4
0
    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