From c6e5053c78101fd4532fe528525563102632c878 Mon Sep 17 00:00:00 2001 From: Olof Kindgren Date: Sun, 30 Apr 2023 20:48:02 +0200 Subject: [PATCH] Clean up RISCOF support structure The RISCOF regression test suite can now be run from a workspace instead of having to be run from inside the repo. Also removes the need for a submodule. --- .github/workflows/ci.yml | 54 +++++++--------- .gitmodules | 3 - verif/.gitignore | 2 - verif/Readme.md | 70 ++++++++++----------- verif/config.ini | 12 ++-- verif/makehex.py | 25 -------- verif/plugin-sail_cSim/riscof_sail_cSim.py | 5 +- verif/plugin-serv/riscof_serv.py | 73 +++++++++++++--------- verif/riscv-arch-test | 1 - 9 files changed, 109 insertions(+), 136 deletions(-) delete mode 100644 verif/.gitignore delete mode 100644 verif/makehex.py delete mode 160000 verif/riscv-arch-test diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fc823b7..6a4181e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,11 +1,11 @@ -name: CI +name: Run compliance test suite on: [push, pull_request] jobs: compliance: name: RISC-V Compliance Test - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v2 @@ -14,51 +14,39 @@ jobs: - name: install fusesoc, verilator, gcc and riscof run: | - sudo apt-get install -y python3-setuptools verilator gcc-riscv64-unknown-elf + sudo apt-get install -y python3-setuptools verilator pip3 install fusesoc - pip3 install git+https://github.com/riscv/riscof.git - + pip3 install riscof + wget -qO- https://github.com/riscv-collab/riscv-gnu-toolchain/releases/download/2023.07.05/riscv64-elf-ubuntu-22.04-gcc-nightly-2023.07.05-nightly.tar.gz | tar xz + echo $GITHUB_WORKSPACE/riscv/bin >> $GITHUB_PATH + + - name: set root and SERV directory run: | echo "SERV=$GITHUB_WORKSPACE/serv" >> $GITHUB_ENV - echo "WORKSPACE=$GITHUB_WORKSPACE/" >> $GITHUB_ENV - name: setup workspace run: fusesoc library add serv $SERV - - - name: Update submodule to add arch-tests - run: | - cd $SERV - git submodule init - git submodule update - name: Setup SAIL-RISCV Model run: | tar -xzf $SERV/verif/bin/sail-riscv.tar.gz echo $GITHUB_WORKSPACE/sail-riscv >> $GITHUB_PATH - + + - name: Init arch tests + run: riscof arch-test --clone + - name: Run RV32I compliance tests - run: | - cd $SERV/verif - riscof run --config=config.ini --suite=riscv-arch-test/riscv-test-suite/rv32i_m/I --env=riscv-arch-test/riscv-test-suite/env --no-browser - + run: riscof run --config=$SERV/verif/config.ini --suite=riscv-arch-test/riscv-test-suite/rv32i_m/I --env=riscv-arch-test/riscv-test-suite/env --no-browser + - name: Run RV32IM compliance tests - run: | - cd $SERV/verif - riscof run --config=config.ini --suite=riscv-arch-test/riscv-test-suite/rv32i_m/M --env=riscv-arch-test/riscv-test-suite/env --no-browser - + run: riscof run --config=$SERV/verif/config.ini --suite=riscv-arch-test/riscv-test-suite/rv32i_m/M --env=riscv-arch-test/riscv-test-suite/env --no-browser + - name: Run RV32IC compliance tests - run: | - cd $SERV/verif - riscof run --config=config.ini --suite=riscv-arch-test/riscv-test-suite/rv32i_m/C --env=riscv-arch-test/riscv-test-suite/env --no-browser - + run: riscof run --config=$SERV/verif/config.ini --suite=riscv-arch-test/riscv-test-suite/rv32i_m/C --env=riscv-arch-test/riscv-test-suite/env --no-browser + - name: Run RV32I Zifencei compliance tests - run: | - cd $SERV/verif - riscof run --config=config.ini --suite=riscv-arch-test/riscv-test-suite/rv32i_m/Zifencei --env=riscv-arch-test/riscv-test-suite/env --no-browser - + run: riscof run --config=$SERV/verif/config.ini --suite=riscv-arch-test/riscv-test-suite/rv32i_m/Zifencei --env=riscv-arch-test/riscv-test-suite/env --no-browser + - name: Run RV32I Privilege compliance tests - run: | - cd $SERV/verif - riscof run --config=config.ini --suite=riscv-arch-test/riscv-test-suite/rv32i_m/privilege --env=riscv-arch-test/riscv-test-suite/env --no-browser - \ No newline at end of file + run: riscof run --config=$SERV/verif/config.ini --suite=riscv-arch-test/riscv-test-suite/rv32i_m/privilege --env=riscv-arch-test/riscv-test-suite/env --no-browser diff --git a/.gitmodules b/.gitmodules index e643dfa..e69de29 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "verif/riscv-arch-test"] - path = verif/riscv-arch-test - url = https://github.com/riscv-non-isa/riscv-arch-test diff --git a/verif/.gitignore b/verif/.gitignore deleted file mode 100644 index 7ff52af..0000000 --- a/verif/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*/__* -riscof_work \ No newline at end of file diff --git a/verif/Readme.md b/verif/Readme.md index 7dfa62b..57bbb2d 100644 --- a/verif/Readme.md +++ b/verif/Readme.md @@ -9,59 +9,57 @@ In our case, DUT is SERV core and reference is the [sail-riscv](https://github.c - [RISC-V GCC Toolchain](https://github.com/riscv-collab/riscv-gnu-toolchain) - Install toolchain by running following command. - sudo apt-get install -y gcc-riscv64-unknown-elf > :bulb: By default, RISCOF plugins uses [RV32](https://github.com/riscv-collab/riscv-gnu-toolchain#:~:text=To%20build%20the%2032%2Dbit%20RV32GC%20toolchain%2C%20use%3A) toolchain for compiling native `rv32` code. For SERV, this dependency has been removed from the plugin as RV64 is sufficient for 32-bit systems as well. -- [SAIL-RISCV](https://github.com/riscv/sail-riscv) - The reference model can be build by following [these](https://riscof.readthedocs.io/en/stable/installation.html#install-plugin-models) instructions. The pre-built binaries of sail-riscv is available in [`bin`](/verif/bin/) directory. +- [SAIL-RISCV](https://github.com/riscv/sail-riscv) - The reference model can be build by following [these](https://riscof.readthedocs.io/en/stable/installation.html#install-plugin-models) instructions. The pre-built binaries of sail-riscv is available in [`bin`](/verif/bin/) directory. Extract the tarball somewhere and add the directory containing `riscv_sim_RV32` to your PATH -- [riscv-arch-tests](https://github.com/riscv-non-isa/riscv-arch-test) - Compliance tests are added as a submodule in `$SERV/verif`. Run the following commands from the `$SERV`. - - $ git submodule init - $ git submodule update - This will clone the arch-tests repository into the `$SERV/verif/riscv-arch-tests`. - [RISCOF](https://riscof.readthedocs.io/en/stable/installation.html#install-python) - If you have installed [Python](https://riscof.readthedocs.io/en/stable/installation.html#install-python), run the folllowing command to [install RISCOF](https://riscof.readthedocs.io/en/stable/installation.html#). - pip3 install git+https://github.com/riscv/riscof.git + pip3 install riscof -> :warning: Make sure to export the root directory as `$WORKSPACE` and also make sure to have the directory structure that looks like this. +- [riscv-arch-tests](https://github.com/riscv-non-isa/riscv-arch-test) - Compliance tests are installed into the workspace by running: + + $ riscof arch-test --clone + +or alternatively + + $ riscof arch-test --update + +if the tests are already installed and just needs to be updated. + +> Make sure to have the directory structure that looks like this. . - $WORKSPACE | - ├── build - │   └── ... ├── fusesoc.conf - └── fusesoc_libraries -    ├── fusesoc_cores -    │   └── ... -    ├── mdu -    │   └── ... -    └── serv -    ├── ... - ├── verif - | ├── bin - | | └── ... - |   ├── config.ini - |   ├── plugin-sail_cSim - | | └── ... - |   ├── plugin-serv - | | └── ... - |   ├── Readme.md - |   ├── riscv-arch-test - | | └── ... - |   └── sim - | └── ... - └── ... + ├── fusesoc_libraries + | ├── fusesoc_cores + | │   └── ... + | ├── mdu + | │   └── ... + | └── serv + | ├── ... + | ├── verif + | | ├── bin + | | | └── ... + | |   ├── config.ini + | |   ├── plugin-sail_cSim + | | | └── ... + | |   ├── plugin-serv + | | | └── ... + | └── ... + ├── riscv-arch-test + └── ... ## Running Compliance tests After completing all the steps in [Getting started](/README.md) followed by the [Prerequisites](##Prerequisites), we are all set to run the complaince tests. -:o: All the RISCOF commands will be run from `$SERV/verif` +:o: All the RISCOF commands will be run from the workspace - riscof run --config=config.ini \ + riscof run --config=$SERV/verif/config.ini \ --suite=riscv-arch-test/riscv-test-suite/rv32i_m/I \ --env=riscv-arch-test/riscv-test-suite/env @@ -71,4 +69,4 @@ After completing all the steps in [Getting started](/README.md) followed by the > :bulb: Other optional arguments of RISCOF command can be found [here](https://riscof.readthedocs.io/en/stable/commands.html#run) -When RISCOF run command successfully executed: an `html` report is generated which depicts the results of the tests. And a directory named `riscof_work` is created inside `$SERV/verif/` which contains all the log files, signatures, executeables for Reference model and/or DUT. \ No newline at end of file +When RISCOF run command successfully executed: an `html` report is generated which depicts the results of the tests. And a directory named `riscof_work` is created in the workspace which contains all the log files, signatures, executeables for Reference model and/or DUT. \ No newline at end of file diff --git a/verif/config.ini b/verif/config.ini index dfa5746..176c80b 100644 --- a/verif/config.ini +++ b/verif/config.ini @@ -1,14 +1,14 @@ [RISCOF] ReferencePlugin=sail_cSim -ReferencePluginPath=./plugin-sail_cSim +ReferencePluginPath=plugin-sail_cSim DUTPlugin=serv -DUTPluginPath=./plugin-serv +DUTPluginPath=plugin-serv [serv] -pluginpath=./plugin-serv -ispec=./plugin-serv/serv_isa.yaml -pspec=./plugin-serv/serv_platform.yaml +pluginpath=plugin-serv +ispec=plugin-serv/serv_isa.yaml +pspec=plugin-serv/serv_platform.yaml target_run=1 [sail_cSim] -pluginpath=./plugin-sail_cSim +pluginpath=plugin-sail_cSim diff --git a/verif/makehex.py b/verif/makehex.py deleted file mode 100644 index c8f1820..0000000 --- a/verif/makehex.py +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env python3 -# -# This is free and unencumbered software released into the public domain. -# -# Anyone is free to copy, modify, publish, use, compile, sell, or -# distribute this software, either in source code form or as a compiled -# binary, for any purpose, commercial or non-commercial, and by any -# means. - -import sys - -with open(sys.argv[1], "rb") as f: - cnt = 3 - s = ["00"]*4 - while True: - data = f.read(1) - if not data: - print(''.join(s)) - exit(0) - s[cnt] = "{:02X}".format(data[0]) - if cnt == 0: - print(''.join(s)) - s = ["00"]*4 - cnt = 4 - cnt -= 1 \ No newline at end of file diff --git a/verif/plugin-sail_cSim/riscof_sail_cSim.py b/verif/plugin-sail_cSim/riscof_sail_cSim.py index 4b2c1f0..ff9a4ce 100644 --- a/verif/plugin-sail_cSim/riscof_sail_cSim.py +++ b/verif/plugin-sail_cSim/riscof_sail_cSim.py @@ -17,8 +17,9 @@ class sail_cSim(pluginTemplate): if config is None: logger.error("Config node for sail_cSim missing.") raise SystemExit(1) + config_dir = kwargs.get('config_dir') self.num_jobs = str(config['jobs'] if 'jobs' in config else 1) - self.pluginpath = os.path.abspath(config['pluginpath']) + self.pluginpath = os.path.join(config_dir, config['pluginpath']) self.sail_exe = { '32' : os.path.join(config['PATH'] if 'PATH' in config else "","riscv_sim_RV32"), '64' : os.path.join(config['PATH'] if 'PATH' in config else "","riscv_sim_RV64")} self.isa_spec = os.path.abspath(config['ispec']) if 'ispec' in config else '' @@ -105,4 +106,4 @@ class sail_cSim(pluginTemplate): execute+=coverage_cmd make.add_target(execute) - make.execute_all(self.work_dir) \ No newline at end of file + make.execute_all(self.work_dir) diff --git a/verif/plugin-serv/riscof_serv.py b/verif/plugin-serv/riscof_serv.py index f88b603..5f41afa 100644 --- a/verif/plugin-serv/riscof_serv.py +++ b/verif/plugin-serv/riscof_serv.py @@ -13,14 +13,13 @@ class serv(pluginTemplate): 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.dut_exe = os.path.join(config['PATH'] if 'PATH' in config else "","serv") - self.num_jobs = str(config['jobs'] if 'jobs' in config else 1) - self.pluginpath=os.path.abspath(config['pluginpath']) - self.isa_spec = os.path.abspath(config['ispec']) - self.platform_spec = os.path.abspath(config['pspec']) + 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: @@ -35,21 +34,14 @@ class serv(pluginTemplate): -T '+self.pluginpath+'/env/link.ld\ -I '+self.pluginpath+'/env/\ -I ' + archtest_env + ' {1} -o {2} {3}' - self.objcopy_cmd = 'riscv64-unknown-elf-objcopy -O binary {0} {1}.bin' - self.objdump_cmd = 'riscv64-unknown-elf-objdump -D {0} > {1}.disass' - self.hexgen_cmd = 'python3 makehex.py {0}/{1}.bin > {0}/{1}.hex' - build_serv = 'cd $WORKSPACE \n \ - fusesoc library add mdu https://github.com/zeeshanrafique23/mdu\n' - build_serv = build_serv + 'fusesoc run --target=verilator_tb --flag=mdu\ + 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 --build-root=servant_test servant\ --memsize=8388608 --compressed=1' utils.shellCommand(build_serv).run() - self.sigdump_cmd = 'cd $WORKSPACE/servant_test/verilator_tb \n\ - ./Vservant_sim\ - +timeout=100000000000\ - +signature={0}/DUT-serv.signature\ - +firmware={0}/{1}.hex' def build(self, isa_yaml, platform_yaml): ispec = utils.load_yaml(isa_yaml)['hart0'] @@ -64,29 +56,54 @@ class serv(pluginTemplate): self.compile_cmd = self.compile_cmd+' -mabi='+('lp64 ' if 64 in ispec['supported_xlen'] else 'ilp32 ') def runTests(self, testList): - for testname in testList: - testentry = testList[testname] + for testentry in testList.values(): test = testentry['test_path'] test_dir = testentry['work_dir'] - file_name = 'serv-{0}'.format(test.rsplit('/',1)[1][:-2]) + file_name = os.path.basename(test)[:-2] - elf = '{0}.elf'.format(file_name) + 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 = self.objcopy_cmd.format(elf,file_name) + + objcopy_run = f'riscv64-unknown-elf-objcopy -O binary {elf} {file_name}.bin' utils.shellCommand(objcopy_run).run(cwd=test_dir) - - objdump_run = self.objdump_cmd.format(elf,file_name) + + objdump_run = f'riscv64-unknown-elf-objdump -D {elf} > {file_name}.disass' utils.shellCommand(objdump_run).run(cwd=test_dir) - hexgen_run = self.hexgen_cmd.format(test_dir,file_name) - utils.shellCommand(hexgen_run).run() + self.makehex(f"{test_dir}/{file_name}.bin", f"{test_dir}/{file_name}.hex") - sigdump_run = self.sigdump_cmd.format(test_dir,file_name) - utils.shellCommand(sigdump_run).run() + #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/verilator_tb/Vservant_sim' + if not os.path.exists(exe): + exe = 'servant_test/servant_1.2.1/verilator_tb/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 diff --git a/verif/riscv-arch-test b/verif/riscv-arch-test deleted file mode 160000 index da638ba..0000000 --- a/verif/riscv-arch-test +++ /dev/null @@ -1 +0,0 @@ -Subproject commit da638bafbc6d69f75ffc09769cfe7e3a45b41a3a