rtl: MultiGemminiCluster v1 — per-tile dispatch + quiescence FSM #114
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
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Fluid/fluidpop-v1#114
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Goal
Implement v1 behaviour of
MultiGemminiClusterper Draft SPEC atrtl/src/pop/specs/MultiGemminiCluster.SPEC.md(#93). Skeleton (#81) lands the empty IO bundle; this issue lands the per-tile dispatch + drain logic.Scope — strictly what the Draft SPEC pins
class MultiGemminiCluster(N: Int = 4, numCores: Int = 2)—Ntracks ADR-001 /PopSoCConfig.TileCountKey;numCorestracks ADR-006.xbar = Module(new InterGemminiXbar(N))(the dependency that lands inrtl: InterGemminiXbar v1should be merged first — issue body should mention this dep).roccingress fromPopRoCCRouteralready decoded per tile; cluster forwards each per-tile stream toxbar.io.ingress(tileId), egress feeds the per-Gemmini RoCC attach (stub — actual Gemmini instantiation is out of scope until upstream pin lands; use aBlackBoxplaceholder for each Gemmini with theRoCCCommand/RoCCResponsemirror types from PopRoCCRouter).clusterStop = Input(Bool()): de-assert allrocc(i).ready, wait until in-flight count is 0, then assertclusterIdle = Output(Bool()). Per SPEC §Behavior "Quiescence and drain on cluster-stop CSR".Open Questions — do NOT invent
rocc— Open. Add minimalmem/csrports as empty BlackBox bundles with// Open question per SPEC §Behaviorcomments.Acceptance criteria
rtl/src/pop/MultiGemminiCluster.scalabody materialises xbar instantiation + per-tile dispatch + quiescence FSMrtl/tests/MultiGemminiCluster/MultiGemminiClusterSpec.scalaextended with two scenarios:clusterStop=1drains in-flight requests and raisesclusterIdleafter queue emptiessbt -no-colors testgreenPlan refs
PLAN.md §8.2, §12.3; ADR-001, ADR-003, ADR-006, ADR-011.
Notes
Depends on
rtl: InterGemminiXbar v1(which is a separate queued issue) — open question whether resolver should wait or skip. If the xbar v1 PR has not merged yet, resolver should stub the xbar wiring withBlackBoxand fail with a<!-- agent:fail reason=blocker:xbar-v1-pending -->comment.Explanation:
Issue #114 says:
State on
origin/mainat run start (commit0023338):rtl/src/pop/InterGemminiXbar.scalais still the empty-IO skeleton from #49 / #64 —class InterGemminiXbar extends Modulewithval io = IO(new Bundle { }). No ingress/egress port count, no payload width, no per-port back-pressure shape is pinned.openand currentlyagent:in-progresson a sibling resolver run. No PR for it is open againstmainyet (only #107, #108 from the same cohort have landed).Wiring
MultiGemminiClusterv1 against the empty-IO skeleton would force the cluster to invent thexbar.io.ingress(tileId)/xbar.io.egress(...)Decoupled bundle shape (and the per-tile scratchpad port shape behind it) ahead ofInterGemminiXbar.SPEClifting those Open questions in #112. That violates the "No Gemmini-internal width invention" acceptance criterion and the "No widths, no port counts" rule of the existing skeleton header, and would lock the xbar v1 resolver into the shape this resolver happened to guess.Follow-up: re-queue #114 once #112 lands on
main.Explanation:
Issue #114 says:
State on
origin/mainat run start (commit153e6e1):rtl/src/pop/InterGemminiXbar.scalais still the empty-IO skeleton from #49 / #64 —class InterGemminiXbar extends Modulewithval io = IO(new Bundle { }). No ingress/egress port count, no payload bundle shape, and no per-port back-pressure discipline are committed in-tree.agent:pr-openwith PR #115 againstmain. PR #115 isopen,mergeable=true, but not merged. It is the PR that would pinclass InterGemminiXbar(n, payloadBits, fifoDepth)plus theingress(i)/egress(i)Decoupled bundles on the cluster side.Wiring
MultiGemminiClusterv1 against the empty-IO skeleton would force this cluster to invent thexbar.io.ingress(tileId)/xbar.io.egress(...)Decoupled bundle shape (and the per-tile scratchpad port shape behind it) ahead ofInterGemminiXbar.SPEClifting those Open questions in #112 / #115. That violates the "No Gemmini-internal width invention" acceptance criterion of this issue and the "No widths, no port counts" rule of the existing skeleton header, and would lock the xbar v1 resolver into the shape this resolver happened to guess.Follow-up: re-queue #114 once #115 lands on
main.