Open JunningWu opened 6 years ago
SDP_CMUX的功能是选择数据从CACC进来还是从MEM(通过DMA读入)进来。
经由CACC进来的数据,先经过SDP_CMUX_pipe_p1之后,再由选择信号进行选择。
然后,将512位的数据,进行拆包,同时根据最高两位的end信号控制握手协议的valid和ready信号是否有效。
在进行数据拆包的过程中,需要根据配置信息,将非规格化数/NAN置0,这一步以32bit为单元进行操作。
拆包后的数据,在经过SDP_CMUX_pipe_p2之后输出,完成MUX的选择。
NV_NVDLA_SDP_CMUX_pipe_p2
与pipe_p1类似
模块的时钟域与nvdla_core_clk一样; 输入信号为 cmux2dp_pd------512bits cmux2dp_pvld sdp_cmux2dp_ready 输出信号为 cmux2dp_prdy sdp_cmux2dp_valid sdp_cmux2dp_pd
通常情况下(存在宏定义SYNTHESIS的时候),经过pipe_p2以后的信号,包括valid和pd信号,直接赋值给输出信号;否则延迟一个周期。
类似于pipe_p1,pipe_p2也存在一个randomizer,工作过程类似。
SDP支持在单个数据点上进行线性或者非线性计算,线性计算包括偏置或者伸缩,由内部ALU部件完成,非线性计算包括RELU,PRELU,precision scaling,batch normalization,bias addition,甚至更为复杂的操作,例如sigmoid或者hyperbolic tangent,由LUT实现。
SDP支持三类伸缩因子和偏置的配置方式,1.CNN(整个网络的配置信息一样,通过配置寄存器配置),2.Channel(同一个通道内配置信息一样,通过存储器读入),3.Pixel(像素级配置,每个特征点都不一样,通过存储器读入)。
SDP RDMA的配置寄存器与功能部件相类似,包括4大类的数据,MUX进来的数据,以及BS/BN/EW的偏置数据。
每一组配置寄存器,分别包括宽/高/通道数,以及地址和line/surface步进。
数据
D_DATA_CUBE_WIDTH | 0xa00c | Input cube’s width D_DATA_CUBE_HEIGHT | 0xa010 | Input cube’s height D_DATA_CUBE_CHANNEL | 0xa014 | Input cube’s channel D_SRC_BASE_ADDR_LOW | 0xa018 | Lower 32bits of input data address D_SRC_BASE_ADDR_HIGH | 0xa01c | Higher 32bits of input data address when axi araddr is 64bits D_SRC_LINE_STRIDE | 0xa020 | Line stride of input cube D_SRC_SURFACE_STRIDE | 0xa024 | Surface stride of input cube
BS
D_BRDMA_CFG | 0xa028 | Configuration of BRDMA: enable/disable, data size, Ram type, etc. D_BS_BASE_ADDR_LOW | 0xa02c | Lower 32bits address of the bias data cube D_BS_BASE_ADDR_HIGH | 0xa030 | Higher 32bits address of the bias data cube when axi araddr is 64bits D_BS_LINE_STRIDE | 0xa034 | Line stride of bias data cube D_BS_SURFACE_STRIDE | 0xa038 | Surface stride of bias data cube D_BS_BATCH_STRIDE | 0xa03c | Stride of bias data cube in batch mode
BN
D_NRDMA_CFG | 0xa040 | Configuration of NRDMA: enable/disable, data size, Ram type, etc. D_BN_BASE_ADDR_LOW | 0xa044 | Lower 32bits address of the bias data cube D_BN_BASE_ADDR_HIGH | 0xa048 | Higher 32bits address of the bias data cube when axi araddr is 64bits D_BN_LINE_STRIDE | 0xa04c | Line stride of bias data cube D_BN_SURFACE_STRIDE | 0xa050 | Surface stride of bias data cube D_BN_BATCH_STRIDE | 0xa054 | Stride of bias data cube in batch mode
EW
D_ERDMA_CFG | 0xa058 | Configuration of ERDMA: enable/disable, data size, Ram type, etc. D_EW_BASE_ADDR_LOW | 0xa05c | Lower 32bits address of the bias data cube D_EW_BASE_ADDR_HIGH | 0xa060 | Higher 32bits address of the bias data cube when axi araddr is 64bits D_EW_LINE_STRIDE | 0xa064 | Line stride of bias data cube D_EW_SURFACE_STRIDE | 0xa068 | Surface stride of bias data cube D_EW_BATCH_STRIDE | 0xa06c | Stride of bias data cube in batch mode
其他信息 配置SPD的工作模式,以及NAN是否替换成0等。 D_FEATURE_MODE_CFG | 0xa070 | Operation configuration: flying mode, output destination, Direct or Winograd mode, flush NaN to zero, batch number. D_SRC_DMA_CFG | 0xa074 | RAM type of input data cube D_STATUS_NAN_INPUT_NUM | 0xa078 | Input NaN element number D_STATUS_INF_INPUT_NUM | 0xa07c | Input Infinity element number D_PERF_ENABLE | 0xa080 | Enable/Disable performance counting
SDP_D_DP_BS_CFG 0xb058 -------> 0x2c16
总结一下BS/BN相关的配置寄存器以及各个比特的含义,对于ALU_ALGO部分的含义,还不是很明白,希望在后面会有补充。 对于示例程序cc_alexnet_conv5_relu5_int16_dtest_cvsram,BS_CFG=0x12,BS_ALU_CFG=0x1501,从仿真结果可以看出,BS的处理,仅将输入数据进行了右移0x15位,即右移21位,例如0x686c1308------>>>>0x00000343,且进行ReLU处理。
更新EW的配置寄存器,示例程序cc_alexnet_conv5_relu5_int16_dtest_cvsram尽管配置了EW配置寄存器的值,但是其选择了将EW功能Bypass,因此BN的输出直接送给C模块,可参见 #10
SDP_C,完成数据的压缩处理,将32位的数据,压缩成16比特输出。
32赞 你研究的比较深入! come on
@CrazyBingo we can do it together
@JunningWu Happy new year, and happy to research NVDLA with you. I have meet noboady that research NVDLA, TKS to meet you. I am now work in Shenzhen, and research AI Architecture lately. Here is my prosonal email: crazyfpga@qq.com. and my wchat is : hanbinhdu Look forward to your reply.
@CrazyBingo haha
Ha what
sdp有点难的,我也没太看懂。谢谢资料。
”在模块的开头,有一条注释,模块应该是生成的,目前还没找到生成文件和说明文档。
Generated by ::pipe -m -bc -os cacc_pd (cacc_vld, cacc_rdy) <= cacc2sdp_pd[513:0] (cacc2sdp_valid, cacc2sdp_ready)“
这个在plugin的文件夹里有一个perl的文件,pipe是其中一个脚本。对应的,还有flop,retime,这些。
NV_NVDLA_SDP_CMUX_pipe_p1
模块的时钟域与nvdla_core_clk一样; 输入信号为 cacc2sdp_pd---------(514位宽的数据线,包括512位数据,以及pd_batch_end, pd_layer_end的标志位) cacc2sdp_valid cacc_rdy 输出信号为 cacc2sdp_ready cacc_vld cacc_pd
通常情况下(存在宏定义SYNTHESIS的时候),经过pipe_p1以后的信号,包括valid和pd信号,直接赋值给输出信号;否则延迟一个周期。 在pipe_p1的内部,有一个randomizer模块,如下图所示,会产生随机延迟周期,将信号进行延迟。此时,valid信号为0,pd信号则为X态。
在模块的开头,有一条注释,模块应该是生成的,目前还没找到生成文件和说明文档。
Generated by ::pipe -m -bc -os cacc_pd (cacc_vld, cacc_rdy) <= cacc2sdp_pd[513:0] (cacc2sdp_valid, cacc2sdp_ready)