feat: add support for GF180 and SKY130 PDKs with corresponding warnings and simulation files

- Introduced new JSON files for warnings generated by Icarus Verilog, Verilator, and Yosys for both GF180 and SKY130 PDKs.
- Updated the build requirements to include necessary packages for handling JSON data.
- Modified RTL filelists to use generated files for GF180 and SKY130 standard-cell models.
- Enhanced the Iverilog makefile to generate filelists dynamically based on the selected PDK.
- Implemented a Python script to generate Iverilog filelists, accommodating both GF180 and SKY130 technologies.
- Added behavioral definitions for GF180 UDPs and a tri-state buffer for netlist simulations.
- Updated Yosys synthesis scripts to handle new PDKs and ensure proper tie cell mapping.
- Extended regression scripts to support PDK-specific commands for GF180 and SKY130.
- Added tests to verify that PDK-specific regression commands cover firmware, RTL, and netlist simulations.
This commit is contained in:
maksyuki committed 2026-07-24 09:17:08 +08:00
1 parent 7d90d2ffb4
commit 7c923687ff
37 files changed
+851 -123

No files matched your search

+6 -1
View File
@@ -67,7 +67,12 @@ def main() -> int:
tools.append("sta")
source_names = ["mpw", "cluster_common", "third_party_ip"]
pdk_names = {"IHP130": "pdk_ihp130", "ICS55": "pdk_ics55"}
pdk_names = {
"IHP130": "pdk_ihp130",
"ICS55": "pdk_ics55",
"GF180": "pdk_gf180",
"SKY130": "pdk_sky130",
}
if args.pdk in pdk_names:
source_names.append(pdk_names[args.pdk])
paths = {
+46 -3
View File
@@ -27,7 +27,10 @@ PR_COMMANDS = (
"configs/ci/mdd-rv32im-ihp130.mk",
("SIMU=VERILATOR", "HAVE_SVA=YES", "firmware", "sim"),
),
("configs/ci/hazard3-rv32im-ihp130.mk", ("SIMU=VERILATOR", "HAVE_SVA=YES", "sim")),
(
"configs/ci/hazard3-rv32im-ihp130.mk",
("SIMU=VERILATOR", "HAVE_SVA=YES", "firmware", "sim"),
),
(
"configs/ci/hazard3-rv32im-ihp130.mk",
("SIMU=IVERILOG", "RTL_SIM_TIMEOUT=5200000", "sim-asm"),
@@ -62,6 +65,31 @@ PR_PROFILES = (
)
NIGHTLY_PROFILES = PR_PROFILES + ("configs/nightly/picorv32-rv32im-ihp130.mk",)
PDK_PR_PROFILES = {
"GF180": "configs/ci/hazard3-rv32im-gf180.mk",
"IHP130": "configs/ci/hazard3-rv32im-ihp130.mk",
"SKY130": "configs/ci/hazard3-rv32im-sky130.mk",
}
def pdk_pr_commands(profile: str) -> tuple[tuple[str, tuple[str, ...]], ...]:
return (
(profile, ("firmware",)),
(profile, ("SIMU=VERILATOR", "HAVE_SVA=YES", "firmware", "sim")),
(profile, ("SIMU=IVERILOG", "RTL_SIM_TIMEOUT=5200000", "sim-asm")),
(profile, ("SYNTH=YOSYS", "synth")),
(
profile,
(
"SIMU=IVERILOG",
"SIM_FIRMWARE_NAME=retrosoc_asm",
"SIM_SUCCESS_MARKER=Mem wr/rd test success",
"RTL_SIM_TIMEOUT=5200000",
"netsim",
),
),
)
def regression_environment() -> dict[str, str]:
environment = os.environ.copy()
@@ -96,10 +124,25 @@ def main() -> int:
parser = argparse.ArgumentParser(description="Run a supported retroSoC regression suite")
parser.add_argument("--root", type=Path, required=True)
parser.add_argument("--suite", choices=("pr", "nightly"), required=True)
parser.add_argument("--pdk", choices=tuple(PDK_PR_PROFILES), help="run one PR PDK matrix")
parser.add_argument("--dry-run", action="store_true")
args = parser.parse_args()
commands = PR_COMMANDS if args.suite == "pr" else NIGHTLY_COMMANDS
profiles = PR_PROFILES if args.suite == "pr" else NIGHTLY_PROFILES
if args.pdk:
if args.suite == "nightly":
if args.pdk != "IHP130":
parser.error("nightly regression supports only --pdk IHP130")
commands = NIGHTLY_COMMANDS
profiles = NIGHTLY_PROFILES
elif args.pdk == "IHP130":
commands = PR_COMMANDS
profiles = PR_PROFILES
else:
profile = PDK_PR_PROFILES[args.pdk]
commands = pdk_pr_commands(profile)
profiles = (profile,)
else:
commands = PR_COMMANDS if args.suite == "pr" else NIGHTLY_COMMANDS
profiles = PR_PROFILES if args.suite == "pr" else NIGHTLY_PROFILES
environment = regression_environment()
for profile, values in commands:
command = ["make", f"CONFIG={profile}", *values]