# gem5 Garnet 2.0 中文精读笔记

**Source:** gem5 documentation, *Garnet 2.0*
**URL:** https://www.gem5.org/documentation/general_docs/ruby/garnet-2/
**Page last edited:** 2026-04-22 14:45:48 +0000
**Notes date:** 2026-04-28

本文是面向 OpenUSim / UBody 建模讨论的中文精读笔记，不是 gem5 文档的逐字全译。重点保留 Garnet 2.0 的公开 NoC/router 建模事实、可配置参数、router microarchitecture、flow control、lifecycle，以及它们对 `UBody` 后续细化的参考价值。

---

## 1. 文档定位

Garnet 2.0 是 gem5 Ruby memory system 中的详细 interconnection network model。它主要服务片上互联网络建模，也可以通过合适的 router / link delay 配置来建模 off-chip interconnection network。

对 `UBody` 调研而言，Garnet 2.0 的价值和 Cisco / PSA / multi-pipeline 论文不同：

- Cisco Q200 说明公开工业交换 ASIC 中存在 multislice + crossbar + VOQ 结构。
- PSA 和相关论文说明公开 multi-pipeline switch 中存在 port-local pipeline、pipeline-local state 和 explicit cross-pipeline path。
- Garnet 2.0 提供公开 NoC/router simulator 的微架构建模方法：router、link、flit、virtual channel、credit flow control、switch allocation、crossbar traversal、per-router latency、per-link latency。

因此，Garnet 2.0 更适合作为 `UBody` 后续从 fixed-delay `UbNetworkOnChip` 细化到 body-to-body router / fabric 模型的参考，而不是作为 `UBody` 在交换 ASIC 中存在的直接证据。

---

## 2. Garnet 2.0 总览

gem5 文档把 Garnet 2.0 描述为 gem5 内部的详细 interconnection network model。它继承自原始 Garnet 模型，并提供 cycle-accurate 的 on-chip network router microarchitecture。

核心特征：

- 是 Ruby memory system 里的 interconnection network model。
- 复用 gem5 Ruby 的 topology 和 routing infrastructure。
- 默认 router 是一个 state-of-the-art 1-cycle pipeline。
- 可以给任意 router 增加任意 cycle 数的额外延迟。
- 可以通过配置 router / link delay 建模 off-chip interconnection network。
- 可独立运行 synthetic traffic。

相关源码文件：

- `src/mem/ruby/network/Network.py`
- `src/mem/ruby/network/garnet2.0/GarnetNetwork.py`
- `src/mem/ruby/network/Topology.cc`

对 OpenUSim 的直接启发：

- 当前 `UbNetworkOnChip` 是 fixed-delay body-to-body hop，Garnet 2.0 展示了一个公开可引用的下一步细化方向：把 hop 拆成 router latency、link latency、VC buffer、switch allocation、crossbar traversal 和 credit flow control。

---

## 3. 启用方式

gem5 中 Garnet 2.0 可通过 network 参数启用：

```text
--network=garnet2.0
```

对 OpenUSim 来说，重要的不是这个命令本身，而是它说明 Garnet 是一个可选 network backend。这个思想可以借鉴到 `UbNetworkOnChip`：

- 短期 backend：fixed-delay body hop。
- 中期 backend：Garnet-like router/link/credit model。
- 长期 backend：根据实验目标选择不同 fidelity 的 body fabric model。

---

## 4. 配置参数

Garnet 2.0 使用通用 network 参数和 Garnet 特有参数。

### 4.1 通用 network 参数

`number_of_virtual_networks`：

- 最大 virtual networks 数。
- 实际活跃 vnets 由 coherence protocol 决定。

`control_msg_size`：

- control message 的字节数。
- 默认 8 bytes。
- data message size 由 cache block size 加 control message size 得到。

### 4.2 Garnet 特有参数

`ni_flit_size`：

