コード例 #1
0
ファイル: ioSlaveTester.py プロジェクト: zwxb/SpinalHDL
def i2cSlaveThread(cmdBus, rspBus, cmds, rsps, clk):
    rspBus.valid <= False
    while rsps:
        yield RisingEdge(clk)
        rspBus.valid <= False
        if cmdBus.valid == True:
            expected = cmds.pop(0)
            log.debug(expected)
            if expected == "start":
                assert cmdBus.payload.mode == 0
            elif expected == "stop":
                assert cmdBus.payload.mode == 3
            elif expected == "drive":
                assert cmdBus.payload.mode == 1
                rsp = rsps.pop(0)
                if rsp == "Z":
                    rspBus.valid <= True
                    rspBus.payload.enable <= False
                    rspBus.payload.data <= randInt(0, 1)
                elif isinstance(rsp, bool):
                    rspBus.valid <= True
                    rspBus.payload.enable <= True
                    rspBus.payload.data <= rsp
                else:
                    raise Exception(rsp)
            elif isinstance(expected, bool):
                assert cmdBus.payload.mode == 2
                assert cmdBus.payload.data == expected
            else:
                raise Exception("???")
コード例 #2
0
ファイル: ioSlaveTester.py プロジェクト: Snoopy87/SpinalHDL
def i2cSlaveThread(cmdBus, rspBus, cmds, rsps, clk):
    rspBus.valid <= False
    while rsps:
        yield RisingEdge(clk)
        rspBus.valid <= False
        if cmdBus.valid == True:
            expected = cmds.pop(0)
            log.debug(expected)
            if expected == "start":
                assert cmdBus.payload.mode == 0
            elif expected == "stop":
                assert cmdBus.payload.mode == 3
            elif expected == "drive":
                assert cmdBus.payload.mode == 1
                rsp = rsps.pop(0)
                if rsp == "Z":
                    rspBus.valid <= True
                    rspBus.payload.enable <= False
                    rspBus.payload.data <= randInt(0, 1)
                elif isinstance(rsp, bool):
                    rspBus.valid <= True
                    rspBus.payload.enable <= True
                    rspBus.payload.data <= rsp
                else:
                    raise Exception(rsp)
            elif isinstance(expected, bool):
                assert cmdBus.payload.mode == 2
                assert cmdBus.payload.data == expected
            else:
                raise Exception("???")
コード例 #3
0
def _setup_logging():
    global log

    def _reopen_stream_with_buffering(stream_name):
        try:
            if not getattr(sys, stream_name).isatty():
                setattr(sys, stream_name,
                        os.fdopen(getattr(sys, stream_name).fileno(), 'w', 1))
                return True
            return False
        except Exception as e:
            return e

    # If stdout/stderr are not TTYs, Python may not have opened them with line
    # buffering. In that case, try to reopen them with line buffering
    # explicitly enabled. This ensures that prints such as stack traces always
    # appear. Continue silently if this fails.
    _stdout_buffer_result = _reopen_stream_with_buffering('stdout')
    _stderr_buffer_result = _reopen_stream_with_buffering('stderr')

    # Don't set the logging up until we've attempted to fix the standard IO,
    # otherwise it will end up connected to the unfixed IO.
    cocotb.log.default_config()
    log = logging.getLogger(__name__)

    # we can't log these things until the logging is set up!
    if _stderr_buffer_result is True:
        log.debug("Reopened stderr with line buffering")
    if _stdout_buffer_result is True:
        log.debug("Reopened stdout with line buffering")
    if isinstance(_stdout_buffer_result, Exception) or isinstance(
            _stderr_buffer_result, Exception):
        if isinstance(_stdout_buffer_result, Exception):
            log.warning("Failed to ensure that stdout is line buffered",
                        exc_info=_stdout_buffer_result)
        if isinstance(_stderr_buffer_result, Exception):
            log.warning("Failed to ensure that stderr is line buffered",
                        exc_info=_stderr_buffer_result)
        log.warning("Some stack traces may not appear because of this.")

    del _stderr_buffer_result, _stdout_buffer_result
