NVDLA硬件架构详细解析1
NVDLA硬件架构详细解析
笔者最近在学习NVDLA,计划从RTL级打通NVDLA的datapath,目前关于这个的资料也少,于是决定把成果分享出来和大家一起学习交流
如何使用NVDLA以及如何移植它的driver,这篇文章里有详细的介绍:https://leiblog.wang/NVDLA-Xilinx-FPGA-Mapping/
本系列文章主要是笔者自己的习得并辅以官方文档,本文讲述的大多是官方文档中没有的东西,已经有的就不罗嗦了
Configuration space bus(CSB)
为了提高执行效率,NVdla中的大多数子模块都有两组寄存器,这样允许在本次工作结束之前就开始配置下一次工作所需的寄存器,节约掉CPU配置寄存器所消耗的时间。
其中有两个关键的寄存器producer和Consumer:
Producer代表当前向哪组寄存器写入,由软件设置。
Consumer表示当前nvdla使用的是哪组寄存器里的值,由硬件在0和1之间自动翻转(轮流使用两组寄存器中的一个)。
PDP(池化模块)
由于PDP相对于其他模块来说比较简单,所以先从这里入手.
PDP由PDP_rdma, PDP_core, PDP_wdma组成.
PDP_rdma:
PDP_rdma由CSB直接配置,内部有四个模块rdma_reg, rdma_ig, rdma_eg, rdma_cq
PDP_rdma_reg
rdma_reg负责解析CSB传来的packed data,对相应的register group完成配置,配置完成后由CPU控制rdma_reg模块向rdma_ig模块发出enable信号
PDP_rdma_ig
rdma_ig模块在enable信号有效后,根据rdma_reg模块传来的寄存器信息,按照逻辑产生一系列的read address和read length信号,将两者打包成Packed data(PD)传给mcif。若mcif ready信号无效,则rdma_ig不在产生新的PD,处于阻塞状态。同时, rdma_ig将当前的每一次的read length和进度信息送给rdma_cq
关于read address和read length产生的机理是PDP的一个很核心的逻辑,后面我会专门说
PDP_rdma_cq
rdma_cq模块将rdma_ig传入read length和进度信息存储在RAM中(由寄存器资源组成),rdma_eg的ready信号每有效一次就将RAM中存储的信息传出一次
Cq的作用相当于为Eg对数据的预处理传递些必要的信息
PDP_rdma_eg
rdma_eg模块接收mcif传来的data,一次传来8 bytes(即一个 atom cube,AXI数据总线宽度为64位),同时解析cq传来的read length和读取进度信息,将8位的data和其所对应的位置信息和进度信息组成一个packed data送给pool计算模块,每次只送一个data,一个8 bytes的atom cube需要分8次送
Eg的作用相当于preprocess
Data被预处理后所增加的信息对于计算模块正确的进行计算应该是必要的
传送data的顺序为C->W->H->Surf->Split
Data的进度信息包括:
dp_b_sync :该data是否位于一行的末尾
dp_line_end :恒等于1
dp_surf_end ;该data是否位于surface的最后一行
dp_split_end ;该data是否位于split的最后一行
dp_cube_end ;该data是否位于cube的最后一行
Data的位置信息包括:
dp_pos_c:该data位于哪个channel上
dp_pos_w:该data位于哪个width上
补充
补充一下,在nvdla中各个模块之间的交互均是通过下面的握手信号完成的:
//write:
output A2B_wr_req_valid;
input A2B_wr_req_ready;
output [62:0] A2B_wr_req_pd;
input A2B_wr_rsp_complete;
//read:
output A2B_req_pvld;
input A2B_req_prdy;
output [62:0] A2B_req_pd;
input B2A_resp_valid;
input [33:0] B2A_resp_pd;
output A2B_rd_resp_ready;
其中的req_pd(request_packeddata)内容为:
就先写这些吧,开个头,有时间再写