コード例 #1
0
ファイル: SdramCtrlTester.py プロジェクト: svancau/SpinalHDL
class SdramTester(Infrastructure):
    def __init__(self,name,parent,cmd,rsp,clk,reset):
        Infrastructure.__init__(self, name, parent)
        StreamDriverMaster(cmd, self.genCmd, clk, reset)
        self.nonZeroRspCounter = 0
        self.cmdRandomizer = BoolRandomizer()
        self.writeRandomizer = BoolRandomizer()
        self.burstRandomizer = BoolRandomizer()
        self.lastAddr = 0
        self.closeIt = False
        self.ram = bytearray(b'\x00' * (1 << (9+2+2+1)))
        self.scorboard = ScorboardInOrder("scoreboard", self)
        StreamDriverSlave(rsp, clk, reset)
        # rsp.ready <= 1
        StreamMonitor(rsp, self.scorboard.uutPush, clk, reset)

    def canPhaseProgress(self, phase):
        return self.nonZeroRspCounter > 4000

    def startPhase(self, phase):
        Infrastructure.startPhase(self, phase)
        if phase == PHASE_WAIT_TASKS_END:
            self.closeIt = True

    def genCmd(self):
        if self.closeIt or not self.cmdRandomizer.get():
            return None

        trans = Transaction()

        if not self.burstRandomizer.get():
            trans.address = randBits(9+2+2)
        else:
            trans.address = self.lastAddr + 1
            trans.address = trans.address & ((1 << 13)-1)

        trans.write = self.writeRandomizer.get() and self.writeRandomizer.get()
        trans.mask = randBits(2)
        trans.data = randBits(16)
        trans.context = randBits(8)

        self.lastAddr = trans.address

        if trans.write == 0:
            rsp = Transaction()
            rsp.data = self.ram[trans.address*2] + (self.ram[trans.address*2+1] << 8)
            rsp.context = trans.context
            self.scorboard.refPush(rsp)
            if rsp.data != 0:
                self.nonZeroRspCounter += 1
                if self.nonZeroRspCounter % 50 == 0:
                    print("self.nonZeroRspCounter=" + str(self.nonZeroRspCounter))

        else:
            for i in xrange(2):
                if (trans.mask >> i) & 1 == 1:
                    self.ram[trans.address * 2 + i] = (trans.data >> (i*8)) & 0xFF

        return trans
コード例 #2
0
class MonitorAgent(Infrastructure):
    def __init__(self, name, parent, dut):
        Infrastructure.__init__(self, name, parent)
        self.dut = dut
        self.mem = [0 for i in range(1 << 8)]
        self.cmdA = Queue()
        self.cmdB = Queue()
        self.scoreboard = ScorboardInOrder("rspScordboard", self)
        StreamMonitor(Stream(dut, "io_cmdA"), self.onCmdA, dut.clk, dut.reset)
        StreamMonitor(Stream(dut, "io_cmdB"), self.onCmdB, dut.clk, dut.reset)
        StreamMonitor(Stream(dut, "io_rsp"), self.scoreboard.uutPush, dut.clk,
                      dut.reset)
        cocotb.fork(self.onMemWrite())

    @cocotb.coroutine
    def onMemWrite(self):
        while True:
            yield RisingEdge(self.dut.clk)
            if int(self.dut.io_memWrite_valid) == 1:
                self.mem[int(self.dut.io_memWrite_payload_address)] = int(
                    self.dut.io_memWrite_payload_data)

    def onCmdA(self, trans):
        self.cmdA.put(trans)
        self.genRsp()

    def onCmdB(self, trans):
        self.cmdB.put(trans)
        self.genRsp()

    def genRsp(self):
        if not self.cmdA.empty() and not self.cmdB.empty():
            cmdA = self.cmdA.get()
            cmdB = self.cmdB.get()

            rsp = Transaction()
            rsp.itself = self.mem[cmdA.itself] ^ cmdB.itself

            self.scoreboard.refPush(rsp)

    def hasEnoughSim(self):
        return self.scoreboard.refsCounter > 100
