| # Copyright lowRISC contributors. |
| # Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| # SPDX-License-Identifier: Apache-2.0 |
| r"""Runs OpenOCD compliance test against Verilator target. |
| |
| This test requires some configuration options. Use the following steps to run |
| the test manually after building Verilator and the boot_rom and hello_world |
| targets. |
| |
| $ cd ${REPO_TOP} |
| $ pytest -s -v test/systemtest/openocd_verilator_test.py \ |
| --test_bin hello_world.elf \ |
| --rom_bin boot_rom.elf \ |
| --verilator_model build/lowrisc_systems_top_earlgrey_verilator_0.1/sim-verilator/Vtop_earlgrey_verilator |
| |
| In some cases the pytest environment may not be able to find the openocd binary. |
| To work around this issue, run the test with an additional configuration option: |
| |
| --openocd /tools/openocd/bin/openocd |
| """ |
| |
| import logging |
| import re |
| import subprocess |
| import time |
| import pytest |
| |
| import test_utils |
| |
| logging.basicConfig(level=logging.DEBUG) |
| |
| class TestCoreVerilator: |
| """Test core functionality in a Verilator-simulated hardware build.""" |
| |
| @pytest.fixture |
| def sim_top_earlgrey(self, tmp_path, sim_top_build, sw_test_bin, rom_bin): |
| cmd_sim = [ |
| str(sim_top_build), |
| '--meminit=flash,' + str(sw_test_bin), |
| '--meminit=rom,' + str(rom_bin) |
| ] |
| p_sim = test_utils.Process( |
| cmd_sim, |
| logdir=str(tmp_path), |
| cwd=str(tmp_path), |
| startup_done_expect='Simulation running', |
| startup_timeout=10) |
| p_sim.run() |
| |
| yield p_sim |
| |
| p_sim.terminate() |
| |
| def test_openocd_riscv_compliancetest(self, tmp_path, sim_top_earlgrey, |
| topsrcdir, openocd): |
| """Run RISC-V Debug compliance test built into OpenOCD.""" |
| assert subprocess.call([str(openocd), '--version']) == 0 |
| cmd_openocd = [ |
| str(openocd), |
| '-s', str(topsrcdir / 'util' / 'openocd'), |
| '-f', 'board/lowrisc-earlgrey-verilator.cfg', |
| '-c', 'init; riscv test_compliance; shutdown' |
| ] |
| p_openocd = test_utils.Process( |
| cmd_openocd, logdir=str(tmp_path), cwd=str(tmp_path)) |
| p_openocd.run() |
| |
| logging.getLogger(__name__).info( |
| "OpenOCD should terminate itself; give it up to 5 minutes") |
| p_openocd.proc.wait(timeout=300) |
| assert p_openocd.proc.returncode == 0 |
| |
| logging.getLogger(__name__).info( |
| "Now wait 60 seconds until the program has finished execution") |
| time.sleep(60) |
| |
| try: |
| p_openocd.terminate() |
| except ProcessLookupError: |
| # process is already dead |
| pass |