From 1c281bc0f7601f668f6381c659dba7d33ebf565e Mon Sep 17 00:00:00 2001 From: Markus Koch Date: Fri, 29 Apr 2022 20:53:20 +0200 Subject: [PATCH] bench: Add hardware-in-the-loop test --- cocotb/hw_itl.py | 72 ++++++++++++++++++++++++++++++++++++++++++++++++ cocotb/hw_itl.sh | 5 ++++ 2 files changed, 77 insertions(+) create mode 100644 cocotb/hw_itl.py create mode 100755 cocotb/hw_itl.sh diff --git a/cocotb/hw_itl.py b/cocotb/hw_itl.py new file mode 100644 index 0000000..e5e3de4 --- /dev/null +++ b/cocotb/hw_itl.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python + +import cocotb +from cocotb.triggers import * +from cocotb.result import * +from cocotb.queue import Queue +from cocotb_helpers import buffers + +import sys +import threading +import socket +import time +import os +import asyncio +import fcntl + +class MacDevReceiver(): + def __init__(self, dut, eth_tx, eth_rx, dev): + self.dut = dut + self.eth_tx = eth_tx + self.eth_rx = eth_rx + self.dev = dev + self.mac_rx_ev = Event() + + print("Setting IF to promisc mode...") + os.system("ip link set promisc on dev {}".format(dev)) + + ETH_P_ALL=3 + self.macdev=socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(ETH_P_ALL)) + self.macdev.bind((dev, 0)) + fcntl.fcntl(self.macdev, fcntl.F_SETFL, os.O_NONBLOCK) + + async def main(self): + ETH_HEAD = b'\x55\x55\x55\x55\xD5' + while True: + try: + r = self.macdev.recv(2000) + await self.eth_tx.send(ETH_HEAD + r); + except: + await Timer(1, "us") + pass + async def main_rx(self): + while True: + frame = await self.eth_rx.queue.get() + self.dut._log.info("RX Frame: " + str(frame)) + self.macdev.send(frame) + + async def start(self): + await cocotb.start(self.main()) + await cocotb.start(self.main_rx()) + +@cocotb.test() +async def hwitl(dut): + """Real-Ethernet-hardware in the loop test""" + + # Start verification components + eth_tx = buffers.tx_buffer(dut, "cocovc_eth_inst.cocotb_tx_") + await eth_tx.start() + eth_rx = buffers.rx_buffer(dut, "cocovc_eth_inst.cocotb_rx_") + await eth_rx.start() + + # Start local monitors + macdev_receiver = MacDevReceiver(dut, eth_tx, eth_rx, "virt0") + + # Wait for VHDL part to be ready + await Edge(dut.bench_ready) + + print("beep") + await macdev_receiver.start() + + print("Press Ctrl+C to stop the test.") + await Timer(100, "sec") diff --git a/cocotb/hw_itl.sh b/cocotb/hw_itl.sh new file mode 100755 index 0000000..9176b22 --- /dev/null +++ b/cocotb/hw_itl.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +echo Hardware in the loop test + +make TOPLEVEL=cocotb_top_mac_test MODULE=hw_itl