73 lines
2.6 KiB
Python
73 lines
2.6 KiB
Python
|
#!/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}')
|