rtl: MultiGemminiCluster v1 — per-tile dispatch + quiescence FSM #126
No reviewers
Labels
No labels
adr
agent:blocked-ci
agent:blocked-human
agent:blocked-resolver
agent:done
agent:in-progress
agent:no-touch
agent:pinged
agent:pr-open
agent:queued
agent:wip
area:board
area:funding
area:infra
area:phy
area:poplink
area:rtl
area:software
area:supply-chain
area:verification
ci-failed
ci-timeout
docs
do-not-merge
human-approved
needs-human-approval
needs-rebase
needs-triage
phase:1
ready-for-review
review:findings
review:pass
risk:tripwire
swarm:quarantined
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Fluid/fluidpop-v1!126
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "auto/issue-114-20260618T051157Z_issue114"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Implements the v1 body of
MultiGemminiClusterper the Draft SPEC atrtl/src/pop/specs/MultiGemminiCluster.SPEC.mdand the scope pinned by issue #114.What landed
class MultiGemminiCluster(N: Int = 4, numCores: Int = 2, xLen: Int = 64)—Ntracks ADR-001 /PopSoCConfig.TileCountKey,numCorestracks ADR-006,xLendefaults to 64 (ADR-001 RV64GC).Module(new InterGemminiXbar(n = N, payloadBits = (new RoCCCommand(xLen)).getWidth))— opaque RoCC payload carries through the xbar with no per-tile bundle invention.io.rocc.cmd(i)is self-routed (tileId = i) intoxbar.io.ingress(i);xbar.io.egress(i)drives a per-tileGemminiBlackBoxStub. The stub mirrors the future Gemmini BlackBox IO (RoCCCommand/RoCCResponsefromPopRoCCRouter) with a 1-cycle loopback queue so the bench can observe end-to-end dispatch without inventing Gemmini-internal widths. Emptymem/csrsub-bundles are surfaced with theOpen question per SPEC §Behaviormarkers required by the issue body. Replaced by a true BlackBox wrapping upstream Gemmini once the Chipyard 1.13.0 pin lands (PLAN.md §6).sActive/sDrain/sIdle). OnclusterStop = 1everyrocc.cmd(i).readyis gated low; once the in-flight counter (incremented on accepted cmds, decremented on emitted resps) hits zero,clusterIdlerises. Matches SPEC §Behavior "Quiescence and drain on cluster-stop CSR".Bench
Extended
rtl/tests/MultiGemminiCluster/MultiGemminiClusterSpec.scalawith the two scenarios named in the issue acceptance criteria:rocc(2), checks that the matching resp emerges onrocc(2)(with the dispatchedrd/rs1) and that no neighbour port fires.clusterStop = 1drains in-flight and raisesclusterIdle— builds in-flight by dampeningresp(0), assertsclusterStop, verifies everyrocc.cmd(i).readygoes low andclusterIdlestays low, then releases the dam and checksclusterIdlerises within the drain budget.sbt -no-colors testis green across all 25 tests in the rtl suite (cluster, xbar, router, configs, PHY, fabric).Out of scope (deferred per SPEC §Interface Open questions)
mem/popLink/perfCounterssub-bundles stay empty — concrete shape pinned at FluidPopSoC v1 alongside the L2 attach (ADR-011) and the perf-counter ADR named in the SPEC.Test plan
sbt -no-colors testOnly pop.MultiGemminiClusterSpec— greensbt -no-colors test— full rtl suite green (25/25)Closes #114
VERDICT: PASS
PR #126 lifts
MultiGemminiClusterfrom elaborate-only into a v1 with xbar instantiation, per-tile RoCC dispatch, and a three-state quiescence FSM, scoped cleanly to Issue #114. Mechanical guardrails pass: SPDX headers preserved (CHARRUA-1.2source,AGPL-3.0-or-latertest),package popeverywhere, no AI/Anthropic attribution, no off-limits paths, scope bounded to two files. Rule 4 is handled correctly: theroccsub-bundle materialisesVec(N, Flipped(Decoupled(RoCCCommand)))/Vec(N, Decoupled(RoCCResponse))using the canonical local mirrors from PR #69; the per-tile vs per-core shape choice (Vec(N) instead of Vec(numCores)) is explicitly justified inline — the cluster sees PopRoCCRouter's already-decoded per-tile fan-out, matchingPopRoCCRouter.io.tileCmd/io.tileRespfrom PR #107 — and the SPEC §Interface Open question on per-tile bundle shape covers this resolution. The three TBD facets (mem,popLink,perfCounters) remain empty sub-bundles with explicit deferral comments tied to the ADR-011 L2 attach (at FluidPopSoC v1), InterChipFabric sibling SPEC, and the perf-counter ADR. The newclusterStop/clusterIdleIO pair is honestly surfaced as direct ports rather than fabricating a CSR shape — the CSR address-map is Open per SPEC §Interface. Rule 7 is meticulously handled:N = 4matches ADR-001 Edu,numCores = 2matches ADR-006 Edu,xLen = 64matches RV64GC,N >= 4 && N <= 16constraint matches PR #115's SPEC-aligned InterGemminiXbar bound (which propagates here since the cluster shares the xbar),numCores >= 1is a minimal sanity check, andInFlightWidth = 8is documented as engineering head-room for N=16 rather than a SPEC commitment. TheGemminiBlackBoxStubis honestly framed: the comment explains a trueBlackBoxwould block chiseltest's default backend, so an in-tree stub Module with the right IO shape + 1-cycle loopback Queue is used, with explicit "replaced by a true BlackBox wrapping upstream Gemmini once the Chipyard 1.13.0 pin lands (PLAN.md §6)" forward-link. The self-routed xbar usage (tileId = i) is candidly flagged as a v1 placeholder — the xbar's primary purpose (peer-to-peer scratchpad data exchange per SPEC §Behavior) waits on the SPEC §Behavior Open question on scratchpad-port bundle shape. The quiescence FSM implements the three states (sActive/sDrain/sIdle) with properclusterStopdeassertion handling and in-flight counter sized to the worst case at N=16. Both Issue #114 scenarios are exercised: scenario 1 verifies dispatch routes through xbar to the per-tile stub and surfaces resp on the matching tile (with neighbour-port silence check); scenario 2 verifiesclusterStop=1gates everyrocc.cmd(i).readylow within one cycle, holdsclusterIdlelow while drain is pending, raises it within the 64-cycle drain budget once the dam releases, keeps ingress gated whileclusterStopholds, and verifies the FSM returns tosActivecleanly onclusterStopdeassertion.Findings
None.
CI green (head
090a2eb8f0), auto-approving