def genRxData(self):
        while self.getPhase() != PHASE_SIM:
            yield None

        for i in range(2):
            trans = Transaction()
            trans.last = 0
            trans.fragment = 0x55
            trans.nextDelay = 4
            yield trans

            trans = Transaction()
            trans.last = 1
            trans.fragment = 0x66
            trans.nextDelay = 10
            yield trans

        trans = Transaction()
        trans.last = 1
        trans.fragment = 0x11
        trans.nextDelay = 0
        yield trans

        trans = Transaction()
        trans.last = 1
        trans.fragment = 0x11
        yield trans

        while True:
            yield None
    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 range(2):
            data = Transaction()
            data.fragment = 0x22
            data.last = 0
            self.txDataScordboard.refPush(data)
            message = "test1234"
            for f in range(len(message)):
                data = Transaction()
                data.fragment = ord(message[f])
                data.last = (f == len(message)-1)
                self.txDataScordboard.refPush(data)
Beispiel #3
0
 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)
Beispiel #4
0
 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)
Beispiel #5
0
 def onReadCmd(self,trans):
     if trans.addr < self.base or trans.addr >= self.base + self.size:
         raise TestFailure("WRONG ADDRESS addr=%d base=%d size=%d" %(trans.addr,self.base,self.size))
     for i in xrange(trans.len+1):
         rsp = Transaction()
         rsp.data = trans.addr + i
         rsp.resp = 0
         rsp.hid = trans.hid
         if i == trans.len:
             rsp.last = 1
         else:
             rsp.last = 0
         queue = self.readRspQueues[trans.hid]
         if queue.empty():
             self.nonEmptyReadRspQueues.append(queue)
         queue.put(rsp)
Beispiel #6
0
    def genWrite(self):
        idOffset = randBits(2)
        writeCmd = Transaction()
        writeCmd.addr = self.genRandomAddress()
        if random.random() < 0.1:  # Random assertion of decoding error
            writeCmd.addr = 1 << 12
        writeCmd.hid = self.hid * 4 + idOffset  #Each master can use 4 id
        writeCmd.region = randBits(4)
        writeCmd.len = randBits(4)
        writeCmd.size = randBits(3)
        writeCmd.burst = randBits(2)
        writeCmd.lock = randBits(1)
        writeCmd.cache = randBits(4)
        writeCmd.qos = randBits(4)
        writeCmd.prot = randBits(3)
        self.writeCmdQueue.put(writeCmd)

        writeCmd.linkedDatas = []
        for i in range(writeCmd.len + 1):
            writeData = Transaction()
            writeData.data = randBits(32)
            writeData.strb = randBits(4)
            writeData.last = 1 if i == writeCmd.len else 0
            self.writeDataQueue.put(writeData)
            writeCmd.linkedDatas.append(writeData)

        self.idToWrites[writeCmd.hid].append(writeCmd)
Beispiel #7
0
 def genReadRsp(self):
     tasksQueue = self.getRandTaskList()
     if tasksQueue:
         if self.readRspIdleRand.get():
             task = tasksQueue.queue[0]
             trans = Transaction()
             trans.data = task.addr + task.progress
             trans.resp = 0
             trans.hid = task.hid
             task.progress += 1
             if task.progress == task.len + 1:
                 trans.last = 1
                 tasksQueue.get()
             else:
                 trans.last = 0
             return trans
Beispiel #8
0
 def onReadCmd(self, trans):
     if trans.addr < self.base or trans.addr >= self.base + self.size:
         raise TestFailure("WRONG ADDRESS addr=%d base=%d size=%d" %
                           (trans.addr, self.base, self.size))
     for i in range(trans.len + 1):
         rsp = Transaction()
         rsp.data = trans.addr + i
         rsp.resp = 0
         rsp.hid = trans.hid
         if i == trans.len:
             rsp.last = 1
         else:
             rsp.last = 0
         queue = self.readRspQueues[trans.hid]
         if queue.empty():
             self.nonEmptyReadRspQueues.append(queue)
         queue.put(rsp)
Beispiel #9
0
    def onReadCmd(self, cmd):
        for i in xrange(cmd.len + 1):
            rsp = Transaction()
            rsp.hid = cmd.hid
            if cmd.addr < (1 << 14):
                rsp.data = cmd.addr + i
                rsp.resp = 0
            else:
                rsp.data = 0
                rsp.resp = 3

            rsp.last = 1 if i == cmd.len else 0
            self.readRspScoreboard.refPush(rsp, cmd.hid)
