update system design report
This commit is contained in:
82
doc/reports/system/modules/04_matmul_accelerator.md
Normal file
82
doc/reports/system/modules/04_matmul_accelerator.md
Normal file
@@ -0,0 +1,82 @@
|
||||
# 4x4 矩阵乘法加速器技术说明
|
||||
|
||||
## 1. 计算规格
|
||||
|
||||
`matmul_axi_slave` 计算两个 4x4 无符号整数矩阵的乘积。输入元素宽度为 32 bit,输出
|
||||
元素满足
|
||||
|
||||
`C[i][j] = sum(A[i][k] * B[k][j]), k=0..3`。
|
||||
|
||||
单个乘积为 64 bit,四项相加的最坏情况需要 66 bit,因此结果存储宽度固定为 66 bit。
|
||||
每个输出元素通过三个 32 位字传输:低 32 位、高 32 位以及最高 2 位。该布局使 AXI 和
|
||||
DMA 数据宽度保持 32 bit,同时不截断数学结果。
|
||||
|
||||
## 2. 接口组成
|
||||
|
||||
模块同时提供完整 AXI4 从接口、本地 DMA endpoint 和矩阵序列器直连控制接口。AXI
|
||||
接口支持 INCR burst,可由 CPU 或普通 DMA 访问控制寄存器及双 Bank 数据窗口。本地
|
||||
endpoint 直接接收 A/B 字或输出 C 字,不经过 Crossbar 的矩阵从端。序列器通过
|
||||
`mat_start_valid`、`mat_start_bank`、`mat_done_clear` 和 `mat_crc_clear` 完成批处理控制。
|
||||
|
||||
矩阵 AXI 从端、endpoint、乘法流水线和 CRC 均使用 `sys_clk/sys_resetn`。DMA 和序列器也
|
||||
位于 SYS 域,三者之间没有 CDC。CPU 发起的矩阵访问在 Crossbar 之前已经跨入 SYS 域。
|
||||
`matmul_intr` 产生于 SYS 域,接入 CPU 前的时钟边界见独立时钟域说明。
|
||||
|
||||
两个 endpoint ready 在当前实现中恒为 1,表示矩阵本地缓冲不施加反压。上游仍必须只在
|
||||
目标 Bank 空闲时写入,Bank 所有权由批处理序列器保证,而不是由加速器内部检查。
|
||||
|
||||
## 3. 寄存器与双 Bank 布局
|
||||
|
||||
| 偏移 | 内容 | 说明 |
|
||||
|---|---|---|
|
||||
| `0x000` | CTRL | bit 0 请求 Bank 0,bit 1 请求 Bank 1 |
|
||||
| `0x004` | STATUS | busy、done、error;done/error 支持 W1C |
|
||||
| `0x010` | CRC32 | 返回 `crc_reg XOR 0xffff_ffff`;写入用于清零 CRC |
|
||||
| `0x100` | Bank 0 A | 16 个 32 位元素 |
|
||||
| `0x140` | Bank 0 B | 16 个 32 位元素 |
|
||||
| `0x180` | Bank 0 C | 16 个 66 位元素,共 48 个 32 位字 |
|
||||
| `0x300` | Bank 1 A | 16 个 32 位元素 |
|
||||
| `0x340` | Bank 1 B | 16 个 32 位元素 |
|
||||
| `0x380` | Bank 1 C | 16 个 66 位元素,共 48 个 32 位字 |
|
||||
|
||||
A 和 B 均按行优先方式存储。endpoint 写地址 0--15 对应 A,16--31 对应 B;endpoint
|
||||
读地址 0--47 对应 C 的三字布局。双 Bank 允许一组数据计算时准备另一组,但计算核心
|
||||
本身一次只处理一个 Bank。
|
||||
|
||||
## 4. 乘法数据通路
|
||||
|
||||
核心包含四个 `pipelined_mult_32x32` 实例,并使用 `use_dsp="no"` 属性约束综合器将乘法
|
||||
映射到 LUT 逻辑。每个乘法器包含输入寄存、乘积寄存和输出寄存三个流水级,吞吐率为
|
||||
每周期一个乘积。
|
||||
|
||||
计算核心每周期选择一个输出元素 `(i,j)`,同时向四个乘法器发出
|
||||
`A[i][0..3]` 与 `B[0..3][j]`。流水线对齐后,四个 64 位乘积采用成对加法生成一个
|
||||
66 位结果。16 个输出元素连续发射,索引和 Bank 标识经过四级有效流水线与乘积对齐。
|
||||
因此稳态吞吐为每周期一个 C 元素,而不是逐项乘加的四周期结构。
|
||||
|
||||
当 Bank 0 完成且 Bank 1 已有待处理请求时,状态机可直接调用 `start_calc_bank` 切换
|
||||
Bank,不必先返回空闲态。最后一个有效结果写回时产生 `calc_done_pulse`,置位 done 并
|
||||
驱动电平型中断。
|
||||
|
||||
## 5. CRC32 数据通路
|
||||
|
||||
CRC 使用 IEEE 802.3 反射多项式 `0xedb8_8320`,初值为 `0xffff_ffff`,软件读取时执行
|
||||
末尾异或。每个 66 位 C 元素按低 32 位、高 32 位、最高 2 位补零三个字依次进入
|
||||
`crc32_word_next`。CRC 在计算结果有效时更新,与 CPU 或 DMA 是否读取 C 无关。
|
||||
|
||||
这一选择使快速评测可以关闭结果写回,只保留硬件计算与 CRC。CRC 顺序严格跟随输出
|
||||
元素发射顺序;整批任务开始时由序列器清零,Bank 切换和单组完成不会清零。
|
||||
|
||||
## 6. AXI 协议处理
|
||||
|
||||
写通道分别处理 AW、W 和 B 阶段,锁存 ID、burst 类型和起始地址;INCR burst 每次有效
|
||||
W 握手后地址增加 4。读通道锁存 AR 参数并连续产生 R beat,最后一拍置位 RLAST。
|
||||
无效写地址置位 error,响应码当前始终为 OKAY。输出 C 的组合读选择在当前地址上解析
|
||||
元素号和三字片段。
|
||||
|
||||
## 7. 验证要求
|
||||
|
||||
功能验证需要逐元素与 128 bit 或更宽的软件参考模型比较,覆盖全零、全 `0xffff_ffff`、
|
||||
单位矩阵和随机矩阵。协议验证需覆盖 AW/W 分离、R/B 反压、单 beat 与 burst、两个 Bank
|
||||
连续请求和非法地址。CRC 应独立比较完整 192 字节输出序列。当前官方板测只读取最终
|
||||
CRC,证明了长批处理的端到端一致性,但不能替代逐元素和 AXI 边界测试。
|
||||
Reference in New Issue
Block a user