コード例 #4
0
def SlaveThread(scl, sda, clk, baudPeriod):
    global crapyConflictCounter
    global normalConflictCounter
    global normalTransactionCounter
    log.debug("x")
    IDLE = 0
    START = 1
    DATA = 2
    state = IDLE
    dataState = 0
    scl.write(True)
    sda.write(True)

    sclLast = True
    sdaLast = True
    while True:
        yield RisingEdge(clk)
        sclValue = scl.read()
        sdaValue = sda.read()
        sclRising = sclValue and not sclLast
        sclFalling = not sclValue and sclLast
        sdaRising = sdaValue and not sdaLast
        sdaFalling = not sdaValue and sdaLast
        sclLast = sclValue
        sdaLast = sdaValue
        if state == IDLE:
            if sdaFalling and sclValue:
                state = START
        elif state == START:
            if sclFalling:
                state = DATA
                dataState = 0
                address = 0
        elif state == DATA:
            if sclRising:
                if dataState < 8:
                    address |= sdaValue << (7 - dataState)
            elif sclFalling:
                dataState += 1
                if dataState >= 8 and dataState < 16:
                    if random.random() < 0.2:  #Clock stretching
                        scl.write(False)
                        yield Timer(randInt(baudPeriod / 10, baudPeriod * 10))
                        sda.write((cmdToData[address] >> (15 - dataState)) & 1)
                        yield Timer(baudPeriod / 4)
                        scl.write(True)
                        yield clockedFuncWaitTrue(clk, scl.read)
                        sclLast = False
                    else:
                        sda.write((cmdToData[address] >> (15 - dataState)) & 1)
                elif (dataState == 6 and random.random() < 0.2):
                    scl.write(False)
                    if random.random() < 0.2:  # Clock stretching
                        yield Timer(randInt(baudPeriod / 10, baudPeriod * 10))
                    yield Timer(baudPeriod / 2)
                    sda.write(False)
                    yield Timer(baudPeriod / 2)
                    scl.write(True)
                    yield clockedFuncWaitTrue(clk, scl.read)
                    yield Timer(baudPeriod)

                    if random.random() < 0.5:
                        #Normal conflict
                        normalConflictCounter += 1
                        for i in range(4):
                            rand = randBool()
                            scl.write(False)
                            yield Timer(baudPeriod / 2)
                            sda.write(rand)
                            yield Timer(baudPeriod / 2)
                            scl.write(True)
                            yield clockedFuncWaitTrue(clk, scl.read)
                            yield Timer(baudPeriod)
                            assert sda.read() == rand

                        scl.write(False)
                        yield Timer(baudPeriod / 2)
                        sda.write(False)
                        yield Timer(baudPeriod / 2)
                        scl.write(True)
                        yield clockedFuncWaitTrue(clk, scl.read)
                        yield Timer(baudPeriod)
                        sda.write(True)
                    else:
                        #crapy conflict wihtout STOP
                        crapyConflictCounter += 1
                        scl.write(False)
                        yield Timer(baudPeriod / 2)
                        sda.write(True)
                        yield Timer(baudPeriod / 2)
                        scl.write(True)
                        yield clockedFuncWaitTrue(clk, scl.read)
                        yield Timer(baudPeriod)
                    state = IDLE
                    continue
                else:
                    if random.random() < 0.2:  #Clock stretching
                        scl.write(False)
                        yield Timer(randInt(baudPeriod / 10, baudPeriod * 10))
                        sda.write(True)
                        yield Timer(baudPeriod / 4)
                        scl.write(True)
                        sclLast = False
                    else:
                        sda.write(True)
            elif sclValue:
                if sdaRising:
                    state = 0
                if sdaFalling:
                    state = 1
                    pass
コード例 #5
0
ファイル: __init__.py プロジェクト: supriyabendukuri/cocotb
    # If stdout/stderr are not TTYs, Python may not have opened them with line
    # buffering. In that case, try to reopen them with line buffering
    # explicitly enabled. This ensures that prints such as stack traces always
    # appear. Continue silently if this fails.
    _stdout_buffer_result = _reopen_stream_with_buffering('stdout')
    _stderr_buffer_result = _reopen_stream_with_buffering('stderr')

    # Don't set the logging up until we've attempted to fix the standard IO,
    # otherwise it will end up connected to the unfixed IO.
    cocotb.log.default_config()
    log = logging.getLogger(__name__)

    # we can't log these things until the logging is set up!
    if _stderr_buffer_result is True:
        log.debug("Reopened stderr with line buffering")
    if _stdout_buffer_result is True:
        log.debug("Reopened stdout with line buffering")
    if isinstance(_stdout_buffer_result, Exception) or isinstance(_stderr_buffer_result, Exception):
        if isinstance(_stdout_buffer_result, Exception):
            log.warning("Failed to ensure that stdout is line buffered", exc_info=_stdout_buffer_result)
        if isinstance(_stderr_buffer_result, Exception):
            log.warning("Failed to ensure that stderr is line buffered", exc_info=_stderr_buffer_result)
        log.warning("Some stack traces may not appear because of this.")

    del _stderr_buffer_result, _stdout_buffer_result

    # From https://www.python.org/dev/peps/pep-0565/#recommended-filter-settings-for-test-runners
    # If the user doesn't want to see these, they can always change the global
    # warning settings in their test module.
    if not sys.warnoptions:
