from typing import Callable from myhdl import * from myhdl_wrap import Myhdl_Wrapper import random from random import randint random.seed(63) class Template(Myhdl_Wrapper): def __init__(self): super().__init__() # Main code, this is the actual logic @staticmethod @block def Template(args): # this must be the same name as the class name @instance def logic(): while True: ... return logic @block def tb(self, func: Callable): reset = Signal(False) clk = Signal(False) ... dut = func(..., clk=clk, reset=reset) @always(delay(...)) def clock_gen(): clk.next = not clk @instance def monitor(): while True: ... @instance def stimulus(): ... raise StopSimulation return dut, clock_gen, monitor, stimulus def export(self): reset = Signal(False) clk = Signal(False) ... # assigning signals, kargs only self._export(..., clk=clk, reset=reset) def test_template_sim(): hdl = Template() hdl.sim() def test_template_cosim(): hdl = Template() hdl.export() hdl.cosim()