Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
import os
import logging
import riscof.utils as utils
from riscof.pluginTemplate import pluginTemplate
logger = logging.getLogger()
class serv(pluginTemplate):
__model__ = "serv"
__version__ = "1.4.0"
def __init__(self, *args, **kwargs):
sclass = super().__init__(*args, **kwargs)
config = kwargs.get('config')
config_dir = kwargs.get('config_dir')
if config is None:
print("Please enter input file paths in configuration.")
raise SystemExit(1)
self.pluginpath=os.path.join(config_dir, config['pluginpath'])
self.isa_spec = os.path.join(config_dir, config['ispec'])
self.platform_spec = os.path.join(config_dir, config['pspec'])
if 'target_run' in config and config['target_run']=='0':
self.target_run = False
else:
self.target_run = True
return sclass
def initialise(self, suite, work_dir, archtest_env):
self.work_dir = work_dir
self.suite_dir = suite
self.compile_cmd = 'riscv64-unknown-elf-gcc -march={0} \
-static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles -g\
-T '+self.pluginpath+'/env/link.ld\
-I '+self.pluginpath+'/env/\
-I ' + archtest_env + ' {1} -o {2} {3}'
add_mdu = 'fusesoc library add mdu https://github.com/zeeshanrafique23/mdu'
utils.shellCommand(add_mdu).run()
build_serv = 'fusesoc run --target=verilator_tb --flag=mdu\
--build --work-root=servant_test award-winning:serv:servant\
--memsize=8388608 --compressed=1'
utils.shellCommand(build_serv).run()
def build(self, isa_yaml, platform_yaml):
ispec = utils.load_yaml(isa_yaml)['hart0']
self.xlen = ('64' if 64 in ispec['supported_xlen'] else '32')
self.isa = 'rv' + self.xlen
if "I" in ispec["ISA"]:
self.isa += 'i'
if "M" in ispec["ISA"]:
self.isa += 'm'
if "C" in ispec["ISA"]:
self.isa += 'c'
self.compile_cmd = self.compile_cmd+' -mabi='+('lp64 ' if 64 in ispec['supported_xlen'] else 'ilp32 ')
def runTests(self, testList):
for testentry in testList.values():
test = testentry['test_path']
test_dir = testentry['work_dir']
file_name = os.path.basename(test)[:-2]
elf = file_name+'.elf'
compile_macros= ' -D' + " -D".join(testentry['macros'])
marchstr = testentry['isa'].lower()
compile_run = self.compile_cmd.format(marchstr, test, elf, compile_macros)
utils.shellCommand(compile_run).run(cwd=test_dir)
objcopy_run = f'riscv64-unknown-elf-objcopy -O binary {elf} {file_name}.bin'
utils.shellCommand(objcopy_run).run(cwd=test_dir)
self.makehex(f"{test_dir}/{file_name}.bin", f"{test_dir}/{file_name}.hex")
#The behavior of --build-root in FuseSoC has changed since version 2.2.1
#Check first for executable model in the new location and else fall back
#to the old one
exe = 'servant_test/Vservant_sim'
sigdump_run = [exe,
"+timeout=1000000000",
f"+signature={test_dir}/DUT-serv.signature",
f"+firmware={test_dir}/{file_name}.hex"]
utils.shellCommand(' '.join(sigdump_run)).run()
if not self.target_run:
raise SystemExit
def makehex(self, binfile, hexfile):
with open(binfile, "rb") as f, open(hexfile, "w") as fout:
cnt = 3
s = ["00"]*4
while True:
data = f.read(1)
if not data:
fout.write(''.join(s)+'\n')
return
s[cnt] = "{:02X}".format(data[0])
if cnt == 0:
fout.write(''.join(s)+'\n')
s = ["00"]*4
cnt = 4
cnt -= 1
f200eb2edThis file is pinned to the selected release. Download the original to open it in your design tool.