コード例 #6
0
ファイル: ioMasterTester.py プロジェクト: Snoopy87/SpinalHDL
def SlaveThread(scl,sda,clk,baudPeriod):
    global crapyConflictCounter
    global normalConflictCounter
    global normalTransactionCounter
    log.debug("x")
    IDLE = 0
    START = 1
    DATA = 2
    state = IDLE
    dataState = 0
    scl.write(True)
    sda.write(True)

    sclLast = True
    sdaLast = True
    while True:
        yield RisingEdge(clk)
        sclValue = scl.read()
        sdaValue = sda.read()
        sclRising  =     sclValue and not sclLast
        sclFalling = not sclValue and     sclLast
        sdaRising  =     sdaValue and not sdaLast
        sdaFalling = not sdaValue and     sdaLast
        sclLast = sclValue
        sdaLast = sdaValue
        if state == IDLE:
            if sdaFalling and sclValue:
                state = START
        elif state == START:
            if sclFalling:
                state = DATA
                dataState = 0
                address = 0
        elif state == DATA:
            if sclRising:
                if dataState < 8:
                    address |= sdaValue << (7-dataState)
            elif sclFalling:
                dataState += 1
                if dataState >= 8 and dataState < 16:
                    if random.random() < 0.2: #Clock stretching
                        scl.write(False)
                        yield Timer(randInt(baudPeriod/10, baudPeriod*10))
                        sda.write((cmdToData[address] >> (15-dataState)) & 1)
                        yield Timer(baudPeriod/4);
                        scl.write(True)
                        yield clockedFuncWaitTrue(clk, scl.read)
                        sclLast = False
                    else:
                        sda.write((cmdToData[address] >> (15 - dataState)) & 1)
                elif(dataState == 6 and random.random() < 0.2):
                    scl.write(False)
                    if random.random() < 0.2:  # Clock stretching
                        yield Timer(randInt(baudPeriod / 10, baudPeriod * 10))
                    yield Timer(baudPeriod / 2)
                    sda.write(False)
                    yield Timer(baudPeriod / 2)
                    scl.write(True)
                    yield clockedFuncWaitTrue(clk, scl.read)
                    yield Timer(baudPeriod)

                    if random.random() < 0.5:
                        #Normal conflict
                        normalConflictCounter += 1
                        for i in range(4):
                            rand = randBool()
                            scl.write(False)
                            yield Timer(baudPeriod/2)
                            sda.write(rand)
                            yield Timer(baudPeriod/2)
                            scl.write(True)
                            yield clockedFuncWaitTrue(clk, scl.read)
                            yield Timer(baudPeriod)
                            assert sda.read() == rand

                        scl.write(False)
                        yield Timer(baudPeriod / 2)
                        sda.write(False)
                        yield Timer(baudPeriod / 2)
                        scl.write(True)
                        yield clockedFuncWaitTrue(clk, scl.read)
                        yield Timer(baudPeriod)
                        sda.write(True)
                    else:
                        #crapy conflict wihtout STOP
                        crapyConflictCounter += 1
                        scl.write(False)
                        yield Timer(baudPeriod / 2)
                        sda.write(True)
                        yield Timer(baudPeriod / 2)
                        scl.write(True)
                        yield clockedFuncWaitTrue(clk, scl.read)
                        yield Timer(baudPeriod)
                    state = IDLE
                    continue
                else:
                    if random.random() < 0.2: #Clock stretching
                        scl.write(False)
                        yield Timer(randInt(baudPeriod/10, baudPeriod*10))
                        sda.write(True)
                        yield Timer(baudPeriod/4);
                        scl.write(True)
                        sclLast = False
                    else:
                        sda.write(True)
            elif sclValue:
                if sdaRising:
                    state = 0
                if sdaFalling:
                    state = 1
                    pass