rtl: FluidPopSoC v1 — end-to-end wire-up of all v1 submodules #130

Merged
navigator merged 1 commit from auto/issue-125-20260618T073317Z_issue125 into main 2026-06-24 02:08:00 -03:00
Owner

Summary

Lands the first end-to-end wire-up of all v1 submodules inside FluidPopSoC:

  • Constructor reads PopSoCConfig (TileCountKey, FabricPortCountKey, IsMasterKey, VariantKey).
  • Instantiates PopRoCCRouter (#107), MultiGemminiCluster (#114), InterChipFabric (#127), FabricPortCountKey× PopLinkPHY_Behavioral (#116), and — only when IsMasterKey==true per ADR-008 — PCIeHostBridge.
  • Wires PopRoCCRouterMultiGemminiCluster per-tile fan-out (tileCmd/tileResprocc.cmd/rocc.resp).
  • Surfaces Vec(numCores, Decoupled(...)) Rocket-shaped RoCC cmd/resp at top IO; default numCores = 2 per ADR-006 Edu.
  • Cluster ↔ Fabric ↔ PHY data-path attach surfaces are exposed but tied to safe defaults — every sibling SPEC §Interface leaves the concrete bundle shape Open; bench can sweep them later without re-elaborating.

Open questions not invented (per issue scope + SPEC §Interface)

  • DDR5 / mem port — left as the top-level commented // val mem = ??? marker.
  • Rocket core instantiation — top exposes Vec(numCores, Decoupled(...)) RoCC ports rather than instantiating Rocket directly (Chipyard pin per PLAN.md §6 Week 4).
  • BMC sideband + JTAG — surfaced as opaque Input(UInt(32.W)) placeholders, annotated.

Test plan

  • rtl/src/pop/FluidPopSoC.scala body instantiates and wires all the v1 submodules
  • rtl/tests/FluidPopSoC/FluidPopSoCSpec.scala extended with the two mandated scenarios:
    • FluidPopMasterConfig elaborates AND instantiates PCIeHostBridge
    • FluidPopSlaveConfig elaborates AND skips PCIeHostBridge
  • sbt -no-colors test green (33/33 tests pass across all suites)
  • No fabricated DDR5 / Rocket-internal widths
  • No edits outside rtl/src/pop/FluidPopSoC.scala and rtl/tests/FluidPopSoC/

Closes #125

## Summary Lands the first end-to-end wire-up of all v1 submodules inside `FluidPopSoC`: - Constructor reads `PopSoCConfig` (`TileCountKey`, `FabricPortCountKey`, `IsMasterKey`, `VariantKey`). - Instantiates `PopRoCCRouter` (#107), `MultiGemminiCluster` (#114), `InterChipFabric` (#127), `FabricPortCountKey`× `PopLinkPHY_Behavioral` (#116), and — only when `IsMasterKey==true` per ADR-008 — `PCIeHostBridge`. - Wires `PopRoCCRouter` ↔ `MultiGemminiCluster` per-tile fan-out (`tileCmd`/`tileResp` ↔ `rocc.cmd`/`rocc.resp`). - Surfaces `Vec(numCores, Decoupled(...))` Rocket-shaped RoCC cmd/resp at top IO; default `numCores = 2` per ADR-006 Edu. - Cluster ↔ Fabric ↔ PHY data-path attach surfaces are exposed but tied to safe defaults — every sibling SPEC §Interface leaves the concrete bundle shape Open; bench can sweep them later without re-elaborating. ## Open questions not invented (per issue scope + SPEC §Interface) - DDR5 / mem port — left as the top-level commented `// val mem = ???` marker. - Rocket core instantiation — top exposes `Vec(numCores, Decoupled(...))` RoCC ports rather than instantiating Rocket directly (Chipyard pin per PLAN.md §6 Week 4). - BMC sideband + JTAG — surfaced as opaque `Input(UInt(32.W))` placeholders, annotated. ## Test plan - [x] `rtl/src/pop/FluidPopSoC.scala` body instantiates and wires all the v1 submodules - [x] `rtl/tests/FluidPopSoC/FluidPopSoCSpec.scala` extended with the two mandated scenarios: - `FluidPopMasterConfig` elaborates AND instantiates `PCIeHostBridge` - `FluidPopSlaveConfig` elaborates AND skips `PCIeHostBridge` - [x] `sbt -no-colors test` green (33/33 tests pass across all suites) - [x] No fabricated DDR5 / Rocket-internal widths - [x] No edits outside `rtl/src/pop/FluidPopSoC.scala` and `rtl/tests/FluidPopSoC/` Closes #125
rtl: FluidPopSoC v1 — end-to-end wire-up of router + cluster + fabric + PHY + master-only PCIe
All checks were successful
build / scalafmt-check (pull_request) Successful in 4s
build / sbt-compile (pull_request) Successful in 4s
build / shell-lint (pull_request) Successful in 1m2s
5bcd4b1b91
Constructor reads PopSoCConfig (TileCountKey, FabricPortCountKey,
IsMasterKey, VariantKey) and instantiates the v1 submodules per
ADR-001/006/008/009/010: 1× PopRoCCRouter, 1× MultiGemminiCluster,
1× InterChipFabric, FabricPortCountKey× PopLinkPHY_Behavioral, and
— only when IsMasterKey==true per ADR-008 — 1× PCIeHostBridge.

Per-tile RoCC fan-out is wired router.tileCmd/tileResp ↔ cluster.rocc,
and per-core Rocket-shaped Decoupled cmd/resp ports are surfaced at
top IO (Rocket cores stay outside the SoC for v1 per Chipyard pin
Open question). Cluster ↔ fabric ↔ PHY data-path attach surfaces are
exposed but tied to safe defaults — every sibling SPEC §Interface
leaves the concrete bundle shape Open; the bench can sweep them later
without re-elaborating. JTAG and BMC are opaque Input(UInt(32.W))
placeholders per the issue scope; DDR5 mem port stays Open with the
commented `// val mem = ???` marker.

FluidPopSoCSpec extended with the two acceptance scenarios:
FluidPopMasterConfig elaborates AND instantiates PCIeHostBridge;
FluidPopSlaveConfig elaborates AND skips it.

Closes #125
Author
Owner

VERDICT: PASS

PR #130 lifts FluidPopSoC from elaborate-only into the v1 end-to-end wire-up that ties together all the v1 submodules landed in prior PRs (#107 PopRoCCRouter, #114→#126 MultiGemminiCluster, #127 InterChipFabric, #116 PopLinkPHY_Behavioral, #94→ PCIeHostBridge), scoped cleanly to Issue #125. Mechanical guardrails pass: SPDX headers preserved (CHARRUA-1.2 source, AGPL-3.0-or-later test), package pop everywhere, no AI/Anthropic attribution, no off-limits paths, scope bounded to two files. Rule 4 is handled correctly: the six SPEC §Interface categories remain surfaced — ddr5 / popLink / pcie / clockReset as empty bundles with TBD comments, jtagDebug / bmc switched from empty bundles to opaque Input(UInt(32.W)) placeholders per the issue body's explicit ask ("BMC sideband, JTAG — surfaced as opaque Input(UInt(32.W)) placeholders, annotated"). The new rocc top-level Vec(numCores) Rocket-shaped attach correctly surfaces the per-core RoCC ports since cores live outside the SoC for v1 (Chipyard pin per PLAN.md §6 Week 4 still pending). Rule 7 is meticulously handled: numCores = 2 default matches ADR-006 Edu, xLen = 64 matches ADR-001 RV64GC, Field keys (TileCountKey, FabricPortCountKey, IsMasterKey, VariantKey) read directly from PopSoCConfig per PR #108, no widths invented — all the data-path attach tie-offs are documented as Open per the corresponding sibling SPECs. The variant-gated PCIeHostBridge uses an honest Option[PCIeHostBridge] with the master-only if (isMaster) Some(...) else None pattern matching ADR-008 Decision verbatim. The 32-bit opaque JTAG/BMC placeholder width is annotated as opaque rather than as any specific SPEC commitment. Per-tile wire-up correctly uses tileCount (router's tileCmd/tileResp Vec width matches cluster's rocc.cmd/rocc.resp Vec width); per-core wire-up correctly uses numCores. PHY instances are tied off using the v1 behavioral PHY contract from PR #116 (tx.data zeros, phyResetReq/trainReq false, berDenominator/dropEvery zero). Fabric CSR / credits are tied off with documented "TBD per ADR-008 — eFuse / tie-off" for myChipId and "Open question on creditReturn protocol" annotation. Cluster clusterStop held inactive with the right reason ("chip-level CSR sequencing is Open per SPEC §Behavior"). Tests verify both Issue #125 scenarios cleanly using Scala-level Option[PCIeHostBridge] introspection: FluidPopMasterConfigc.pcie.isDefined, FluidPopSlaveConfigc.pcie.isEmpty, plus an assertion on the corresponding IsMasterKey resolution. The default constructor uses FluidPopMasterConfig so the legacy should "elaborate" smoke test still works. The data-path attaches (cluster ↔ fabric ↔ PHY) are honestly deferred with explicit forward-links to the sibling SPECs' Open questions — the fabric phy bundle stays empty, the cluster popLink/mem/perfCounters subbundles drive DontCare internally, and no concrete bundle shapes are invented at this v1.

Findings

None.

<!-- agent:review verdict=PASS ts=1781768736 --> **VERDICT:** PASS PR #130 lifts `FluidPopSoC` from elaborate-only into the v1 end-to-end wire-up that ties together all the v1 submodules landed in prior PRs (#107 PopRoCCRouter, #114→#126 MultiGemminiCluster, #127 InterChipFabric, #116 PopLinkPHY_Behavioral, #94→ PCIeHostBridge), scoped cleanly to Issue #125. Mechanical guardrails pass: SPDX headers preserved (`CHARRUA-1.2` source, `AGPL-3.0-or-later` test), `package pop` everywhere, no AI/Anthropic attribution, no off-limits paths, scope bounded to two files. Rule 4 is handled correctly: the six SPEC §Interface categories remain surfaced — `ddr5` / `popLink` / `pcie` / `clockReset` as empty bundles with TBD comments, `jtagDebug` / `bmc` switched from empty bundles to opaque `Input(UInt(32.W))` placeholders per the issue body's explicit ask ("BMC sideband, JTAG — surfaced as opaque `Input(UInt(32.W))` placeholders, annotated"). The new `rocc` top-level Vec(numCores) Rocket-shaped attach correctly surfaces the per-core RoCC ports since cores live outside the SoC for v1 (Chipyard pin per PLAN.md §6 Week 4 still pending). Rule 7 is meticulously handled: `numCores = 2` default matches ADR-006 Edu, `xLen = 64` matches ADR-001 RV64GC, Field keys (`TileCountKey`, `FabricPortCountKey`, `IsMasterKey`, `VariantKey`) read directly from `PopSoCConfig` per PR #108, no widths invented — all the data-path attach tie-offs are documented as Open per the corresponding sibling SPECs. The variant-gated PCIeHostBridge uses an honest `Option[PCIeHostBridge]` with the master-only `if (isMaster) Some(...) else None` pattern matching ADR-008 Decision verbatim. The 32-bit opaque JTAG/BMC placeholder width is annotated as opaque rather than as any specific SPEC commitment. Per-tile wire-up correctly uses `tileCount` (router's `tileCmd`/`tileResp` Vec width matches cluster's `rocc.cmd`/`rocc.resp` Vec width); per-core wire-up correctly uses `numCores`. PHY instances are tied off using the v1 behavioral PHY contract from PR #116 (`tx.data` zeros, `phyResetReq`/`trainReq` false, `berDenominator`/`dropEvery` zero). Fabric CSR / credits are tied off with documented "TBD per ADR-008 — eFuse / tie-off" for `myChipId` and "Open question on creditReturn protocol" annotation. Cluster `clusterStop` held inactive with the right reason ("chip-level CSR sequencing is Open per SPEC §Behavior"). Tests verify both Issue #125 scenarios cleanly using Scala-level `Option[PCIeHostBridge]` introspection: `FluidPopMasterConfig` → `c.pcie.isDefined`, `FluidPopSlaveConfig` → `c.pcie.isEmpty`, plus an assertion on the corresponding `IsMasterKey` resolution. The default constructor uses `FluidPopMasterConfig` so the legacy `should "elaborate"` smoke test still works. The data-path attaches (cluster ↔ fabric ↔ PHY) are honestly deferred with explicit forward-links to the sibling SPECs' Open questions — the fabric `phy` bundle stays empty, the cluster `popLink`/`mem`/`perfCounters` subbundles drive `DontCare` internally, and no concrete bundle shapes are invented at this v1. ## Findings _None._
Author
Owner
No description provided.
<!-- agent:pinged ts=1781776435 -->
fluidpop-bot approved these changes 2026-06-24 02:06:10 -03:00
Dismissed
fluidpop-bot left a comment
Collaborator

CI green (head 5bcd4b1b91), auto-approving

CI green (head 5bcd4b1b9137a07d5fb38aa72e124eaf870b0f7f), auto-approving
fluidpop-bot approved these changes 2026-06-24 02:07:11 -03:00
Dismissed
fluidpop-bot left a comment
Collaborator

CI green (head 5bcd4b1b91), auto-approving

CI green (head 5bcd4b1b9137a07d5fb38aa72e124eaf870b0f7f), auto-approving
navigator force-pushed auto/issue-125-20260618T073317Z_issue125 from 5bcd4b1b91
All checks were successful
build / scalafmt-check (pull_request) Successful in 4s
build / sbt-compile (pull_request) Successful in 4s
build / shell-lint (pull_request) Successful in 1m2s
to 7c0e0f5c27
All checks were successful
build / scalafmt-check (pull_request) Successful in 4s
build / sbt-compile (pull_request) Successful in 4s
build / shell-lint (pull_request) Successful in 15s
2026-06-24 02:07:14 -03:00
Compare
fluidpop-bot left a comment
Collaborator

CI green (head 7c0e0f5c27), auto-approving

CI green (head 7c0e0f5c27bb6c02b52fd620621f62077dfb6dce), auto-approving
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Fluid/fluidpop-v1!130
No description provided.