コード例 #3
0
ファイル: SlaveMonitor.py プロジェクト: zwxb/SpinalHDL
class WriteDataMonitor(Infrastructure):
    def __init__(self,name,parent,axi,dut):
        Infrastructure.__init__(self,name,parent)
        self.axi = axi
        self.dut = dut
        self.dataScoreboard = ScorboardInOrder("scoreboard", self)

    def createInfrastructure(self):
        StreamMonitor(self.axi.aw, self.onWriteCmd, self.dut.clk, self.dut.reset)
        StreamMonitor(self.axi.w, self.onWriteData, self.dut.clk, self.dut.reset)

    def onWriteCmd(self,cmd):
        for i in range(cmd.len + 1):
            writeData = Transaction()
            writeData.data = cmd.addr + i
            writeData.strb = (cmd.addr + i) & 0xF
            writeData.last = 1 if i == cmd.len else 0
            self.dataScoreboard.refPush(writeData)

    def onWriteData(self,trans):
        self.dataScoreboard.uutPush(trans)
コード例 #4
0
ファイル: SlaveMonitor.py プロジェクト: Snoopy87/SpinalHDL
class WriteDataMonitor(Infrastructure):
    def __init__(self,name,parent,axi,dut):
        Infrastructure.__init__(self,name,parent)
        self.axi = axi
        self.dut = dut
        self.dataScoreboard = ScorboardInOrder("scoreboard", self)

    def createInfrastructure(self):
        StreamMonitor(self.axi.aw, self.onWriteCmd, self.dut.clk, self.dut.reset)
        StreamMonitor(self.axi.w, self.onWriteData, self.dut.clk, self.dut.reset)

    def onWriteCmd(self,cmd):
        for i in xrange(cmd.len + 1):
            writeData = Transaction()
            writeData.data = cmd.addr + i
            writeData.strb = (cmd.addr + i) & 0xF
            writeData.last = 1 if i == cmd.len else 0
            self.dataScoreboard.refPush(writeData)

    def onWriteData(self,trans):
        self.dataScoreboard.uutPush(trans)
コード例 #5
0
class StreamFifoTester(Infrastructure):
    def __init__(self, name, parent, pushStream, popStream,
                 transactionGenerator, dutCounterTarget, clk, reset):
        Infrastructure.__init__(self, name, parent)
        self.pushStream = pushStream
        self.popStream = popStream
        self.clk = clk
        self.reset = reset
        self.dutCounter = 0
        self.closeIt = False
        self.transactionGenerator = transactionGenerator
        self.dutCounterTarget = dutCounterTarget
        self.pushRandomizer = BoolRandomizer()
        self.scoreboard = ScorboardInOrder("scoreboard", self)

    def createInfrastructure(self):
        StreamDriverMaster(self.pushStream, self.genPush, self.clk, self.reset)
        StreamDriverSlave(self.popStream, self.clk, self.reset)
        StreamMonitor(self.popStream, self.onUut, self.clk, self.reset)
        StreamMonitor(self.pushStream, self.onRef, self.clk, self.reset)

    def startPhase(self, phase):
        Infrastructure.startPhase(self, phase)
        if phase == PHASE_WAIT_TASKS_END:
            self.closeIt = True

    def genPush(self):
        if not self.closeIt and self.pushRandomizer.get():
            return self.transactionGenerator()

    def onUut(self, uut):
        self.dutCounter += 1
        self.scoreboard.uutPush(uut)

    def onRef(self, uut):
        self.scoreboard.refPush(uut)

    def canPhaseProgress(self, phase):
        return self.dutCounter > self.dutCounterTarget
