This repository has been archived on 2026-08-21. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
ciciec2026/doc/matmul_ip_spec.md

138 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 集成电路创新创业大赛 龙芯中科杯 阶段任务三 矩阵乘法器 IP 设计说明
## 1. 参赛任务与设计自由度
本题希望参赛者在保证测试流程能够正确运行的前提下,获得尽可能大的设计自由度。参赛者可以自行决定矩阵乘法器的内部微结构、是否实现 DMA、CPU 与加速器之间的数据搬运方式、批量计算调度方式以及 C 程序中的驱动策略。
参赛者至少需要设计两部分内容:
1. **乘法加速器**:在 `rtl/` 中实现并接入 SoC 的矩阵乘法硬件 IP。
2. **C 程序**:运行在 SoC CPU 上,负责按数据布局读取输入、配置并启动加速器、等待计算完成,并将结果写回 ExtRAM 中的指定结果区域。
无论内部实现如何,最终都必须满足本文定义的数据布局、结果格式和测试流程要求。测试只关心程序能否在解除复位后正确运行,并在串口输出完成标志后,从 ExtRAM 中读取到正确结果。
## 2. 设计目标与接口
参赛者需要设计一个矩阵乘法器 IP,用于完成:
```text
C = A x B
```
矩阵最大规模为 `4x4 * 4x4`。对于较小规模矩阵,例如 `2x3 * 3x2`,仍使用 4x4 数据槽位存储,未使用位置填 0,硬件可按统一的 4x4 规则计算,不影响有效结果。
每个输入元素为 32 bit。若采用无符号计算,每个输出元素为 4 项 32x32 乘积累加结果,结果宽度为 66 bit。实现中不得使用 FPGA DSP 资源,乘法运算应由 LUT、寄存器、加法器、移位器等基础逻辑构成。
矩阵乘法器 IP 固定作为 AXI slave 外设接入 SoC 的 `axiOut_7` 位置,由 CPU 通过 memory-mapped register 方式进行配置、启动和查询。寄存器接口可以按参赛者实现需要进行扩展或调整,但软件程序必须能够配合该接口完成测试任务。
## 3. RAM 数据布局
测试使用 ExtRAM 存放源矩阵和结果矩阵。数据采用“源数据连续区 + 结果连续区”的批量布局:前部连续存放 n 组源矩阵 A/B,排列方式为 `A0, B0, A1, B1, ... A(n-1), B(n-1)`;后部连续存放 n 组结果矩阵 C。
每组源数据占:
```text
A: 16 word = 64 Byte
B: 16 word = 64 Byte
A + B: 32 word = 128 Byte
```
每组结果数据占:
```text
C: 16 * 3 word = 48 word = 192 Byte
```
因此每组完整数据总占用:
```text
(1 + 1 + 3) * 16 * 32 bit = 80 word = 320 Byte
```
批量布局如下:
```text
SRC_BASE + 0 * 128:
group0_A[16]
group0_B[16]
SRC_BASE + 1 * 128:
group1_A[16]
group1_B[16]
...
SRC_BASE + (n - 1) * 128:
group(n-1)_A[16]
group(n-1)_B[16]
DST_BASE:
group0_C[48]
group1_C[48]
...
group(n-1)_C[48]
```
第 i 组矩阵的地址计算规则为:
```text
A_i = SRC_BASE + i * 128
B_i = SRC_BASE + i * 128 + 64
C_i = DST_BASE + i * 192
```
默认可令:
```text
DST_BASE = SRC_BASE + n * 128
```
即结果区紧跟在 n 组源数据之后。IP 不应假设源区和结果区必须相邻,DMA 模式下应以 `SRC_BASE` 和 `DST_BASE` 寄存器为准。
矩阵 A、B 均按 row-major 存储,每个元素占 1 个 32 bit word:
```text
A[0][0], A[0][1], A[0][2], A[0][3],
A[1][0], ...
A[3][3]
```
矩阵 C 同样按 row-major 存储,每个元素占 3 个 32 bit word,用于保存 66 bit 结果:
```text
C[i][j] word0 = result[31:0]
C[i][j] word1 = result[63:32]
C[i][j] word2 = {30'b0, result[65:64]}
```
## 4. 测试流程
测试流程如下:
1. 保持 SoC 处于复位状态。
2. 测试平台向存储器写入待运行程序和矩阵输入数据。
3. 解除 SoC 复位,同时开始计时。
4. SoC CPU 运行参赛者编写的 C 程序。程序应完成输入数据读取、加速器配置、矩阵乘法计算调度、结果写回以及完成通知。
5. 测试平台监听串口输出。当串口输出约定的特定字符串时,停止计时。
6. 停止计时后,测试平台读取 ExtRAM 中的结果数据,并按本文定义的结果布局进行校验。
因此,C 程序必须在所有矩阵结果已经写回 ExtRAM 后,再通过串口输出完成标志。若提前输出完成标志,测试平台会立即停止计时并读取结果,可能导致校验失败。
## 5. 发布包环境修改
发布包工程保持统一顶层引脚约束,使用提供的 `fpga/constraints/soc.xdc`。参赛者不需要、也不应修改板级引脚约束。
工程需要在 SoC 顶层中为矩阵乘法器预留接入点:
1. 将矩阵乘法器 IP 的 AXI slave 接口连接到 `AxiCrossbar_2x8` 的 `axiOut_7`。
2. 为矩阵乘法器分配地址空间 `0x1f50_0000`,对应 crossbar slave7。
3. 若支持 DMA,可将矩阵乘法器的 AXI master 接口连接到当前预留的 master1 通路。
4. 保留 BaseRAM/ExtRAM 的统一连接方式。BaseRAM 可用于存放程序指令,ExtRAM 用于存放源矩阵和结果矩阵。
5. 软件 BSP 中增加矩阵乘法器寄存器基地址和驱动接口,例如:
```c
#define MATMUL_BASE 0x1f500000
```
硬件部分建议限制为 `rtl/` 目录内文件替换或新增;软件部分应提供用于运行矩阵任务的 C 程序及必要的 BSP/驱动适配。工程、引脚约束、测试框架和资源检查流程保持统一,以保证结果可复现。