Beispiel #10
0
    def onReadCmd(self,cmd):
        for i in xrange(cmd.len + 1):
            rsp = Transaction()
            rsp.hid = cmd.hid
            if cmd.addr < (1 << 14):
                rsp.data = cmd.addr + i
                rsp.resp = 0
            else:
                rsp.data = 0
                rsp.resp = 3

            rsp.last = 1 if i == cmd.len else 0
            self.readRspScoreboard.refPush(rsp, cmd.hid)
Beispiel #11
0
    def genWrite(self):
        idOffset = randBits(2)
        writeCmd = Transaction()
        writeCmd.addr = self.genRandomWriteAddress()
        writeCmd.hid = self.idBase + idOffset #Each master can use 4 id
        writeCmd.region = randBits(4)
        writeCmd.len = randBits(4)
        writeCmd.size = randBits(3)
        writeCmd.burst = randBits(2)
        writeCmd.lock = randBits(1)
        writeCmd.cache = randBits(4)
        writeCmd.qos = randBits(4)
        writeCmd.prot = randBits(3)
        self.writeCmdQueue.put(writeCmd)

        for i in xrange(writeCmd.len + 1):
            writeData = Transaction()
            writeData.data = writeCmd.addr + i
            writeData.strb = (writeCmd.addr + i) & 0xF
            writeData.last = 1 if i == writeCmd.len else 0
            self.writeDataQueue.put(writeData)
Beispiel #12
0
    def genWrite(self):
        idOffset = randBits(2)
        writeCmd = Transaction()
        writeCmd.addr = self.genRandomWriteAddress()
        writeCmd.hid = self.idBase + idOffset  #Each master can use 4 id
        writeCmd.region = randBits(4)
        writeCmd.len = randBits(4)
        writeCmd.size = randBits(3)
        writeCmd.burst = randBits(2)
        writeCmd.lock = randBits(1)
        writeCmd.cache = randBits(4)
        writeCmd.qos = randBits(4)
        writeCmd.prot = randBits(3)
        self.writeCmdQueue.put(writeCmd)

        for i in range(writeCmd.len + 1):
            writeData = Transaction()
            writeData.data = writeCmd.addr + i
            writeData.strb = (writeCmd.addr + i) & 0xF
            writeData.last = 1 if i == writeCmd.len else 0
            self.writeDataQueue.put(writeData)
Beispiel #13
0
    def rxThread(self):
        while True:
            data, addr = self.sock.recvfrom(2048)
            print "received message:", data, addr

            cmdTrans = Transaction()
            ipSplit = addr[0].split(".")
            cmdTrans.ip = 0
            for i in range(4):
                cmdTrans.ip |= int(ipSplit[i]) << (i * 8)
            cmdTrans.srcPort = addr[1]
            cmdTrans.dstPort = SERVER_PORT
            cmdTrans.length = len(data)
            self.rxCmdQueue.put(cmdTrans)

            for i in range(len(data)):
                dataTrans = Transaction()
                dataTrans.last = (i == len(data) - 1)
                dataTrans.fragment = ord(data[i])
                self.rxDataQueue.put(dataTrans)

            self.clkTocken[0] += 1000
Beispiel #14
0
    def genNewCmd(self):
        cmd = Transaction()
        cmd.hid = randBits(self.idWidth)  # Each master can use 4 id
        cmd.region = randBits(4)
        cmd.len = randBits(4)
        cmd.size = random.randint(0, self.maxDataBytes)
        cmd.burst = random.randint(0, 2)
        if cmd.burst == 2:
            cmd.len = random.choice([2, 4, 8, 16]) - 1
        else:
            cmd.len = randBits(4) + (16 if random.random() < 0.1 else
                                     0) + (32 if random.random() < 0.02 else 0)
        cmd.lock = randBits(1)
        cmd.cache = randBits(4)
        cmd.qos = randBits(4)
        cmd.prot = randBits(3)

        byteCount = (1 << cmd.size) * (cmd.len + 1)
        while (True):
            cmd.addr = self.genRandomeAddress() & ~((1 << cmd.size) - 1)
            if cmd.burst == 1:
                if cmd.addr + byteCount >= (1 << self.addressWidth):
                    continue
            if cmd.burst == 0:
                start = cmd.addr
                end = start + cmd.size

            if cmd.burst == 1:
                start = cmd.addr
                end = start + byteCount

            if cmd.burst == 2:
                start = cmd.addr & ~(byteCount - 1)
                end = start + byteCount

            if self.isAddressRangeBusy(start, end):
                continue
            break

        if self.readWriteRand.get():
            cmd.write = 1
            beatAddr = cmd.addr
            for i in range(cmd.len + 1):
                dataTrans = Transaction()
                dataTrans.data = randBits(self.dataWidth)
                dataTrans.strb = randBits(self.maxDataBytes)
                dataTrans.last = 1 if cmd.len == i else 0
                self.writeTasks.put(dataTrans)

                for s in range(self.maxDataBytes):
                    if (dataTrans.strb >> s) & 1 == 1:
                        self.ram[(beatAddr & ~(self.maxDataBytes - 1)) +
                                 s] = (dataTrans.data >> (s * 8)) & 0xFF
                beatAddr = Axi4AddrIncr(beatAddr, cmd.burst, cmd.len, cmd.size)

            writeRsp = Transaction()
            writeRsp.resp = 0
            writeRsp.hid = cmd.hid

            self.reservedAddresses[writeRsp] = [start, end]
            self.writeRspScoreboard.refPush(writeRsp, writeRsp.hid)
        else:
            cmd.write = 0

            beatAddr = cmd.addr
            for s in range(cmd.len + 1):
                readRsp = Transaction()
                addrBase = beatAddr & ~(self.maxDataBytes - 1)
                readRsp.data = 0
                for i in range(self.maxDataBytes):
                    readRsp.data |= self.ram[addrBase + i] << (i * 8)
                readRsp.resp = 0
                readRsp.last = 1 if cmd.len == s else 0
                readRsp.hid = cmd.hid
                if readRsp.last == 1:
                    self.reservedAddresses[readRsp] = [start, end]
                self.readRspScoreboard.refPush(readRsp, readRsp.hid)
                beatAddr = Axi4AddrIncr(beatAddr, cmd.burst, cmd.len, cmd.size)

        self.cmdTasks.put(cmd)