- flit size，单位 bytes。
- flit 是 router 间传输信息的粒度。
- 默认 16 bytes，即 128 bits。
- 默认设置下，control message 可放入 1 个 flit，data message 放入 5 个 flits。
- Garnet 要求 `ni_flit_size` 与 link bandwidth factor 一致，因为它不建模网络内部可变带宽。
- 命令行可通过 `--link-width-bits` 设置。

`vcs_per_vnet`：

- 每个 virtual network 的 virtual channels 数。
- 默认 4。
- 命令行可通过 `--vcs-per-vnet` 设置。

`buffers_per_data_vc`：

- data message class 中每个 VC 的 flit buffer 数。
- data message 默认占 5 个 flits，所以该值可在 1 到 5 之间。
- 默认 4。

`buffers_per_ctrl_vc`：

- control message class 中每个 VC 的 flit buffer 数。
- control message 默认占 1 个 flit，且一个 VC 一次只能持有一个 message。
- 因此该值必须是 1。
- 默认 1。

`routing_algorithm`：

- `0`：weight-based table，默认。
- `1`：XY routing。
- `2`：custom routing。

对 `UBody` 的启发：

- body-to-body 网络参数可以拆成 `flit_size`、`vcs_per_class`、`buffer_depth_per_vc`、`routing_algorithm`、`link_width` 等，而不是只保留一个 fixed delay。
- control traffic 和 data traffic 可以使用不同 buffer depth / traffic class。
- 如果 UB 模型里有 URMA / LDST / control frame，不同 traffic class 可以映射到不同 virtual networks 或 queue classes。

---

## 5. Topology

Garnet 2.0 复用 Ruby 的 Topology infrastructure。文档说明它可以建模任意 heterogeneous topology。

重要能力：

- 每个 router 可指定独立 latency。
- 每条 link 可指定可选参数 `src_outport` 和 `dst_inport`。
- `src_outport` / `dst_inport` 是字符串，用来命名 source router 的 output port 和 destination router 的 input port。
- 这些 port name 可用于 custom routing algorithm。
- 例如 mesh 中 west-to-east link 可把 `src_outport` 设为 `west`，`dst_inport` 设为 `east`。

Network components：

- `GarnetNetwork`：顶层对象，实例化 network interfaces、routers 和 links。
- `NetworkInterface`：一侧连接 coherence controller 的 MsgBuffer，另一侧连接 router；把 protocol message 转成 control 或 data flits 注入 router。
- `Router`：管理 output-link arbitration 和 routers 间 flow control。
- `NetworkLink`：承载 flits，有 external 和 internal link 类型。
- `CreditLink`：承载 VC / buffer credits，用于 flow control。

对 `UBody` 的启发：

- `UBody` 可以被看作 topology 中的 router / local network node。
- `UbIoDie` 或 body fabric 可以是顶层 network object，负责实例化 bodies、links、credit links。
- 当前 `ForwardToBody` 可以从 `source body -> target body` fixed hop，逐步扩展为明确 internal links。
- `src_outport / dst_inport` 类似的命名可用于表达 body-local port direction、ring direction、external egress direction。

---

## 6. Routing

Garnet 2.0 默认使用 deterministic table-based shortest-path routing。Link weights 可用于优先选择某些路径。

Custom routing：

- Garnet 提供基于 `src_outport` / `dst_inport` direction name 的 custom routing 框架。
- 例如在 mesh 中，可通过方向名实现 west-first。
- custom routing 可在 `RoutingUnit.cc` 中实现。
- 命令行通过 `--routing-algorithm=2` 使用 custom routing。

Multicast：

- Garnet 2.0 模型内部没有硬件 multicast 支持。
- multicast message 会在 Network Interface 被拆成多个 unicast messages。

对 `UBody` 的启发：

- `LocalSink / ForwardToBody / ForwardToExternalPort` 可以视为 body router 的 route compute / disposition。
- 如果后续有 ring / mesh / custom topology，body-to-body routing 应该被显式建模，而不是藏在 `if targetBody != thisBody`。
- multicast-like body forwarding 可先在 ingress / NI 侧拆成多个 unicast body forwards，不必一开始建硬件 multicast fabric。

---

## 7. Flow Control

Garnet 2.0 使用 Virtual Channel Flow Control。

关键点：

- 每个 VC 一次只能持有一个 packet。
- 存在 control 和 data 两类 VCs。
- control VC 默认 1-flit deep。
- data VC 默认 4-flit deep。
- control packet 默认 1 flit。
- data packet 默认 5 flits。
- buffer depth 可以在 `GarnetNetwork.py` 中独立控制。
- credits 用于传递 VC 和 buffer 空闲信息。

对 `UBody` 的启发：

- 当前 `ForwardToBody` 只加 fixed delay，不表达目标 body 是否有 buffer / VC 空间。
- 后续可增加 credit-based admission：source body 只有在 target body / link 有 credit 时才能发 body-to-body flit / packet。
- `IngressQueue / ContextBuffer / WriteBuffer` 可与 body fabric VC 分开建模，避免把所有 backpressure 混成一个 queue。

---

## 8. Router microarchitecture

Garnet 2.0 router 的动作分为六步。

1. `Buffer Write (BW)`：

incoming flit 被写入对应 VC buffer。

2. `Route Compute (RC)`：

buffered flit 计算 output port，并把结果存入 VC。

3. `Switch Allocation (SA)`：

所有 buffered flits 尝试为下一 cycle 预留 switch ports。分两级 arbitration：

- 每个 input 用 input arbiter 选择一个 input VC 发出 switch request。
- 每个 output port 用 output arbiter 解决多个 input 的冲突。

ordered virtual networks 中 arbiter 使用 queueing 以维护 point-to-point ordering；其他 arbiter 使用 round-robin。

4. `VC Selection (VS)`：

SA winner 如果是 `HEAD` 或 `HEAD_TAIL` flit，会从 output port 选择一个 free VC。

5. `Switch Traversal (ST)`：

赢得 SA 的 flit 穿过 crossbar switch。

6. `Link Traversal (LT)`：

flit 从 crossbar 出来后穿过 link 到达下一 router。

默认时序：

- `BW / RC / SA / VS / ST` 在 1 cycle 内完成。
- `LT` 在下一 cycle 完成。

Multi-cycle router：

- 可以在 topology file 里配置 per-router latency。
- 也可以修改默认 router latency。
- 实现上，flit 在 router 中等待 `latency - 1` cycles 后，才有资格参加 switch allocation。

对 `UBody` 的启发：

- 当前 `UbNetworkOnChip` 的 fixed delay 可拆成 `route compute + arbitration + fabric traversal + link traversal`。
- `ForwardToBody` 可先只建 `LT` delay，后续再加入 `SA` 和 credit。
- body-local `NetworkUnit` 后续可以显式拆分为 disposition、input buffer、allocator、crossbar/link send。
- ordered traffic class 和 unordered traffic class 应有不同 arbitration / ordering 策略。

---

## 9. Buffer management

Garnet 2.0 的 buffer 管理基于 vnet 和 VC。

每个 router input port 包含：

- `number_of_virtual_networks` 个 vnets。
- 每个 vnet 有 `vcs_per_vnet` 个 VCs。
- control vnet 的 VC buffer depth 由 `buffers_per_ctrl_vc` 控制。
- data vnet 的 VC buffer depth 由 `buffers_per_data_vc` 控制。

Credits 传递两类信息：

- free VC。
- 每个 VC 内可用 buffer 数量。

对 `UBody` 的启发：

- body-level queue 不应只有一个总深度；可以按 traffic class / vnet / destination / VC 拆分。
- 对 UB 场景，可以把 control frame、LDST、URMA 或不同 priority traffic 放进不同 vnet / VC 组。
- backpressure 需要表达“目标是否有 free VC”和“目标 VC 是否有 buffer”两个层面。

---

## 10. Lifecycle of a network traversal

Garnet 文档列出一次 network traversal 中各模块的 wakeup 行为。这里按模块整理。

### 10.1 NetworkInterface

`NetworkInterface` 一侧连接 coherence protocol controller，另一侧连接 router。

它负责：

- 从 protocol buffer 收 message。
- 根据 vnet 把 message 转为 1-flit control packet 或 multi-flit data packet。
- 注入 router。
- 从 network 收 flits，恢复 protocol message，再送回 protocol buffer。
- 管理和 attached router 的 credit flow control。

对 `UBody` 的启发：

- `UbIoDie` / `UBody` 边界也可以有 NetworkInterface-like 层：把高层 transaction / packet 转成 body fabric flits 或 descriptors。
- 当前 UB packet 可先保持 packet-level，后续若需要，可引入 flitization。

### 10.2 NetworkLink

`NetworkLink` 从 NI 或 router 收 flits，并在 `m_latency` cycles 后送到目标 NI 或 router。

Link latency：

- 可从命令行设置默认值。
- 可在 topology file 中为单条 link 覆盖。

对 `UBody` 的启发：

- body-to-body link latency 应该和 router latency 分开。
- cross-body egress 的时延不应只有一个全局常量；不同 body pair / link 可有不同 latency。

### 10.3 Router

`Router` wakeup 会：

- 遍历所有 `InputUnit` 并调用 wakeup。
- 遍历所有 `OutputUnit` 并调用 wakeup。
- 调用 `SwitchAllocator` wakeup。
- 调用 `CrossbarSwitch` wakeup。

Router 只要其模块有 ready flit / credit 需要在当前 cycle 处理，就会被调度 wakeup。

对 `UBody` 的启发：

- 如果后续做 event-driven body fabric，`UBody` 可按 input unit / output unit / allocator / crossbar 分事件推进，而不是单个 send 函数完成全部过程。

### 10.4 InputUnit

`InputUnit` 负责：

- 从上游 router 读当前 cycle ready 的 input flit。
- 对 `HEAD / HEAD_TAIL` flit 做 route computation，并更新 VC route。
- buffer flit `router_latency - 1` cycles。
- 到达可用 cycle 后，标记其可参加 switch allocation。

对 `UBody` 的启发：

- `ForwardToBody` 可以区分 head flit 的 route decision 和 body/tail flit 的既有 VC 路径。
- 如果暂不做 flit-level，可用 packet-level head/tail 简化模型。

### 10.5 OutputUnit

`OutputUnit` 负责：

- 从下游 router 读取 credit。
- 增加对应 output VC 的 credit。
- 如果 credit 带有 free signal，则标记 output VC free。

对 `UBody` 的启发：

- 目标 body 释放 buffer / queue 后，应有显式 credit 或 availability event 回传给源 body。

### 10.6 SwitchAllocator

`SwitchAllocator` 同时执行 VC arbitration 和 selection。

SA-I：

- 遍历每个 input port 的 input VCs。
- round-robin 选择一个 input VC。
- 对 `HEAD / HEAD_TAIL` flit，只选择其 output port 至少有一个 free output VC 的 input VC。
- 对 `BODY / TAIL` flit，只选择其 output VC 有 credit 的 input VC。
- 被选中的 input VC 对目标 output port 发 request。

SA-II：

- 遍历每个 output port。
- 从对该 output port 发 request 的 input VCs 中选择一个 winner。
- 对 `HEAD / HEAD_TAIL`，执行 output VC allocation。
- 对 `BODY / TAIL`，减少 output VC credit。
- 从 input VC 读出 flit，送到 `CrossbarSwitch`。
- 向 upstream router 发送 increment-credit signal。
- 对 `HEAD_TAIL / TAIL`，credit 带 free signal，表示释放 VC。

对 `UBody` 的启发：

- body fabric arbitration 可以采用两级 allocator：input selection + output conflict resolution。
- `ForwardToExternalPort` 如果多个 body 同时争一个 egress body / port，应该有仲裁。
- credit release 与 tail packet / transfer complete 事件绑定。

### 10.7 CrossbarSwitch

`CrossbarSwitch` 遍历所有 input ports，把 winning flit 从对应 output port 送到 output link。输出 link 的 consumer 会在下一 cycle 被调度。

对 `UBody` 的启发：

- 如果未来 `UbNetworkOnChip` 不再是 fixed delay，可以把 crossbar traversal 和 output link event 独立建模。

---

## 11. Synthetic traffic

Garnet 2.0 可以 standalone 运行并输入 synthetic traffic。gem5 文档把细节放在 `Garnet Synthetic Traffic` 页面。

对 OpenUSim 的启发：

- body fabric 可以有 standalone microbenchmark，不一定每次都跑完整 UB workload。
- 可构造 synthetic body-to-body traffic：uniform random、hotspot、nearest-neighbor、all-to-one、ring shift 等，用于验证 queue / credit / routing。

---

## 12. 对 UBody 的强支撑点

Garnet 2.0 对 `UBody` 的支撑主要是“如何公开建模内部互联”，不是“证明交换 ASIC 里有 UBody”。

### 12.1 Router 是可公开建模对象

Garnet 2.0 公开把 on-chip network router 拆成 input buffer、route compute、switch allocation、VC selection、crossbar traversal、link traversal。这说明 `UBody` 后续细化为 body-local router / network node 有公开先例。

### 12.2 Fixed delay 可逐步细化

Garnet 支持 per-router latency 和 per-link latency。当前 `UbNetworkOnChip` 的 fixed delay 可以被解释为一个低保真 backend，未来可拆成 router/link latency。

### 12.3 Credit-based flow control 是公开 NoC 方法

Garnet 使用 VC 和 credit 管理 buffer availability。`ForwardToBody` 后续可以加入 credit/backpressure，而不是只按时间延迟发送。

### 12.4 Routing 和 topology 分离

Garnet 把 topology、routing algorithm、link direction name 分开。OpenUSim 后续可以把 body topology 和 body routing 从 `IoDie` 逻辑中分离出来。

### 12.5 Flit / packet / message 层次清晰

Garnet 通过 NetworkInterface 把 protocol message 转成 flits，再进入 routers。OpenUSim 后续也可以把 transaction / packet / descriptor / flit 分层。

### 12.6 Multicast 可先在 NI 拆成 unicast

Garnet 文档明确说明网络模型内部没有 hardware multicast，multicast 在 NI 拆成多个 unicast。对 OpenUSim 来说，一对多 body forwarding 也可先采用这种保守方案。

---

## 13. UBody 映射表

| Garnet 2.0 概念 | OpenUSim / UBody 映射 |
| --- | --- |
| `GarnetNetwork` | `UbNetworkOnChip` / future body fabric top object |
| `NetworkInterface` | IoDie / UBody fabric ingress-egress adapter |
| `Router` | `UBody` body-local network node / router-like unit |
| `NetworkLink` | body-to-body internal link |
| `CreditLink` | body-to-body credit / backpressure path |
| virtual networks | UB traffic classes, e.g. control / LDST / URMA |
| virtual channels | per-class body fabric lanes / queues |
| flit | future packet fragment / descriptor unit |
| route compute | `LocalSink / ForwardToBody / ForwardToExternalPort` decision |
| switch allocation | body fabric arbitration |
| VC selection | output resource reservation |
| crossbar traversal | internal body fabric traversal |
| link traversal | body-to-body delay |
| per-router latency | body-local network latency |
| per-link latency | body pair / topology link latency |
| multicast-to-unicast at NI | descriptor replication before body fabric |

---

## 14. 不能从 Garnet 2.0 推出的结论

Garnet 2.0 不能支撑以下说法：

- `UBody` 等同于 Garnet router。
- Garnet 2.0 是交换机 ASIC 的真实实现。
- UB body fabric 必须使用 Garnet 的 exact router pipeline。
- UB 必须使用 flit-level simulation。
- UB 必须使用 Garnet 默认参数，例如 16-byte flit、4 VCs、data 5 flits。
- Garnet 2.0 证明 `UBody / BD` 是公开行业术语。
- Garnet 2.0 证明 Cisco Q200 或 PISA pipeline 的具体实现。

Garnet 2.0 真正支撑的是：

```text
cycle-accurate router, VC buffer, credit flow control, topology/routing separation,
switch allocation, crossbar traversal, and per-router/per-link latency are public
NoC modeling techniques that can guide future UBody body-fabric refinement.
```

---

## 15. 建议写入 OpenUSim 公开文档的中文表述

```text
UBody 当前通过 fixed-delay body-to-body hop 表达最小内部互联。公开 NoC 模型
Garnet 2.0 展示了更高保真的片上互联建模方法：router 可拆成 input buffer、
route compute、switch allocation、VC selection、crossbar traversal 和 link traversal；
flow control 可通过 virtual channels 和 credits 表达；topology、routing、router latency
和 link latency 可以独立配置。OpenUSim 后续可将 UBody 的内部互联逐步细化为类似
Garnet 的 router/link/credit/fabric 模型，但当前不声称实现完整 Garnet 微架构。
```

更保守的英文表述：

```text
UBody currently models body-to-body forwarding with a fixed-delay hop. Public NoC
models such as gem5 Garnet 2.0 provide a path for future refinement: explicit
routers, links, virtual channels, credit-based flow control, switch allocation,
crossbar traversal, and configurable router/link latencies.
```

---

## 16. 对 OpenUSim 后续建模的具体建议

短期保持：

- `UbNetworkOnChip` 继续作为 fixed-delay body hop。
- 文档中明确它不是完整 NoC router / fabric。
- `ForwardToBody` 继续作为显式 body-to-body path。

中期可增加：

- `body_fabric_link_latency`：body-to-body link delay。
- `body_router_latency`：body-local router / NetworkUnit delay。
- `body_fabric_vnet`：control / data / URMA / LDST traffic class。
- `body_fabric_vc_count`：每类 traffic 的 VC 数。
- `body_fabric_buffer_depth`：每个 VC 的 buffer depth。
- `body_fabric_credit`：目标 body buffer availability 回传。
- `body_fabric_allocator`：input/output arbitration。
- `body_fabric_routing_algorithm`：table / ring / custom routing。

中期验证建议：

- 增加 standalone body-fabric synthetic traffic。
- 构造热点 body、all-to-one、ring shift、nearest-neighbor 等模式。
- 分别验证 latency、throughput、queue occupancy、credit stall、ordering。

不建议：

- 不要一开始强行做 flit-level，如果当前实验只需要 packet-level fixed delay。
- 不要把 Garnet 默认参数当作 UB 默认参数。
- 不要把 body-local resource queue、body-fabric VC buffer、external port queue 混成一个队列。

---

## 17. 与 Cisco Q200、PSA、NetSoft 2021、HotNets 2020 的关系

Garnet 2.0 与前几份资料是互补关系：

- Cisco Q200 白皮书提供工业 multislice ASIC 证据：slice、crossbar、VOQ、SMS、OQ。
- P4 PSA 规范提供 multi-pipeline switch 规范证据：port-to-pipeline binding、pipeline-local state、output-port-driven egress pipeline。
- NetSoft 2021 论文说明 multi-pipeline 无 coherence 会让有状态 in-network applications 失效。
- HotNets 2020 论文说明 PISA pipeline / stateful applications 的结构性冲突，并提出 stateful side-plane 方向。
- Garnet 2.0 提供 NoC/router simulation 方法：VC、credit、switch allocation、crossbar、router/link latency。

合起来可以支撑：

```text
UBody 的公开依据有两层：
1. 业界 / 规范 / 论文层面，body-local slice/pipeline 是公开架构思想；
2. 仿真方法层面，body-to-body path 可以参考公开 NoC/router 模型逐步细化。
```

---

## 18. 一句话结论

gem5 Garnet 2.0 不是 `UBody` 的硬件先例，而是 `UBody` 后续 body-to-body fabric 细化的公开仿真方法依据。它说明 router microarchitecture、virtual channels、credit flow control、routing/topology 分离、crossbar traversal、router/link latency 等都是成熟公开的 NoC 建模组件；OpenUSim 可以先保留 fixed-delay `UbNetworkOnChip`，再按实验需要逐步引入这些机制。
