Cocotb сопрограмму никогда не звонил - PullRequest
2 голосов
/ 15 января 2020

Я только начал использовать cocotb, и у меня возникла проблема с небольшим фрагментом кода, который должен использовать сопрограмму.

import cocotb
from cocotb.triggers import Timer

@cocotb.coroutine
def test(dut):
    dut.a <= 1
    dut.b <= 2
    cocotb.log.info('test')
    yield Timer(1, unit='ns')

@cocotb.test()
def add_corner(dut):
    dut.uop <= 0b0
    dut.src <= 0b01
    test(dut)
    yield Timer(1, units='ns')
    dut._log.info('done')

Симуляция создана и выполняется, но сопрограмма никогда не вызывается. Ни сообщение журнала, ни назначения не выполняются.

Я использую python 3.8, и я протестировал несколько примеров, содержащихся в репо. Тест axi_slave работает нормально, поэтому я предполагаю, что мои настройки работают.

У кого-нибудь есть догадки о том, что может вызвать проблему?

Ответы [ 2 ]

2 голосов
/ 15 января 2020

Вам нужно yield свою сопрограмму, а не вызывать ее напрямую.

1 голос
/ 27 января 2020

Обратите внимание, что если вы используете новый синтаксис await, вы получите предупреждение, если сделаете эту ошибку:

import cocotb
from cocotb.triggers import Timer

# note: no coroutine decorator needed (or wanted)
async def test(dut):
    dut.a <= 1
    dut.b <= 2
    cocotb.log.info('test')
    await Timer(1, unit='ns')

@cocotb.test()
async def add_corner(dut):
    dut.uop <= 0b0
    dut.src <= 0b01
    test(dut)  # whoops - missing await
    await Timer(1, units='ns')
    dut._log.info('done')

дает

RuntimeWarning: coroutine 'test' was never awaited
...