.. _refcard: ************** Reference Card ************** .. Document "best practice"; leave out detail. Keep format as 1/3rd width of A4/Letter for taping to monitor frames. The "| " syntax is a "Line Block", see https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#line-blocks .. spelling:word-list:: coro coros func metavalue TestFactory *coro*: a coroutine; *task*: a concurrently-running coroutine; *trigger*: a trigger +------------------------+-----------------------------------------------------------------+ | Assign | ``dut.mysignal.value = 0xFF00`` | +------------------------+-----------------------------------------------------------------+ | Assign immediately | ``dut.mysignal.value = Immediate(0xFF00)`` | +------------------------+-----------------------------------------------------------------+ | Assign metavalue | | ``dut.mysignal.value = Logic("X")`` | | | | ``dut.mysignal.value = LogicArray("01XZ")`` | +------------------------+-----------------------------------------------------------------+ | Read | | ``val = dut.mysignal.value`` | | | | (``mysig = dut.mysignal`` *creates an alias/reference*) | +------------------------+-----------------------------------------------------------------+ | Bit slice | | ``mybit = dut.mysignal.value[0]`` | | | | ``mybits = dut.mysignal.value[3:1]`` | +------------------------+-----------------------------------------------------------------+ | Convert | | ``val = dut.mysignal.value.to_unsigned()`` | | | | ``val = dut.mysignal.value.to_signed()`` | | | | ``val = dut.mysignal.value.to_bytes(byteorder="little")`` | | | | ``val = str(dut.mysignal.value)`` | +------------------------+-----------------------------------------------------------------+ | Vector length | ``num_bits = len(dut.mysignal)`` | +------------------------+-----------------------------------------------------------------+ | Check | ``assert dut.mysignal.value == exp, "Not as expected!"`` | +------------------------+---------------+-------------------------------------------------+ | Access Extended / Escaped Identifiers | ``dut["\\!Hello!\\"]`` | +----------------------------------------+-------------------------------------------------+ | | +------------------------+-----------------------------------------------------------------+ | Wait time | ``await cocotb.triggers.Timer(12, "ns")`` | +------------------------+-----------------------------------------------------------------+ | Wait for signal edge | | ``await cocotb.triggers.RisingEdge(dut.mysignal)`` | | | | ``await cocotb.triggers.FallingEdge(dut.mysignal)`` | | | | ``await cocotb.triggers.Edge(dut.mysignal)`` | +------------------------+-----------------------------------------------------------------+ | | +------------------------+-----------------------------------------------------------------+ | Run coros concurrently | | ``task_0 = await cocotb.start(coro_0())`` (start coro now) | | | | ``task_1 = cocotb.start_soon(coro)`` | | | | ``result = await task_0`` | +------------------------+-----------------------------------------------------------------+ | Cancel task | ``task_0.cancel()`` | +------------------------++----------------------------------------------------------------+ | Wait for task to finish | ``await task_0.complete`` | +------------------------++----------------------------------------------------------------+ | | +-------------------------------+----------------------------------------------------------+ | Resume on any Task or Trigger | ``await cocotb.triggers.First(task_0, trigger_1)`` | +-------------------------------+----------------------------------------------------------+ | Resume on all Task or Trigger | ``await cocotb.triggers.Combine(task_0, trigger_1)`` | +-------------------------------+----------------------------------------------------------+ | | +------------------------+-----------------------------------------------------------------+ | Generate clock | ``clk = Clock(dut.clk, 12, "ns").start()`` | +------------------------+-----------------------------------------------------------------+ | | +------------------------+-----------------------------------------------------------------+ | Queue write | | ``await cocotb.queue.Queue.put(item)`` | | | | ``cocotb.queue.Queue.put_nowait(item)`` | +------------------------+-----------------------------------------------------------------+ | Queue read | | ``item = await cocotb.queue.Queue.get()`` | | | | ``item = cocotb.queue.Queue.get_nowait()`` | +------------------------+-----------------------------------------------------------------+ | Queue attributes | | ``queue.maxsize`` (``None`` *== unlimited*) | | | | ``queue.qsize()`` | | | | ``queue.empty()`` | | | | ``queue.full()`` | +------------------------+-----------------------------------------------------------------+ | Specialized queues | ``.PriorityQueue``, ``.LifoQueue`` | +------------------------+-----------------------------------------------------------------+ | | +------------------------+-----------------------------------------------------------------+ | Set up event | ``e = cocotb.triggers.Event()`` | +------------------------+-----------------------------------------------------------------+ | Wake up waiters | ``e.set()`` | +------------------------+-----------------------------------------------------------------+ | Wait until ``set()`` | ``await e.wait()`` | +------------------------+-----------------------------------------------------------------+ | Reset after ``set()`` | ``e.clear()`` | +------------------------+-----------------------------------------------------------------+ | Timeout | ``await cocotb.triggers.with_timeout(coro, 1, "us")`` | +------------------------+-----------------------------------------------------------------+ | | +------------------------+-----------------------------------------------------------------+ | Force value | ``dut.mysignal.value = cocotb.handle.Force(0xFF00)`` | +------------------------+-----------------------------------------------------------------+ | Keep value | ``dut.mysignal.value = cocotb.handle.Freeze()`` | +------------------------+-----------------------------------------------------------------+ | Release Force/Freeze | ``dut.mysignal.value = cocotb.handle.Release()`` | +------------------------+-----------------------------------------------------------------+ | *Normal assignment is a "deposit"* (``cocotb.handle.Deposit()``) | +------------------------+-----------------------------------------------------------------+ | | +------------------------+-----------------------------------------------------------------+ | Mark as test | ``@cocotb.test(skip, expect_fail, timeout_time, timeout_unit)`` | +------------------------+-----------+-----------------------------------------------------+ | | +------------------------+-----------------------------------------------------------------+ | Set up TestFactory | ``tf = cocotb.regression.TestFactory(coro)`` | +------------------------+-----------------------------------------------------------------+ | Add test option | ``tf.add_option("arg", ["val0", "val1"])`` | +------------------------+-----------------------------------------------------------------+ | Generate tests | ``tf.generate_tests()`` | +----------------------+-+-----------------------------------------------------------------+ | Parametrize test | | ``@cocotb.parametrize(arg1=[1, 2], arg2=["yes", "no"])`` | | | | ``@cocotb.parametrize(("arg1", "arg2"), [(1, "a"), (3, "b")])`` | +----------------------+-------------------------------------------------------------------+