получая сопрограмму в списке с cocotb - PullRequest
0 голосов
/ 17 октября 2018

У меня есть сопрограмма, которая ожидает установки события:

@cocotb.coroutine
def wb_RXDR_read(self):
    """ waiting util RXDR is read """
    if not self._RXDR_read_flag:
        while True:
            yield self._RXDR_read_event.wait()
            break

Я хочу «уступить» ему с таймаутом.Затем, чтобы сделать это, я сделал это:

        RXDR_timeout = Timer(250, units="us")
        ret = yield [RXDR_timeout, self.wb_RXDR_read()]
        if ret == RXDR_timeout:
            self._dut._log.error("Timeout on waiting RXDR to be read")
            raise TestError()

Но я получаю эту ошибку:

2ns ERROR    Coroutine i2c_write yielded something the scheduler can't handle
                      Got type: <type 'list'> repr: [<cocotb.triggers.Timer object at 0x7f2098cb1350>, <cocotb.decorators.RunningCoroutine object at 0x7f2098cb1610>] str: [<cocotb.triggers.Timer object at 0x7f2098cb1350>, <cocotb.decorators.RunningCoroutine object at 0x7f2098cb1610>]
                      Did you forget to decorate with @cocotb.coroutine?

Моя сопрограмма украшена @ cocotb.coroutine.Если я приведу его один, это сработает:

yield self.wb_RXDR_read() # <- that works

Но я не могу поместить его в списокМожно ли поместить сопрограмму в список, чтобы блокировать, как unix select ()?Или это зарезервировано для класса Trigger?

1 Ответ

0 голосов
/ 29 октября 2018

Хорошо, я нашел решение.На самом деле Coroutine не может быть запущен в избранном, как сама мода.Сначала он должен быть запущен как поток, и для определения конца сопрограммы в список выхода должен быть добавлен метод .join():

    RXDR_timeout = Timer(250, units="us")
    RXDR_readth = cocotb.fork(self.wb_RXDR_read())
    ret = yield [RXDR_timeout, RXDR_readth.join()]
    if ret == RXDR_timeout:
        self._dut._log.error("Timeout on waiting RXDR to be read")
        raise TestError()

Помните:

  • Мы можем получить одну сопрограмму
  • Чтобы получить несколько сопрограмм, нам нужно fork() и join()
...