コード例 #6
0
class MonitorAgent(Infrastructure):
    def __init__(self, name, parent, dut):
        Infrastructure.__init__(self, name, parent)

        self.txCmdScordboard = ScorboardInOrder("txCmdScordboard", self)
        self.txDataScordboard = ScorboardInOrder("txDataScordboard", self)
        StreamMonitor(Stream(dut, "io_tx_cmd"), self.txCmdScordboard.uutPush,
                      dut.clk, dut.reset)
        StreamMonitor(Stream(dut, "io_tx_data"), self.txDataScordboard.uutPush,
                      dut.clk, dut.reset)

        cmd = Transaction()
        cmd.ip = 0x33445566
        cmd.dstPort = 0x3456
        cmd.srcPort = 37984
        cmd.length = 1 + 8
        self.txCmdScordboard.refPush(cmd)

        cmd = Transaction()
        cmd.ip = 0x44556677
        cmd.dstPort = 0x4567
        cmd.srcPort = 37984
        cmd.length = 1 + 8
        self.txCmdScordboard.refPush(cmd)

        for i in xrange(2):
            data = Transaction()
            data.fragment = 0x22
            data.last = 0
            self.txDataScordboard.refPush(data)
            message = "test1234"
            for f in xrange(len(message)):
                data = Transaction()
                data.fragment = ord(message[f])
                data.last = (f == len(message) - 1)
                self.txDataScordboard.refPush(data)

    def hasEnoughSim(self):
        return self.txCmdScordboard.refsCounter == self.txCmdScordboard.uutsCounter and self.txDataScordboard.refsCounter == self.txDataScordboard.uutsCounter
コード例 #7
0
ファイル: SdramCtrlTester.py プロジェクト: zwxb/SpinalHDL
class SdramTester(Infrastructure):
    def __init__(self, name, parent, cmd, rsp, clk, reset):
        Infrastructure.__init__(self, name, parent)
        StreamDriverMaster(cmd, self.genCmd, clk, reset)
        self.nonZeroRspCounter = 0
        self.cmdRandomizer = BoolRandomizer()
        self.writeRandomizer = BoolRandomizer()
        self.burstRandomizer = BoolRandomizer()
        self.lastAddr = 0
        self.closeIt = False
        self.ram = bytearray(b'\x00' * (1 << (9 + 2 + 2 + 1)))
        self.scorboard = ScorboardInOrder("scoreboard", self)
        StreamDriverSlave(rsp, clk, reset)
        # rsp.ready <= 1
        StreamMonitor(rsp, self.scorboard.uutPush, clk, reset)

    def canPhaseProgress(self, phase):
        return self.nonZeroRspCounter > 4000

    def startPhase(self, phase):
        Infrastructure.startPhase(self, phase)
        if phase == PHASE_WAIT_TASKS_END:
            self.closeIt = True

    def genCmd(self):
        if self.closeIt or not self.cmdRandomizer.get():
            return None

        trans = Transaction()

        if not self.burstRandomizer.get():
            trans.address = randBits(9 + 2 + 2)
        else:
            trans.address = self.lastAddr + 1
            trans.address = trans.address & ((1 << 13) - 1)

        trans.write = self.writeRandomizer.get() and self.writeRandomizer.get()
        trans.mask = randBits(2)
        trans.data = randBits(16)
        trans.context = randBits(8)

        self.lastAddr = trans.address

        if trans.write == 0:
            rsp = Transaction()
            rsp.data = self.ram[trans.address *
                                2] + (self.ram[trans.address * 2 + 1] << 8)
            rsp.context = trans.context
            self.scorboard.refPush(rsp)
            if rsp.data != 0:
                self.nonZeroRspCounter += 1
                if self.nonZeroRspCounter % 50 == 0:
                    print(("self.nonZeroRspCounter=" +
                           str(self.nonZeroRspCounter)))

        else:
            for i in range(2):
                if (trans.mask >> i) & 1 == 1:
                    self.ram[trans.address * 2 + i] = (trans.data >>
                                                       (i * 8)) & 0xFF

        return trans