73 lines
2.6 KiB
Python
Executable File
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}')
|