5.2 KiB
集成电路创新创业大赛 龙芯中科杯 阶段任务三 矩阵乘法器 IP 设计说明
1. 参赛任务与设计自由度
本题希望参赛者在保证测试流程能够正确运行的前提下,获得尽可能大的设计自由度。参赛者可以自行决定矩阵乘法器的内部微结构、是否实现 DMA、CPU 与加速器之间的数据搬运方式、批量计算调度方式以及 C 程序中的驱动策略。
参赛者至少需要设计两部分内容:
- 乘法加速器:在
rtl/中实现并接入 SoC 的矩阵乘法硬件 IP。 - C 程序:运行在 SoC CPU 上,负责按数据布局读取输入、配置并启动加速器、等待计算完成,并将结果写回 ExtRAM 中的指定结果区域。
无论内部实现如何,最终都必须满足本文定义的数据布局、结果格式和测试流程要求。测试只关心程序能否在解除复位后正确运行,并在串口输出完成标志后,从 ExtRAM 中读取到正确结果。
2. 设计目标与接口
参赛者需要设计一个矩阵乘法器 IP,用于完成:
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。
每组源数据占:
A: 16 word = 64 Byte
B: 16 word = 64 Byte
A + B: 32 word = 128 Byte
每组结果数据占:
C: 16 * 3 word = 48 word = 192 Byte
因此每组完整数据总占用:
(1 + 1 + 3) * 16 * 32 bit = 80 word = 320 Byte
批量布局如下:
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 组矩阵的地址计算规则为:
A_i = SRC_BASE + i * 128
B_i = SRC_BASE + i * 128 + 64
C_i = DST_BASE + i * 192
默认可令:
DST_BASE = SRC_BASE + n * 128
即结果区紧跟在 n 组源数据之后。IP 不应假设源区和结果区必须相邻,DMA 模式下应以 SRC_BASE 和 DST_BASE 寄存器为准。
矩阵 A、B 均按 row-major 存储,每个元素占 1 个 32 bit word:
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 结果:
C[i][j] word0 = result[31:0]
C[i][j] word1 = result[63:32]
C[i][j] word2 = {30'b0, result[65:64]}
4. 测试流程
测试流程如下:
- 保持 SoC 处于复位状态。
- 测试平台向存储器写入待运行程序和矩阵输入数据。
- 解除 SoC 复位,同时开始计时。
- SoC CPU 运行参赛者编写的 C 程序。程序应完成输入数据读取、加速器配置、矩阵乘法计算调度、结果写回以及完成通知。
- 测试平台监听串口输出。当串口输出约定的特定字符串时,停止计时。
- 停止计时后,测试平台读取 ExtRAM 中的结果数据,并按本文定义的结果布局进行校验。
因此,C 程序必须在所有矩阵结果已经写回 ExtRAM 后,再通过串口输出完成标志。若提前输出完成标志,测试平台会立即停止计时并读取结果,可能导致校验失败。
5. 发布包环境修改
发布包工程保持统一顶层引脚约束,使用提供的 fpga/constraints/soc.xdc。参赛者不需要、也不应修改板级引脚约束。
工程需要在 SoC 顶层中为矩阵乘法器预留接入点:
- 将矩阵乘法器 IP 的 AXI slave 接口连接到
AxiCrossbar_2x8的axiOut_7。 - 为矩阵乘法器分配地址空间
0x1f50_0000,对应 crossbar slave7。 - 若支持 DMA,可将矩阵乘法器的 AXI master 接口连接到当前预留的 master1 通路。
- 保留 BaseRAM/ExtRAM 的统一连接方式。BaseRAM 可用于存放程序指令,ExtRAM 用于存放源矩阵和结果矩阵。
- 软件 BSP 中增加矩阵乘法器寄存器基地址和驱动接口,例如:
#define MATMUL_BASE 0x1f500000
硬件部分建议限制为 rtl/ 目录内文件替换或新增;软件部分应提供用于运行矩阵任务的 C 程序及必要的 BSP/驱动适配。工程、引脚约束、测试框架和资源检查流程保持统一,以保证结果可复现。