class TB(object): def __init__(self, dut): self.dut = dut self.log = logging.getLogger("cocotb.tb") self.log.setLevel(logging.DEBUG) cocotb.start_soon(Clock(dut.clk, 4, units="ns").start()) self.source = AxiStreamSource(AxiStreamBus.from_prefix(dut, "s_axis"), dut.clk, dut.rst) self.sink = HashSink(HashBus.from_prefix(dut, "m_axis"), dut.clk, dut.rst) hash_key = [ 0x6d, 0x5a, 0x56, 0xda, 0x25, 0x5b, 0x0e, 0xc2, 0x41, 0x67, 0x25, 0x3d, 0x43, 0xa3, 0x8f, 0xb0, 0xd0, 0xca, 0x2b, 0xcb, 0xae, 0x7b, 0x30, 0xb4, 0x77, 0xcb, 0x2d, 0xa3, 0x80, 0x30, 0xf2, 0x0c, 0x6a, 0x42, 0xb7, 0x3b, 0xbe, 0xac, 0x01, 0xfa ] self.set_hash_key(hash_key) def set_idle_generator(self, generator=None): if generator: self.source.set_pause_generator(generator()) def set_hash_key(self, key): self.hash_key = key self.dut.hash_key <= int.from_bytes(key, 'big') async def reset(self): self.dut.rst.setimmediatevalue(0) await RisingEdge(self.dut.clk) await RisingEdge(self.dut.clk) self.dut.rst <= 1 await RisingEdge(self.dut.clk) await RisingEdge(self.dut.clk) self.dut.rst <= 0 await RisingEdge(self.dut.clk) await RisingEdge(self.dut.clk)
class TB(object): def __init__(self, dut): self.dut = dut ports = len(dut.axis_demux_inst.m_axis_tvalid) self.log = logging.getLogger("cocotb.tb") self.log.setLevel(logging.DEBUG) cocotb.start_soon(Clock(dut.clk, 10, units="ns").start()) self.source = AxiStreamSource(AxiStreamBus.from_prefix(dut, "s_axis"), dut.clk, dut.rst) self.sink = [ AxiStreamSink(AxiStreamBus.from_prefix(dut, f"m{k:02d}_axis"), dut.clk, dut.rst) for k in range(ports) ] dut.enable.setimmediatevalue(0) dut.drop.setimmediatevalue(0) dut.select.setimmediatevalue(0) def set_idle_generator(self, generator=None): if generator: self.source.set_pause_generator(generator()) def set_backpressure_generator(self, generator=None): if generator: for sink in self.sink: sink.set_pause_generator(generator()) async def reset(self): self.dut.rst.setimmediatevalue(0) await RisingEdge(self.dut.clk) await RisingEdge(self.dut.clk) self.dut.rst.value = 1 await RisingEdge(self.dut.clk) await RisingEdge(self.dut.clk) self.dut.rst.value = 0 await RisingEdge(self.dut.clk) await RisingEdge(self.dut.clk)
class TB(object): def __init__(self, dut): self.dut = dut self.log = logging.getLogger("cocotb.tb") self.log.setLevel(logging.DEBUG) cocotb.start_soon(Clock(dut.clk, 10, units="ns").start()) # write interface self.write_desc_source = DescSource(DescBus.from_prefix(dut, "s_axis_write_desc"), dut.clk, dut.rst) self.write_desc_status_sink = DescStatusSink(DescStatusBus.from_prefix(dut, "m_axis_write_desc_status"), dut.clk, dut.rst) self.write_data_source = AxiStreamSource(AxiStreamBus.from_prefix(dut, "s_axis_write_data"), dut.clk, dut.rst) # AXI interface self.axi_ram = AxiRamWrite(AxiWriteBus.from_prefix(dut, "m_axi"), dut.clk, dut.rst, size=2**16) dut.enable.setimmediatevalue(0) dut.abort.setimmediatevalue(0) def set_idle_generator(self, generator=None): if generator: self.write_desc_source.set_pause_generator(generator()) self.write_data_source.set_pause_generator(generator()) self.axi_ram.b_channel.set_pause_generator(generator()) def set_backpressure_generator(self, generator=None): if generator: self.axi_ram.aw_channel.set_pause_generator(generator()) async def cycle_reset(self): self.dut.rst.setimmediatevalue(0) await RisingEdge(self.dut.clk) await RisingEdge(self.dut.clk) self.dut.rst.value = 1 await RisingEdge(self.dut.clk) await RisingEdge(self.dut.clk) self.dut.rst.value = 0 await RisingEdge(self.dut.clk) await RisingEdge(self.dut.clk)
class TB(object): def __init__(self, dut): self.dut = dut self.log = logging.getLogger("cocotb.tb") self.log.setLevel(logging.DEBUG) cocotb.start_soon(Clock(dut.clk, 10, units="ns").start()) self.source = AxiStreamSource(AxiStreamBus.from_prefix(dut, "s_axis"), dut.clk, dut.rst) self.sink = AxiStreamSink(AxiStreamBus.from_prefix(dut, "m_axis"), dut.clk, dut.rst) # Status self.status_sink = StatusSink(StatusBus.from_prefix(dut, "status"), dut.clk, dut.rst) self.dut.length_min.setimmediatevalue(0) self.dut.length_max.setimmediatevalue(2048) def set_idle_generator(self, generator=None): if generator: self.source.set_pause_generator(generator()) def set_backpressure_generator(self, generator=None): if generator: self.sink.set_pause_generator(generator()) async def reset(self): self.dut.rst.setimmediatevalue(0) await RisingEdge(self.dut.clk) await RisingEdge(self.dut.clk) self.dut.rst.value = 1 await RisingEdge(self.dut.clk) await RisingEdge(self.dut.clk) self.dut.rst.value = 0 await RisingEdge(self.dut.clk) await RisingEdge(self.dut.clk)
class TB: def __init__(self, dut): self.dut = dut self.log = logging.getLogger("cocotb.tb") self.log.setLevel(logging.DEBUG) cocotb.fork(Clock(dut.clk, 8, units="ns").start()) self.header_source = EthHdrSource(EthHdrBus.from_prefix(dut, "s_eth"), dut.clk, dut.rst) self.payload_source = AxiStreamSource( AxiStreamBus.from_prefix(dut, "s_eth_payload_axis"), dut.clk, dut.rst) self.sink = AxiStreamSink(AxiStreamBus.from_prefix(dut, "m_axis"), dut.clk, dut.rst) def set_idle_generator(self, generator=None): if generator: self.header_source.set_pause_generator(generator()) self.payload_source.set_pause_generator(generator()) def set_backpressure_generator(self, generator=None): if generator: self.sink.set_pause_generator(generator()) async def reset(self): self.dut.rst.setimmediatevalue(0) await RisingEdge(self.dut.clk) await RisingEdge(self.dut.clk) self.dut.rst <= 1 await RisingEdge(self.dut.clk) await RisingEdge(self.dut.clk) self.dut.rst <= 0 await RisingEdge(self.dut.clk) await RisingEdge(self.dut.clk)
class TB(object): def __init__(self, dut): self.dut = dut self.log = logging.getLogger("cocotb.tb") self.log.setLevel(logging.DEBUG) cocotb.fork(Clock(dut.clk, 10, units="ns").start()) self.source = AxiStreamSource(AxiStreamBus.from_prefix(dut, "s_axis"), dut.clk, dut.rst) self.sink = AxiStreamSink(AxiStreamBus.from_prefix(dut, "m_axis"), dut.clk, dut.rst) dut.rate_num.setimmediatevalue(1) dut.rate_denom.setimmediatevalue(1) dut.rate_by_frame.setimmediatevalue(0) def set_idle_generator(self, generator=None): if generator: self.source.set_pause_generator(generator()) def set_backpressure_generator(self, generator=None): if generator: self.sink.set_pause_generator(generator()) async def reset(self): self.dut.rst.setimmediatevalue(0) await RisingEdge(self.dut.clk) await RisingEdge(self.dut.clk) self.dut.rst.value = 1 await RisingEdge(self.dut.clk) await RisingEdge(self.dut.clk) self.dut.rst.value = 0 await RisingEdge(self.dut.clk) await RisingEdge(self.dut.clk)
class TB: def __init__(self, dut): self.dut = dut self.log = logging.getLogger("cocotb.tb") self.log.setLevel(logging.DEBUG) cocotb.start_soon(Clock(dut.clk, 8, units="ns").start()) self.header_source = EthHdrSource(EthHdrBus.from_prefix(dut, "s_eth"), dut.clk, dut.rst) self.payload_source = AxiStreamSource(AxiStreamBus.from_prefix(dut, "s_eth_payload_axis"), dut.clk, dut.rst) self.sink = ArpHdrSink(ArpHdrBus.from_prefix(dut, "m"), dut.clk, dut.rst) def set_idle_generator(self, generator=None): if generator: self.header_source.set_pause_generator(generator()) self.payload_source.set_pause_generator(generator()) def set_backpressure_generator(self, generator=None): if generator: self.sink.set_pause_generator(generator()) async def reset(self): self.dut.rst.setimmediatevalue(0) await RisingEdge(self.dut.clk) await RisingEdge(self.dut.clk) self.dut.rst.value = 1 await RisingEdge(self.dut.clk) await RisingEdge(self.dut.clk) self.dut.rst.value = 0 await RisingEdge(self.dut.clk) await RisingEdge(self.dut.clk) async def send(self, pkt): hdr = EthHdrTransaction() hdr.dest_mac = int.from_bytes(mac2str(pkt[Ether].dst), 'big') hdr.src_mac = int.from_bytes(mac2str(pkt[Ether].src), 'big') hdr.type = pkt[Ether].type await self.header_source.send(hdr) await self.payload_source.send(bytes(pkt[Ether].payload)) async def recv(self): rx_frame = await self.sink.recv() eth = Ether() eth.dst = rx_frame.eth_dest_mac.integer.to_bytes(6, 'big') eth.src = rx_frame.eth_src_mac.integer.to_bytes(6, 'big') eth.type = rx_frame.eth_type.integer arp = ARP() arp.hwtype = rx_frame.arp_htype.integer arp.ptype = rx_frame.arp_ptype.integer arp.hwlen = rx_frame.arp_hlen.integer arp.plen = rx_frame.arp_plen.integer arp.op = rx_frame.arp_oper.integer arp.hwsrc = rx_frame.arp_sha.integer.to_bytes(6, 'big') arp.psrc = rx_frame.arp_spa.integer arp.hwdst = rx_frame.arp_tha.integer.to_bytes(6, 'big') arp.pdst = rx_frame.arp_tpa.integer rx_pkt = eth / arp return Ether(bytes(rx_pkt))
class TB: def __init__(self, dut): self.dut = dut self.log = logging.getLogger("cocotb.tb") self.log.setLevel(logging.DEBUG) cocotb.fork(Clock(dut.clk, 8, units="ns").start()) self.header_source = EthHdrSource(EthHdrBus.from_prefix(dut, "s_eth"), dut.clk, dut.rst) self.payload_source = AxiStreamSource( AxiStreamBus.from_prefix(dut, "s_eth_payload_axis"), dut.clk, dut.rst) self.header_sink = EthHdrSink(EthHdrBus.from_prefix(dut, "m_eth"), dut.clk, dut.rst) self.payload_sink = AxiStreamSink( AxiStreamBus.from_prefix(dut, "m_eth_payload_axis"), dut.clk, dut.rst) self.arp_req_source = ArpReqSource( ArpReqBus.from_prefix(dut, "arp_request"), dut.clk, dut.rst) self.arp_resp_sink = ArpRespSink( ArpRespBus.from_prefix(dut, "arp_response"), dut.clk, dut.rst) dut.local_mac.setimmediatevalue(0) dut.local_ip.setimmediatevalue(0) dut.gateway_ip.setimmediatevalue(0) dut.subnet_mask.setimmediatevalue(0) dut.clear_cache.setimmediatevalue(0) def set_idle_generator(self, generator=None): if generator: self.header_source.set_pause_generator(generator()) self.payload_source.set_pause_generator(generator()) def set_backpressure_generator(self, generator=None): if generator: self.header_sink.set_pause_generator(generator()) self.payload_sink.set_pause_generator(generator()) async def reset(self): self.dut.rst.setimmediatevalue(0) await RisingEdge(self.dut.clk) await RisingEdge(self.dut.clk) self.dut.rst <= 1 await RisingEdge(self.dut.clk) await RisingEdge(self.dut.clk) self.dut.rst <= 0 await RisingEdge(self.dut.clk) await RisingEdge(self.dut.clk) async def send(self, pkt): hdr = EthHdrTransaction() hdr.dest_mac = int.from_bytes(mac2str(pkt[Ether].dst), 'big') hdr.src_mac = int.from_bytes(mac2str(pkt[Ether].src), 'big') hdr.type = pkt[Ether].type await self.header_source.send(hdr) await self.payload_source.send(bytes(pkt[Ether].payload)) async def recv(self): rx_header = await self.header_sink.recv() rx_payload = await self.payload_sink.recv() assert not rx_payload.tuser eth = Ether() eth.dst = rx_header.dest_mac.integer.to_bytes(6, 'big') eth.src = rx_header.src_mac.integer.to_bytes(6, 'big') eth.type = rx_header.type.integer rx_pkt = eth / bytes(rx_payload.tdata) return Ether(bytes(rx_pkt))
class TB(object): def __init__(self, dut): self.dut = dut self.log = logging.getLogger("cocotb.tb") self.log.setLevel(logging.DEBUG) s_clk = int(os.getenv("S_CLK", "10")) m_clk = int(os.getenv("M_CLK", "11")) cocotb.start_soon(Clock(dut.s_clk, s_clk, units="ns").start()) cocotb.start_soon(Clock(dut.m_clk, m_clk, units="ns").start()) self.source = AxiStreamSource(AxiStreamBus.from_prefix(dut, "s_axis"), dut.s_clk, dut.s_rst) self.sink = AxiStreamSink(AxiStreamBus.from_prefix(dut, "m_axis"), dut.m_clk, dut.m_rst) def set_idle_generator(self, generator=None): if generator: self.source.set_pause_generator(generator()) def set_backpressure_generator(self, generator=None): if generator: self.sink.set_pause_generator(generator()) async def reset(self): self.dut.m_rst.setimmediatevalue(0) self.dut.s_rst.setimmediatevalue(0) for k in range(10): await RisingEdge(self.dut.s_clk) self.dut.m_rst.value = 1 self.dut.s_rst.value = 1 for k in range(10): await RisingEdge(self.dut.s_clk) self.dut.m_rst.value = 0 self.dut.s_rst.value = 0 for k in range(10): await RisingEdge(self.dut.s_clk) async def reset_source(self): self.dut.s_rst.setimmediatevalue(0) for k in range(10): await RisingEdge(self.dut.s_clk) self.dut.s_rst.value = 1 for k in range(10): await RisingEdge(self.dut.s_clk) self.dut.s_rst.value = 0 for k in range(10): await RisingEdge(self.dut.s_clk) async def reset_sink(self): self.dut.m_rst.setimmediatevalue(0) for k in range(10): await RisingEdge(self.dut.m_clk) self.dut.m_rst.value = 1 for k in range(10): await RisingEdge(self.dut.m_clk) self.dut.m_rst.value = 0 for k in range(10): await RisingEdge(self.dut.m_clk)