Пример #1
0
    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
    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)
Пример #3
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)
Пример #4
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)
Пример #5
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)
Пример #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)
Пример #7
0
 def write(self, address, data):
     aw = Transaction()
     aw.addr = address
     aw.prot = 0
     self.awQueue.put(aw)
     w = Transaction()
     w.data = data
     w.strb = 0xF
     self.wQueue.put(w)
     while True:
         yield RisingEdge(self.clk)
         if self.axiLite.b.valid == True and self.axiLite.b.ready == True:
             break
Пример #8
0
    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
Пример #9
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)
Пример #10
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
Пример #11
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)
Пример #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 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)
Пример #13
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)
Пример #14
0
    def run(self):
        global crapyConflictCounter
        global normalConflictCounter
        global normalTransactionCounter
        yield Timer(self.baudPeriod * 10)

        while crapyConflictCounter < 2 or normalConflictCounter < 3 or normalTransactionCounter < 40:
            while True:
                colision = False

                cmd = Transaction()
                cmd.mode = 0
                cmd.data = randBool()
                self.cmdQueue.append(cmd)

                address = randBits(8) | 2
                for bitId in range(8):
                    cmd = Transaction()
                    cmd.mode = 1
                    cmd.data = (address >> (7 - bitId)) & 1
                    self.cmdQueue.append(cmd)
                    yield clockedWaitTrue(self.clk, self.rsp.valid)

                    if self.rsp.payload.data != cmd.data:
                        assert bitId == 6
                        colision = True
                        cmd = Transaction()
                        cmd.mode = 3  #DROP
                        cmd.data = randBool()
                        self.cmdQueue.append(cmd)
                        break
                if colision:
                    continue

                for bitId in range(8):
                    cmd = Transaction()
                    cmd.mode = 1
                    cmd.data = True
                    self.cmdQueue.append(cmd)
                    yield clockedWaitTrue(self.clk, self.rsp.valid)
                    assert self.rsp.payload.data == ((cmdToData[address] >>
                                                      (7 - bitId)) & 1)

                if random.random() < 0.75:
                    cmd = Transaction()
                    cmd.mode = 2
                    cmd.data = randBool()
                    self.cmdQueue.append(cmd)
                    if random.random() < 0.75:  #no other master frame
                        if random.random() < 0.5:  # With inter frame delay
                            yield Timer(randInt(0, self.baudPeriod * 20))
                    else:

                        @coroutine
                        def anotherFrameEmiter():
                            yield self.softMaster.sendStart()
                            for i in range(5):
                                yield self.softMaster.sendBit(randBool())
                            yield self.softMaster.sendStop()

                        yield Timer(
                            randInt(self.baudPeriod * 4, self.baudPeriod * 10))
                        fork(anotherFrameEmiter())
                        yield Timer(
                            randInt(self.baudPeriod * 1, self.baudPeriod * 14))
                normalTransactionCounter += 1
                break

        while self.cmdQueue:
            yield Timer(self.baudPeriod * 10)
Пример #15
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)
Пример #16
0
    def run(self):
        global crapyConflictCounter
        global normalConflictCounter
        global normalTransactionCounter
        yield Timer(self.baudPeriod * 10)

        while crapyConflictCounter < 2 or normalConflictCounter < 3 or normalTransactionCounter < 40:
            while True:
                colision = False

                cmd = Transaction()
                cmd.mode = 0
                cmd.data = randBool()
                self.cmdQueue.append(cmd)

                address = randBits(8) | 2
                for bitId in range(8):
                    cmd = Transaction()
                    cmd.mode = 1
                    cmd.data = (address >> (7 - bitId)) & 1
                    self.cmdQueue.append(cmd)
                    yield clockedWaitTrue(self.clk,self.rsp.valid)

                    if self.rsp.payload.data != cmd.data:
                        assert bitId == 6
                        colision = True
                        cmd = Transaction()
                        cmd.mode = 3 #DROP
                        cmd.data = randBool()
                        self.cmdQueue.append(cmd)
                        break
                if colision:
                    continue

                for bitId in range(8):
                    cmd = Transaction()
                    cmd.mode = 1
                    cmd.data = True
                    self.cmdQueue.append(cmd)
                    yield clockedWaitTrue(self.clk,self.rsp.valid)
                    assert self.rsp.payload.data == ((cmdToData[address] >> (7-bitId)) & 1)

                if random.random() < 0.75:
                    cmd = Transaction()
                    cmd.mode = 2
                    cmd.data = randBool()
                    self.cmdQueue.append(cmd)
                    if random.random() < 0.75: #no other master frame
                        if random.random() < 0.5: # With inter frame delay
                            yield Timer(randInt(0,self.baudPeriod*20))
                    else:
                        @coroutine
                        def anotherFrameEmiter():
                            yield self.softMaster.sendStart()
                            for i in range(5):
                                yield self.softMaster.sendBit(randBool())
                            yield self.softMaster.sendStop()

                        yield Timer(randInt(self.baudPeriod * 4, self.baudPeriod * 10))
                        fork(anotherFrameEmiter())
                        yield Timer(randInt(self.baudPeriod * 1, self.baudPeriod * 14))
                normalTransactionCounter += 1
                break


        while self.cmdQueue:
            yield Timer(self.baudPeriod * 10)