* wip * reorg * update sv int * apb4 working * apb3 working * version bump + ignore runner warning * remove redundant check * adding log on failure * cleaning up verilator version issue * devcontainer * Fix missing libpython in GitHub Actions CI environment (#21) * Initial plan * Install libpython in GitHub Actions for cocotb tests Co-authored-by: arnavsacheti <36746504+arnavsacheti@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: arnavsacheti <36746504+arnavsacheti@users.noreply.github.com> --------- Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
81 lines
2.6 KiB
Python
81 lines
2.6 KiB
Python
"""Pytest wrapper launching the APB4 cocotb smoke tests."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
from pathlib import Path
|
|
import logging
|
|
import pytest
|
|
|
|
from peakrdl_busdecoder.cpuif.apb4.apb4_cpuif_flat import APB4CpuifFlat
|
|
|
|
try: # pragma: no cover - optional dependency shim
|
|
from cocotb.runner import get_runner
|
|
except ImportError: # pragma: no cover
|
|
from cocotb_tools.runner import get_runner
|
|
|
|
from tests.cocotb_lib import RDL_CASES
|
|
from tests.cocotb_lib.utils import get_verilog_sources, prepare_cpuif_case
|
|
|
|
|
|
@pytest.mark.simulation
|
|
@pytest.mark.verilator
|
|
@pytest.mark.parametrize(("rdl_file", "top_name"), RDL_CASES, ids=[case[1] for case in RDL_CASES])
|
|
def test_apb4_smoke(tmp_path: Path, rdl_file: str, top_name: str) -> None:
|
|
"""Compile each APB4 design variant and execute the cocotb smoke test."""
|
|
repo_root = Path(__file__).resolve().parents[4]
|
|
rdl_path = repo_root / "tests" / "cocotb_lib" / "rdl" / rdl_file
|
|
build_root = tmp_path / top_name
|
|
|
|
module_path, package_path, config = prepare_cpuif_case(
|
|
str(rdl_path),
|
|
top_name,
|
|
build_root,
|
|
cpuif_cls=APB4CpuifFlat,
|
|
control_signal="PSEL",
|
|
)
|
|
|
|
sources = get_verilog_sources(
|
|
module_path,
|
|
package_path,
|
|
[repo_root / "hdl-src" / "apb4_intf.sv"],
|
|
)
|
|
|
|
runner = get_runner("verilator")
|
|
sim_build = build_root / "sim_build"
|
|
|
|
try:
|
|
runner.build(
|
|
sources=sources,
|
|
hdl_toplevel=module_path.stem,
|
|
build_dir=sim_build,
|
|
log_file=str(build_root / "build.log"),
|
|
)
|
|
except SystemExit as e:
|
|
# Print build log on failure for easier debugging
|
|
log_path = build_root / "build.log"
|
|
if log_path.exists():
|
|
logging.error("\n\n=== Build Log ===\n")
|
|
logging.error(log_path.read_text())
|
|
logging.error("\n=== End Build Log ===\n")
|
|
if e.code != 0:
|
|
raise
|
|
|
|
try:
|
|
runner.test(
|
|
hdl_toplevel=module_path.stem,
|
|
test_module="tests.cocotb.apb4.smoke.test_register_access",
|
|
build_dir=sim_build,
|
|
log_file=str(build_root / "simulation.log"),
|
|
extra_env={"RDL_TEST_CONFIG": json.dumps(config)},
|
|
)
|
|
except SystemExit as e:
|
|
# Print simulation log on failure for easier debugging
|
|
log_path = build_root / "simulation.log"
|
|
if log_path.exists():
|
|
logging.error("\n\n=== Simulation Log ===\n")
|
|
logging.error(log_path.read_text())
|
|
logging.error("\n=== End Simulation Log ===\n")
|
|
if e.code != 0:
|
|
raise
|