2

我刚开始使用 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 并测试了 repo 中包含的一些示例。axi_slave 测试工作正常,所以我假设我的设置工作正常。

有人猜测可能导致问题的原因吗?

4

2 回答 2

2

你需要yield你的协程,而不是直接调用它。

于 2020-01-15T16:54:07.270 回答
1

请注意,如果您使用新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
于 2020-01-27T20:24:47.650 回答