矩阵转置加速器
概述
该目录实现了 BuckyBall 的矩阵转置加速器,用于矩阵转置操作。位于 arch/src/main/scala/prototype/transpose
下,作为矩阵转置加速器,支持流水线化的转置操作。
实现的核心组件:
- Transpose.scala: 流水线化转置器实现
代码结构
transpose/
└── Transpose.scala - 流水线转置器
模块职责
Transpose.scala (转置实现层)
- 实现 PipelinedTransposer 模块
- 管理矩阵数据的读取、转置和写回
- 提供 Ball 域命令接口
模块说明
Transpose.scala
主要功能: 实现流水线化的矩阵转置操作
状态机定义:
val idle :: sRead :: sWrite :: complete :: Nil = Enum(4)
val state = RegInit(idle)
存储结构:
// 矩阵存储寄存器 (veclane x veclane)
val regArray = Reg(Vec(b.veclane, Vec(b.veclane, UInt(b.inputType.getWidth.W))))
计数器管理:
val readCounter = RegInit(0.U(log2Ceil(b.veclane + 1).W))
val respCounter = RegInit(0.U(log2Ceil(b.veclane + 1).W))
val writeCounter = RegInit(0.U(log2Ceil(b.veclane + 1).W))
指令寄存器:
val robid_reg = RegInit(0.U(10.W)) // ROB ID
val waddr_reg = RegInit(0.U(10.W)) // 写地址
val wbank_reg = RegInit(0.U(log2Up(b.sp_banks).W)) // 写bank
val raddr_reg = RegInit(0.U(10.W)) // 读地址
val rbank_reg = RegInit(0.U(log2Up(b.sp_banks).W)) // 读bank
val iter_reg = RegInit(0.U(10.W)) // 迭代计数
接口定义:
val io = IO(new Bundle {
val cmdReq = Flipped(Decoupled(new BallRsIssue))
val cmdResp = Decoupled(new BallRsComplete)
val sramRead = Vec(b.sp_banks, Flipped(new SramReadIO(...)))
val sramWrite = Vec(b.sp_banks, Flipped(new SramWriteIO(...)))
})
处理流程:
- idle: 等待命令,解析转置参数
- sRead: 按行读取矩阵数据到寄存器阵列
- sWrite: 按列写回转置后的数据
- complete: 发送完成信号
转置算法:
- 使用 veclane×veclane 的寄存器阵列存储矩阵
- 按行读取,按列写回实现转置
- 支持任意大小矩阵的分块转置
使用方法
实现细节
状态机:
val idle :: sRead :: sWrite :: complete :: Nil = Enum(4)
idle
: 等待指令sRead
: 读取矩阵数据sWrite
: 写入转置结果complete
: 完成并响应
寄存器阵列:
val regArray = Reg(Vec(b.veclane, Vec(b.veclane, UInt(b.inputType.getWidth.W))))
使用 veclane×veclane 的寄存器阵列缓存矩阵数据。
转置操作:
- 读取阶段:按行读取数据存入
regArray(row)(col)
- 写入阶段:按列读取
regArray(i)(col)
组成新行写出
配置参数
矩阵大小: 由 b.veclane 参数决定 数据位宽: 由 b.inputType.getWidth 决定 Bank 配置: 支持多 bank SRAM 访问
注意事项
- 矩阵大小限制: 最大支持 veclane×veclane 的矩阵
- 内存带宽: 转置操作对内存带宽要求较高
- 寄存器开销: 需要 veclane² 个寄存器存储矩阵
- 地址计算: 转置后的地址计算需要正确处理
- 流水线控制: 读写计数器需要正确同步