#!/usr/bin/python3 import math import subprocess import sys import os from collections import namedtuple class Case: def __init__(self, master_name, defflags, params): self.master_name = master_name self.defflags = defflags self.params = params def run(self, dirname, pol, phase, wid): dirname = f'{dirname}{pol}{phase}' widlen = math.floor(math.log2(wid) + 1) args = ["verilator", "--cc", "--exe", "-I..", "-Wall", "--trace", "--trace-fst", "-Wno-unused", "--top-module", "simtop", f"-GPOLARITY={pol}", f"-GPHASE={phase}", f"-GWID={wid}", f"-CFLAGS", f"-DWID={wid}", f"-GWID_LEN={widlen}", f"-DSPI_MASTER_TYPE={self.master_name}", f'-DVCDFILE="{dirname}/trace.fst"', f"-DSIMULATION", f"--Mdir", dirname ] for flag in self.defflags: args.extend([f'-D{flag}', '-CFLAGS', f'-D{flag}']) for param in self.params: args.append(f'-G{param}={self.params[param]}') args.extend(['simtop.v', 'write_read.cpp', '../spi_slave.v', f'../{self.master_name}.v']) print(args) proc = subprocess.run(args, stdout=sys.stdout, stderr=sys.stderr) if proc.returncode != 0: print("Verilator failed") return False os.chdir(dirname) proc = subprocess.run(["make", "-f", "Vsimtop.mk"], stdout=sys.stdout, stderr=sys.stderr) if proc.returncode != 0: print("Make failed") os.chdir("..") return False proc = subprocess.run("./Vsimtop", stdout=sys.stdout, stderr=sys.stderr) os.chdir("..") if proc.returncode != 0: print("Vsimtop failed") return False return True cases = {} # Add basic cases cases[f'test_master'] = Case("spi_master", [], {}) cases[f'test_ss'] = Case("spi_master_ss", ["SPI_MASTER_SS"], {}) cases[f'test_master_no_write'] = Case("spi_master", ['SPI_MASTER_NO_WRITE'], {'ENABLE_MOSI': 0}) cases[f'test_ss_no_write'] = Case("spi_master_ss", ["SPI_MASTER_SS", 'SPI_MASTER_NO_WRITE'], {'ENABLE_MOSI': 0}) cases[f'test_master_no_read'] = Case("spi_master", ['SPI_MASTER_NO_READ'], {'ENABLE_MISO': 1}) cases[f'test_ss_no_read'] = Case("spi_master_ss", ["SPI_MASTER_SS", 'SPI_MASTER_NO_READ'], {'ENABLE_MISO': 1}) failures=0 for polarity in [0, 1]: for phase in [0, 1]: for casename in cases: if not cases[casename].run(casename, polarity, phase, 24): failures += 1 print(f'Failures: {failures}')