feat: enhance JPEG processing modules and tests

- Updated  to integrate a coefficient engine and additional signals for coefficient handling.
- Modified  to include a coefficient engine, enhancing the encoding process with new signals.
- Improved  to validate generated blocks against expected values and added timeout handling.
- Introduced  for testing SRAM wrappers in JPEG workspace.
- Enhanced test coverage in  to reject invalid STA net drivers.
- Updated  to ensure proper coverage of canonical domains in timing contracts.
- Added a new test for JPEG coefficient engine in .
- Improved memory map tests in  to validate public active MMIO regions.
- Enhanced management core specification tests in  to verify high-performance core specifications.
- Added behavioral-only checks in  to exclude synthesis and netlist consumers.
- Updated SDRAM tests in  to track active firmware memory.
- Enhanced STA constraints tests in  to cover current clock domains and net drivers.
This commit is contained in:
maksyuki committed 2026-09-01 22:33:35 +08:00
1 parent 39bc1c84b4
commit 2840d22e96
50 files changed
+2640 -1278

No files matched your search

+4 -2
View File
@@ -107,10 +107,12 @@ def validate(document_path: Path, root: Path) -> None:
else:
sta_sources[name] = require_identifier(source_domain, f"{field}.sta.source_domain")
object_type = sta.get("object_type", "pin")
if object_type not in {"pin", "port"}:
raise ValueError(f"{field}.sta.object_type must be pin or port")
if object_type not in {"net_driver", "pin", "port"}:
raise ValueError(f"{field}.sta.object_type must be net_driver, pin, or port")
if object_type == "pin":
require_hierarchical_pin(sta.get("pin"), f"{field}.sta.pin")
elif object_type == "net_driver":
require_identifier(sta.get("net"), f"{field}.sta.net")
elif source_port is None:
raise ValueError(f"{field}.sta port object requires source_port")
require_positive_number(sta.get("period_ns"), f"{field}.sta.period_ns")
+19
View File
@@ -42,6 +42,7 @@ RTL_LINT_OBSERVATION_VALUES = (
"check-rtl-lint",
)
OBSERVATION_TARGETS = ("check-warnings", "check-metrics")
SYNTHESIS_DEPENDENT_TARGETS = frozenset(("synth", "sta", "netsim", "netsim-boot", "metrics"))
PR_COMMANDS = (
@@ -192,6 +193,17 @@ def with_netsim_boot_only(
return tuple(transformed)
def behavioral_only(
commands: tuple[tuple[str, tuple[str, ...]], ...],
) -> tuple[tuple[str, tuple[str, ...]], ...]:
"""Exclude synthesis and commands that consume its generated netlist."""
return tuple(
(profile, values)
for profile, values in commands
if SYNTHESIS_DEPENDENT_TARGETS.isdisjoint(values)
)
def run_command(
command: list[str], root: Path, capture_output: bool, environment: dict[str, str]
) -> str:
@@ -243,6 +255,11 @@ def main() -> int:
action="store_true",
help="locally stop each Icarus assembly netlist run after Hello retroSoC!",
)
parser.add_argument(
"--behavioral-only",
action="store_true",
help="skip synthesis, STA, netlist simulation, and synthesis-recipe metrics",
)
args = parser.parse_args()
try:
commands, profiles = select_regression(args.suite, args.pdk)
@@ -250,6 +267,8 @@ def main() -> int:
parser.error(str(error))
if args.netsim_boot_only:
commands = with_netsim_boot_only(commands)
if args.behavioral_only:
commands = behavioral_only(commands)
environment = regression_environment()
for profile, values in commands:
command = ["make", f"CONFIG={profile}", *values]