| # 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 |