feat: enhance DMA and RIB functionality with burst support and performance tests

- Updated dma_error_tb to implement burst transfer handling and performance measurement for INCR4 transfers.
- Introduced rib_burst_bus_tb to validate RIB burst arbitration and protocol compliance.
- Added soc_rib_burst_ram_tb to test SRAM behavior with burst commands.
- Created spill_register_tb to verify the functionality of the spill register under various conditions.
- Modified test_dma.py to reflect changes in DMA error handling and performance reporting.
- Updated test_memory_map.py to include new RIB burst interfaces and spill register utilities.
- Enhanced test_rib_burst.py with directed tests for RIB burst building blocks and spill register behavior.
- Adjusted test_soc_topology.py to ensure correct instantiation counts for RIB interfaces.
- Improved test_user_extensions.py to validate the generation of isolated scalar bindings for burst interfaces.
This commit is contained in:
maksyuki committed 2026-08-03 22:23:37 +08:00
1 parent 9dc32ab9cc
commit bef5881149
57 files changed
+3239 -727

No files matched your search

+64 -2
View File
@@ -179,11 +179,19 @@ def test_formal_filelists_are_scoped_to_the_protocol_duts(tmp_path: Path) -> Non
(user_extensions / "rtl").mkdir(parents=True)
bus_filelist = tmp_path / "bus.fl"
rib_adapter_filelist = tmp_path / "rib_adapter.fl"
spill_register_filelist = tmp_path / "spill_register.fl"
rib2apb_filelist = tmp_path / "rib2apb.fl"
sysctrl_filelist = tmp_path / "sysctrl.fl"
pll_rcu_filelist = tmp_path / "pll_rcu.fl"
gpio_user_filelist = tmp_path / "gpio_user.fl"
assert generate_formal_filelist("bus", bus_filelist, memory_map, topology, user_extensions)
assert generate_formal_filelist(
"rib_adapter", rib_adapter_filelist, memory_map, topology, user_extensions
)
assert generate_formal_filelist(
"spill_register", spill_register_filelist, memory_map, topology, user_extensions
)
assert generate_formal_filelist(
"rib2apb", rib2apb_filelist, memory_map, topology, user_extensions
)
@@ -198,14 +206,25 @@ def test_formal_filelists_are_scoped_to_the_protocol_duts(tmp_path: Path) -> Non
)
bus = parse_filelists([bus_filelist], require_files=False)
rib_adapter = parse_filelists([rib_adapter_filelist], require_files=False)
spill_register = parse_filelists([spill_register_filelist], require_files=False)
rib2apb = parse_filelists([rib2apb_filelist], require_files=False)
sysctrl = parse_filelists([sysctrl_filelist], require_files=False)
pll_rcu = parse_filelists([pll_rcu_filelist], require_files=False)
gpio_user = parse_filelists([gpio_user_filelist], require_files=False)
assert "+define+SV_ASSRT_DISABLE" in bus.defines
assert ROOT / "rtl/mini/top/bus.sv" in bus.files
assert ROOT / "rtl/mini/top/soc_rib_regslice.sv" in bus.files
assert ROOT / "rtl/mini/top/soc_rib_burst_if.sv" in bus.files
assert ROOT / "rtl/mini/top/soc_rib_legacy_to_burst.sv" in bus.files
assert ROOT / "rtl/mini/top/soc_rib_burst_error_slave.sv" in bus.files
assert ROOT / "rtl/mini/formal/bus_formal.sv" in bus.files
assert ROOT / "rtl/mini/top/soc_rib_burst_to_legacy.sv" in rib_adapter.files
assert ROOT / "rtl/mini/formal/rib_adapter_formal.sv" in rib_adapter.files
assert (
ROOT / "rtl/managed/clusterip/common/rtl/utils/spill_register.sv"
in spill_register.files
)
assert ROOT / "rtl/mini/formal/spill_register_formal.sv" in spill_register.files
assert ROOT / "rtl/ip/rib/interconnect/rib2apb.sv" in rib2apb.files
assert ROOT / "rtl/mini/formal/rib2apb_formal.sv" in rib2apb.files
assert ROOT / "rtl/managed/clusterip/common/rtl/interface/apb4_pure_if.sv" in rib2apb.files
@@ -629,7 +648,7 @@ def test_benchmark_profile_uses_functional_sram_and_reserved_data() -> None:
profile = (ROOT / "configs/benchmark/ihp130-hazard3.mk").read_text(encoding="utf-8")
benchmark = (ROOT / "app/apps/benchmark/main.c").read_text(encoding="utf-8")
assert "PDK_BEHAV ?= NO" in makefile
assert re.search(r"^PDK_BEHAV\s+\?= NO$", makefile, re.MULTILINE)
assert "PDK_BEHAV HAVE_SVA" in makefile
assert "PDK_BEHAV=YES is for functional simulation" in makefile
assert "HAVE_SRAM_MACRO := YES" in profile
@@ -824,6 +843,49 @@ def test_run_flow_writes_structured_result(tmp_path: Path) -> None:
assert log.read_text(encoding="utf-8") == "flow output\n"
def test_run_flow_can_terminate_an_opt_in_local_flow_at_success_marker(tmp_path: Path) -> None:
log = tmp_path / "marker.log"
result = tmp_path / "marker.json"
completed = subprocess.run(
[
sys.executable,
str(ROOT / "scripts/run_flow.py"),
"--tool",
"test",
"--log",
str(log),
"--result",
str(result),
"--success-marker",
"Hello retroSoC!",
"--terminate-on-success-marker",
"--",
sys.executable,
"-c",
"import time; print('Hello retroSoC!', flush=True); time.sleep(30)",
],
text=True,
capture_output=True,
timeout=10,
)
report = json.loads(result.read_text(encoding="utf-8"))
assert completed.returncode == 0
assert report["status"] == "passed"
assert report["completion_mode"] == "success_marker"
assert report["success_marker_seen"] is True
assert "Hello retroSoC!" in log.read_text(encoding="utf-8")
def test_regression_boot_only_mode_replaces_only_netsim_command() -> None:
transformed = regress.with_netsim_boot_only(PR_COMMANDS)
flattened = [value for _, values in transformed for value in values]
assert "netsim" not in flattened
assert "netsim-boot" in flattened
assert "SIM_FIRMWARE_NAME=retrosoc_asm" in flattened
assert not any(value.startswith("SIM_SUCCESS_MARKER=") for value in flattened)
assert any("sta" in values for _, values in transformed)
def test_run_flow_adds_carriage_return_when_terminal_disables_onlcr(monkeypatch) -> None:
class Terminal(io.StringIO):
def isatty(self) -> bool: