Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
164 changes: 164 additions & 0 deletions docs/architecture/Janus/Cube/CUBE_SPEC.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,75 @@ CUBE 是 Janus 的**矩阵乘法加速引擎**,专为高吞吐量 GEMM(Gener
| **FSM** | 从 Cmd Buffer 取指令,拆分为 16×16 uop | - |
| **ISQ** | uop 调度队列,乱序执行 | 32 entries |
| **L0A Cache** | A 矩阵数据缓存 | 64 KB, 4-way, 512B/entry |
| **L0B Cache** | B 矩阵数据缓存 | 64 KB, 4-way, 512B/entry |
| **MAC Array** | 16×16 脉动阵列 | 4096 MACs (FP16) |
| **BufferC** | K 方向中间累加器 | 1 KB (16×16×FP32) |
| **ACC Pool** | 物理累加器池 | 128 KB (128 slices) |
| **FixPipe** | 格式转换流水线 | 11 stages |

### 2.3 ISQ 微架构

```
┌──────────────────────────────────────────────────────┐
│ ISQ (32 entries) │
│ │
│ Entry[0..31]: [valid|uop_id|A_addr|B_addr|... │
│ C_slice|deps|src_ready] │
│ ↓ │
│ Ready Logic: 并行检查 L0 hit + deps │
│ ↓ │
│ Selection: 优先级仲裁 (K_idx==0 优先) │
│ ↓ │
│ 发射到 MAC │
└──────────────────────────────────────────────────────┘
```

### 2.4 L0 Cache 微架构

```
┌──────────────────────────────────────────────────────┐
│ L0A/L0B Cache (64KB, 4-way) │
│ │
│ Set[i] (4 ways): │
│ Way 0-3: [V|tag|data(512B)|priority|LRU] │
│ │
│ 查找: 并行4路, tag匹配 │
│ 替换: 优先级(块内>块外) + PLRU │
└──────────────────────────────────────────────────────┘
```

### 2.5 ACC Pool 微架构

```
┌──────────────────────────────────────────────────────┐
│ ACC Pool (128KB, 8 banks) │
│ │
│ Bank 0-7: 各16KB │
│ Slice映射: slice_id % 8 → bank_id │
│ │
│ 分配器: Free Bitmap (128 bits) │
│ [127]...[1][0] (1=空闲, 0=占用) │
└──────────────────────────────────────────────────────┘
```

### 2.6 FixPipe 流水线

```
┌──────────────────────────────────────────────────────┐
│ FixPipe (11 stages) │
│ │
│ S0-3: ACC读取 (256B/cy × 4) │
│ S4: 数据缓冲 │
│ S5-6: nz→nd 转换 (2cy) │
│ S7: 量化 (FP32→FP16/FP8/INT8) │
│ S8: rowmax (可选) │
│ S9: 输出缓冲 │
│ S10: TileStore请求 │
│ │
│ 吞吐: 256B/cy, 延迟: ~11cy/slice │
└──────────────────────────────────────────────────────┘
```

| **L0B Cache** | B 矩阵数据缓存 | 64 KB, 4-way, 512B/entry |
| **MAC Array** | 16×16 脉动阵列 | 4096 MACs (FP16) |
| **BufferC** | K 方向中间累加器 | 1 KB (16×16×FP32) |
Expand Down Expand Up @@ -198,6 +267,59 @@ tRowmax, tC = rowmax(zd, mode) // 带 rowmax

## 4. Fractal 拆分与 uop 生成

### 4.1 拆分规则

**固定拆分规则**:按 MK/KN 方向拆分为 16×16 小分形

**Fractal 拆分示例(64×64,K=128,FP16)**:
```
输入: tmatmul z0, tA, tB, shape=64×64

输出矩阵 C (64×64) 拆分为 4×4 个 tile:

N=0 N=1 N=2 N=3
┌────────┬────────┬────────┬────────┐
M=0│ [0,0] │ [0,1] │ [0,2] │ [0,3] │
│ 16×16 │ 16×16 │ 16×16 │ 16×16 │
├────────┼────────┼────────┼────────┤
M=1│ [1,0] │ [1,1] │ [1,2] │ [1,3] │
├────────┼────────┼────────┼────────┤
M=2│ [2,0] │ [2,1] │ [2,2] │ [2,3] │
├────────┼────────┼────────┼────────┤
M=3│ [3,0] │ [3,1] │ [3,2] │ [3,3] │
└────────┴────────┴────────┴────────┘

K=128 (FP16) → K_tiles = 128/(32B/2B) = 8

每个 tile [M,N] 生成 8 个 uop (K方向):
uop[M,N,0]: C[M,N] = A[M,0] × B[0,N]
uop[M,N,1]: C[M,N] += A[M,1] × B[1,N]
...
uop[M,N,7]: C[M,N] += A[M,7] × B[7,N]

总 uop 数 = 4×4×8 = 128 uop

依赖关系:
K方向: uop[M,N,k] → uop[M,N,k+1] (必须顺序)
MN方向: 不同[M,N]可以乱序并发
```

### 4.2 uop 结构

```verilog
struct uop_t {
uop_id: 8 bits;
M_idx: 8 bits; // M tile 索引
N_idx: 8 bits; // N tile 索引
K_idx: 8 bits; // K tile 索引
A_addr: 22 bits; // A数据地址
B_addr: 22 bits; // B数据地址
C_slice_id: 7 bits; // ACC slice
deps_uop_id: 8 bits; // K方向依赖
acc_chain: 2 bits; // 链标记
};
```

### 4.1 Fractal 拆分规则

CUBE 使用固定的 **16×16 小分形(small fractal)**:
Expand Down Expand Up @@ -654,6 +776,28 @@ TMU → CUBE:

### 12.1 单个 uop 延迟

**uop 执行时序图**:
```
Cycle: 0 5 10 15 20 25
|----|----|----|----|----|

无RMW (K中间):
L0读取 |█| (1cy)
MAC计算 |███████| (7cy)
BufferC累加 |█| (1cy)
总延迟: ~9 cycles

有RMW (K结束):
L0读取 |█| (1cy)
MAC计算 |███████| (7cy)
BufferC累加 |█| (1cy)
ACC RMW |█████████| (9cy)
读取 |████| (4cy)
加法 |█| (1cy)
写回 |████| (4cy)
总延迟: ~18 cycles
```

**无 RMW 情况(K 中间步)**:
```
Cycle 0: uop 发射,读取 L0A/L0B
Expand All @@ -674,6 +818,26 @@ Total: 18 cycles (含 9-cycle RMW)

### 12.2 tmatmul 完整流程时序

**tmatmul 流水线时序(64×64×128,128 uops)**:
```
Cycle: 0 10 20 30 40 50 60
|----|----|----|----|----|----|----|

FSM拆分 |████| (4cy)
uop入队 |██████| (6cy)
预取请求 |████████| (8cy)

uop执行 (乱序并发):
uop[0,0,0] |█████████| (9cy)
uop[0,0,1] |█████████|
uop[0,1,0] |█████████|
uop[1,0,0] |█████████|
...
uop[3,3,7] |██████████████| (18cy,RMW)

总延迟: ~60-80 cycles (取决于L0命中率和乱序效率)
```

**64×64×128 矩阵 (4×4×8 uop)**:

```
Expand Down
16 changes: 15 additions & 1 deletion docs/architecture/Janus/Cube/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,15 @@ CUBE 是 Janus 的矩阵乘法加速引擎,专为高吞吐量 GEMM 和卷积
- 数据流图(tmatmul/acccvt)
- 带宽和延迟总结
- 性能特征
- **[diagrams/microarchitecture_details.md](diagrams/microarchitecture_details.md)** - CUBE 微架构详细图表 ✅ NEW
- ISQ 微架构和 Entry 结构详图
- L0 Cache 组织和 PLRU 替换策略图
- ACC Pool Bank 组织和 Slice 分配图
- FixPipe 11 级流水线详细结构
- MAC 阵列 16×16 脉动结构图
- FSM 状态机和 Fractal 拆分示例
- ACC 链和细粒度依赖管理图
- 执行时序图和流水线并行示例
- `diagrams/cube_pipeline_v1_archived.md` - 旧版归档(v1 superscalar)

### 实现细节
Expand Down Expand Up @@ -185,13 +194,18 @@ acccvt.rowmax zd, tile_dst, tile_rowmax, mode, acc_chain

| 文档 | 状态 | 行数 | 最后更新 |
|------|------|------|---------|
| CUBE_SPEC.md | ✅ 完成 | 693 | 2026-06-09 |
| architecture.md | ✅ 完成 | 1152 | 2026-06-02 |
| diagrams/cube_architecture.md | ✅ 完成 | 265 | 2026-06-02 |
| diagrams/microarchitecture_details.md | ✅ 完成 | 348 | 2026-06-10 |
| datapath.md | ✅ 完成 | 769 | 2026-06-02 |
| isq.md | ✅ 完成 | 633 | 2026-06-02 |
| l0cache.md | ✅ 完成 | 685 | 2026-06-02 |
| accumulator.md | ✅ 完成 | 633 | 2026-06-02 |
| acccvt.md | ✅ 完成 | 658 | 2026-06-02 |
| performance_model.md | ✅ 完成 | - | 2026-06-03 |
| tile_sizing.md | ✅ 完成 | - | 2026-06-03 |
| WORK_IN_PROGRESS.md | ✅ 进行中 | 255 | 2026-06-09 |
| memory_interface.md | ⏳ 待完成 | - | - |

---
Expand All @@ -210,4 +224,4 @@ acccvt.rowmax zd, tile_dst, tile_rowmax, mode, acc_chain
---

**文档版本**:Janus CUBE v2.0
**最后更新**:2026-06-02
**最后更新**:2026-06-09
75 changes: 47 additions & 28 deletions docs/architecture/Janus/Cube/WORK_IN_PROGRESS.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,15 @@
- § 10.1 块命令接收接口:详细定义 Tile Cmd Buffer 和反压机制
- § 10.2.1 ACC 释放信号:新增细粒度 ACC 释放接口

- ✅ `README.md`(2026-06-09 更新):
- 文档状态表:添加 CUBE_SPEC.md 和 WORK_IN_PROGRESS.md
- 更新最后修改日期

- ✅ `diagrams/cube_architecture.md`(2026-06-09 更新):
- § 1 顶层模块框图:增加 Tile Cmd Buffer (depth=4) 和反压机制
- § 2 数据流图:更新命令接收路径(BCC → Tile Cmd Buffer → FSM)
- 更新最后修改日期

---

## 🔴 待完成工作(RTL前需要明确)
Expand Down Expand Up @@ -215,34 +224,44 @@ Cycle 110: uop1[1,1,0] 开始(依赖uop0[1,1,15]已满足)

## 🔧 需要修改的其他文档

### 待修改(未完成)

1. **datapath.md**:
- § 4 BufferC:删除K_chunk
- § 2 输入路径:明确Prefetch Buffer 32 entries
- § 6 输出路径:明确TileStore Queue 8 entries

2. **isq.md**:
- 增加多链并发机制说明
- 增加细粒度依赖管理

3. **l0cache.md**:
- 明确512B entry需要2个TMU flit
- 增加地址对齐和flit匹配逻辑

4. **accumulator.md**:
- 增加ACC映射表详细结构
- 增加per-输出位置的last_uop_id记录

5. **acccvt.md**:
- 明确acccvtuop与matmul uop的细粒度依赖

6. **diagrams/cube_architecture.md**:
- 修正TMU接口为256B
- 更新带宽表

7. **README.md**:
- 更新参数表
### 已完成

1. ✅ **datapath.md**(2026-06-09 完成):
- ✅ § 4 BufferC:删除 K_chunk
- ✅ § 2 输入路径:明确 Prefetch Buffer 32 entries
- ✅ § 6 输出路径:明确 TileStore Queue 8 entries
- ✅ 删除重复的参数表

2. ✅ **isq.md**(2026-06-09 完成):
- ✅ 增加多链并发机制说明(§13)
- ✅ 详细说明全局共享、静态分区、动态分区方案
- ✅ 补充跨链发射仲裁策略

3. ✅ **l0cache.md**(2026-06-09 完成):
- ✅ 明确 512B entry 需要 2 个 TMU flit(§6.1)
- ✅ 增加地址对齐和 flit 匹配逻辑
- ✅ 更新 Prefetch Buffer 深度为 32 entries

4. ✅ **accumulator.md**(2026-06-09 完成):
- ✅ 增加 ACC 映射表详细结构(§3.2)
- ✅ 增加 per-输出位置的 last_uop_id 记录
- ✅ 补充细粒度依赖和流水线并行说明

5. ✅ **acccvt.md**(2026-06-09 完成):
- ✅ 明确 acccvtuop 与 matmul uop 的细粒度依赖(§3.2)
- ✅ 删除旧的 K_chunk 提前 Wakeup 概念
- ✅ 补充 per-slice 依赖和 Wakeup 示例

6. ✅ **diagrams/cube_architecture.md**(2026-06-09 完成):
- ✅ 增加 Tile Cmd Buffer 到顶层框图
- ✅ 更新数据流图中的命令接收路径
- ⏳ 修正 TMU 接口为 256B(待完成)
- ⏳ 更新带宽表(待完成)

7. ✅ **README.md**(2026-06-09 完成):
- ✅ 更新文档状态表
- ✅ 添加 CUBE_SPEC.md 和 WORK_IN_PROGRESS.md 条目
- ⏳ 更新参数表(待完成)

---

Expand Down
Loading