Beispiel #15
0
        def genNewCmd():
            length = random.randint(1, (lengthMax // lengthMin)) * lengthMin
            if self.doWriteInit:
                address = self.writeInitAddress
                self.writeInitAddress += length
            else:
                address = (random.randint(
                    0, addressRange // lengthMaxAll // len(self.bmbs) - 1) *
                           len(self.bmbs) + bmbId) * lengthMaxAll
            write = random.random() < 0.5 or self.doWriteInit
            beatCount = (length + bytePerBeat - 1) // bytePerBeat

            context = randBits(len(bmb.cmd.payload.fragment_context))
            print("* " + str(context) + " " + str(length) + " " +
                  str(bytePerBeat) + " " + str(beatCount))
            source = 0
            if not write:
                cmd = Transaction()
                cmd.last = True
                cmd.fragment_source = source
                cmd.fragment_opcode = 0
                cmd.fragment_address = address
                cmd.fragment_length = length - 1
                cmd.fragment_data = randBits(len(
                    bmb.cmd.payload.fragment_data))
                cmd.fragment_mask = randBits(len(
                    bmb.cmd.payload.fragment_mask))
                cmd.fragment_context = context
                cmdTasks.put(cmd)
                # print("***  R" + str(bmbId) + " " + hex(cmd.fragment_context))

                for beat in range(beatCount):
                    rsp = Transaction()
                    rsp.last = beat == beatCount - 1
                    rsp.fragment_source = source
                    rsp.fragment_context = context
                    rsp.fragment_opcode = 0
                    rsp.fragment_data = self.ram.read(
                        address + beat * bytePerBeat, bytePerBeat)
                    # print("***   " + str(bmbId) + " " + hex(rsp.fragment_context))
                    rspTasks.put(rsp)
            else:
                rsp = Transaction()
                rsp.last = True
                rsp.fragment_source = source
                rsp.fragment_context = context
                rsp.fragment_opcode = 0
                rsp.fragment_data = None
                rspTasks.put(rsp)
                # print("***   " + str(bmbId) + " " + hex(rsp.fragment_context))

                for beat in range(beatCount):
                    cmd = Transaction()
                    cmd.last = beat == beatCount - 1
                    cmd.fragment_opcode = 1
                    cmd.fragment_address = address
                    cmd.fragment_length = length - 1
                    cmd.fragment_source = source
                    cmd.fragment_context = context
                    cmd.fragment_data = randBits(
                        len(bmb.cmd.payload.fragment_data))
                    if self.doWriteInit:
                        cmd.fragment_mask = (
                            1 << len(bmb.cmd.payload.fragment_mask)) - 1
                    else:
                        cmd.fragment_mask = randBits(
                            len(bmb.cmd.payload.fragment_mask))
                    cmdTasks.put(cmd)
                    # print("***  W " + str(bmbId) + " " + hex(cmd.fragment_context) + " " + str(length))

                    self.ram.write(address + beat * bytePerBeat, bytePerBeat,
                                   cmd.fragment_data, cmd.fragment_mask)

            if self.writeInitAddress >= addressRange:
                self.writeInitAddress = False