mirror of
https://github.com/retroSoC/retroSoC.git
synced 2026-11-06 14:55:14 +00:00
- Removed CORE and IP variables from common.tcl and synth.tcl scripts. - Updated yosys.mk to exclude CORE and IP from environment variables. - Modified bus_fault_tb to enhance NMI interface with management and user NMI signals. - Added user access denial handling in bus_fault_tb. - Updated pll_ctrl_tb and sysctrl_fault_tb to reflect changes in NMI interface. - Adjusted test_gpio_user_mux.py to remove IP_MDD definition. - Enhanced memory map tests to include user extensions and ensure proper generation. - Updated test_script_tools.py to reflect changes in core management and user extensions. - Refined topology tests to ensure user APB target is always added. - Adjusted tech cell configuration tests to use simplified profile paths. - Improved user extensions tests for scalar bindings and slot validation.
76 lines
2.4 KiB
Python
76 lines
2.4 KiB
Python
"""Tests for the generated scalar user-extension bindings."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
import subprocess
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
EXTENSIONS = ROOT / "rtl/mini/integration/user_extensions.json"
|
|
GENERATOR = ROOT / "rtl/mini/integration/generate_user_extensions.py"
|
|
|
|
|
|
def generate(output_dir: Path) -> None:
|
|
subprocess.run(
|
|
[
|
|
sys.executable,
|
|
str(GENERATOR),
|
|
"--map",
|
|
str(EXTENSIONS),
|
|
"--output-dir",
|
|
str(output_dir),
|
|
],
|
|
check=True,
|
|
)
|
|
|
|
|
|
def validate(extensions: Path) -> subprocess.CompletedProcess[str]:
|
|
return subprocess.run(
|
|
[sys.executable, str(GENERATOR), "--map", str(extensions), "--check"],
|
|
text=True,
|
|
capture_output=True,
|
|
)
|
|
|
|
|
|
def write_invalid_extensions(tmp_path: Path, document: dict[str, object]) -> Path:
|
|
path = tmp_path / "invalid_extensions.json"
|
|
path.write_text(json.dumps(document), encoding="utf-8")
|
|
return path
|
|
|
|
|
|
def test_extensions_generate_isolated_scalar_bindings(tmp_path: Path) -> None:
|
|
generate(tmp_path)
|
|
|
|
core = (tmp_path / "rtl/user_core_bindings.svh").read_text(encoding="utf-8")
|
|
ip = (tmp_path / "rtl/user_ip_bindings.svh").read_text(encoding="utf-8")
|
|
filelist = (tmp_path / "user_extensions.fl").read_text(encoding="utf-8")
|
|
|
|
assert core.count("nmi_if u_user_") == 6
|
|
assert "nmi.valid = '0;" in core
|
|
assert "5'd0: begin" in core
|
|
assert "5'd5: begin" in core
|
|
assert "core_reset_i[0]" in core
|
|
assert "user_core_design_username1 #(" in core
|
|
assert ip.count("user_gpio_if #(`USER_GPIO_NUM)") == 2
|
|
assert "gpio.do_o = '0;" in ip
|
|
assert "8'd2: begin" in ip
|
|
assert "u_user_2_apb_if.psel = apb.psel;" in ip
|
|
assert filelist.startswith("+incdir+")
|
|
|
|
|
|
def test_extensions_reject_noncontiguous_slots_and_invalid_modules(tmp_path: Path) -> None:
|
|
document = json.loads(EXTENSIONS.read_text(encoding="utf-8"))
|
|
document["core_targets"][2]["slot"] = 7
|
|
result = validate(write_invalid_extensions(tmp_path, document))
|
|
assert result.returncode != 0
|
|
assert "slots must be contiguous from 0" in result.stderr
|
|
|
|
document = json.loads(EXTENSIONS.read_text(encoding="utf-8"))
|
|
document["ip_targets"][0]["module"] = "user-ip"
|
|
result = validate(write_invalid_extensions(tmp_path, document))
|
|
assert result.returncode != 0
|
|
assert "must be a SystemVerilog identifier" in result.stderr
|