spi/tests/runtests.py

73 lines
2.6 KiB
Python
Executable File

#!/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}')