当前位置:   article > 正文

NVDLA专题4:具体模块介绍——Convolution DMA

NVDLA专题4:具体模块介绍——Convolution DMA

概述

Convolution DMA Module的定义在NV_NVDLA_cmda.v中,其module的定义如下:

  1. module NV_NVDLA_cdma (
  2. cdma_dat2cvif_rd_req_ready //|< i
  3. ,cdma_dat2mcif_rd_req_ready //|< i
  4. ,cdma_wt2cvif_rd_req_ready //|< i
  5. ,cdma_wt2mcif_rd_req_ready //|< i
  6. ,csb2cdma_req_pd //|< i
  7. ,csb2cdma_req_pvld //|< i
  8. ,cvif2cdma_dat_rd_rsp_pd //|< i
  9. ,cvif2cdma_dat_rd_rsp_valid //|< i
  10. ,cvif2cdma_wt_rd_rsp_pd //|< i
  11. ,cvif2cdma_wt_rd_rsp_valid //|< i
  12. ,dla_clk_ovr_on_sync //|< i
  13. ,global_clk_ovr_on_sync //|< i
  14. ,mcif2cdma_dat_rd_rsp_pd //|< i
  15. ,mcif2cdma_dat_rd_rsp_valid //|< i
  16. ,mcif2cdma_wt_rd_rsp_pd //|< i
  17. ,mcif2cdma_wt_rd_rsp_valid //|< i
  18. ,nvdla_core_clk //|< i
  19. ,nvdla_core_rstn //|< i
  20. ,pwrbus_ram_pd //|< i
  21. ,sc2cdma_dat_entries //|< i
  22. ,sc2cdma_dat_pending_req //|< i
  23. ,sc2cdma_dat_slices //|< i
  24. ,sc2cdma_dat_updt //|< i
  25. ,sc2cdma_wmb_entries //|< i
  26. ,sc2cdma_wt_entries //|< i
  27. ,sc2cdma_wt_kernels //|< i
  28. ,sc2cdma_wt_pending_req //|< i
  29. ,sc2cdma_wt_updt //|< i
  30. ,tmc2slcg_disable_clock_gating //|< i
  31. ,cdma2buf_dat_wr_addr //|> o
  32. ,cdma2buf_dat_wr_data //|> o
  33. ,cdma2buf_dat_wr_en //|> o
  34. ,cdma2buf_dat_wr_hsel //|> o
  35. ,cdma2buf_wt_wr_addr //|> o
  36. ,cdma2buf_wt_wr_data //|> o
  37. ,cdma2buf_wt_wr_en //|> o
  38. ,cdma2buf_wt_wr_hsel //|> o
  39. ,cdma2csb_resp_pd //|> o
  40. ,cdma2csb_resp_valid //|> o
  41. ,cdma2sc_dat_entries //|> o
  42. ,cdma2sc_dat_pending_ack //|> o
  43. ,cdma2sc_dat_slices //|> o
  44. ,cdma2sc_dat_updt //|> o
  45. ,cdma2sc_wmb_entries //|> o
  46. ,cdma2sc_wt_entries //|> o
  47. ,cdma2sc_wt_kernels //|> o
  48. ,cdma2sc_wt_pending_ack //|> o
  49. ,cdma2sc_wt_updt //|> o
  50. ,cdma_dat2cvif_rd_req_pd //|> o
  51. ,cdma_dat2cvif_rd_req_valid //|> o
  52. ,cdma_dat2glb_done_intr_pd //|> o
  53. ,cdma_dat2mcif_rd_req_pd //|> o
  54. ,cdma_dat2mcif_rd_req_valid //|> o
  55. ,cdma_wt2cvif_rd_req_pd //|> o
  56. ,cdma_wt2cvif_rd_req_valid //|> o
  57. ,cdma_wt2glb_done_intr_pd //|> o
  58. ,cdma_wt2mcif_rd_req_pd //|> o
  59. ,cdma_wt2mcif_rd_req_valid //|> o
  60. ,csb2cdma_req_prdy //|> o
  61. ,cvif2cdma_dat_rd_rsp_ready //|> o
  62. ,cvif2cdma_wt_rd_rsp_ready //|> o
  63. ,mcif2cdma_dat_rd_rsp_ready //|> o
  64. ,mcif2cdma_wt_rd_rsp_ready //|> o
  65. );
  66. //
  67. // NV_NVDLA_cdma_ports.v
  68. //
  69. input nvdla_core_clk; /* cdma2buf_dat_wr, cdma2buf_wt_wr, cdma2csb_resp, cdma2sc_dat_pending, cdma2sc_wt_pending, cdma_dat2cvif_rd_req, cdma_dat2glb_done_intr, cdma_dat2mcif_rd_req, cdma_wt2cvif_rd_req, cdma_wt2glb_done_intr, cdma_wt2mcif_rd_req, csb2cdma_req, cvif2cdma_dat_rd_rsp, cvif2cdma_wt_rd_rsp, dat_up_cdma2sc, dat_up_sc2cdma, mcif2cdma_dat_rd_rsp, mcif2cdma_wt_rd_rsp, sc2cdma_dat_pending, sc2cdma_wt_pending, wt_up_cdma2sc, wt_up_sc2cdma */
  70. input nvdla_core_rstn; /* cdma2buf_dat_wr, cdma2buf_wt_wr, cdma2csb_resp, cdma2sc_dat_pending, cdma2sc_wt_pending, cdma_dat2cvif_rd_req, cdma_dat2glb_done_intr, cdma_dat2mcif_rd_req, cdma_wt2cvif_rd_req, cdma_wt2glb_done_intr, cdma_wt2mcif_rd_req, csb2cdma_req, cvif2cdma_dat_rd_rsp, cvif2cdma_wt_rd_rsp, dat_up_cdma2sc, dat_up_sc2cdma, mcif2cdma_dat_rd_rsp, mcif2cdma_wt_rd_rsp, sc2cdma_dat_pending, sc2cdma_wt_pending, wt_up_cdma2sc, wt_up_sc2cdma */
  71. output cdma2buf_dat_wr_en; /* data valid */
  72. output [11:0] cdma2buf_dat_wr_addr;
  73. output [1:0] cdma2buf_dat_wr_hsel;
  74. output [1023:0] cdma2buf_dat_wr_data;
  75. output cdma2buf_wt_wr_en; /* data valid */
  76. output [11:0] cdma2buf_wt_wr_addr;
  77. output cdma2buf_wt_wr_hsel;
  78. output [511:0] cdma2buf_wt_wr_data;
  79. output cdma2csb_resp_valid; /* data valid */
  80. output [33:0] cdma2csb_resp_pd; /* pkt_id_width=1 pkt_widths=33,33 */
  81. output cdma2sc_dat_pending_ack;
  82. output cdma2sc_wt_pending_ack;
  83. output cdma_dat2cvif_rd_req_valid; /* data valid */
  84. input cdma_dat2cvif_rd_req_ready; /* data return handshake */
  85. output [78:0] cdma_dat2cvif_rd_req_pd;
  86. output [1:0] cdma_dat2glb_done_intr_pd;
  87. output cdma_dat2mcif_rd_req_valid; /* data valid */
  88. input cdma_dat2mcif_rd_req_ready; /* data return handshake */
  89. output [78:0] cdma_dat2mcif_rd_req_pd;
  90. output cdma_wt2cvif_rd_req_valid; /* data valid */
  91. input cdma_wt2cvif_rd_req_ready; /* data return handshake */
  92. output [78:0] cdma_wt2cvif_rd_req_pd;
  93. output [1:0] cdma_wt2glb_done_intr_pd;
  94. output cdma_wt2mcif_rd_req_valid; /* data valid */
  95. input cdma_wt2mcif_rd_req_ready; /* data return handshake */
  96. output [78:0] cdma_wt2mcif_rd_req_pd;
  97. input csb2cdma_req_pvld; /* data valid */
  98. output csb2cdma_req_prdy; /* data return handshake */
  99. input [62:0] csb2cdma_req_pd;
  100. input cvif2cdma_dat_rd_rsp_valid; /* data valid */
  101. output cvif2cdma_dat_rd_rsp_ready; /* data return handshake */
  102. input [513:0] cvif2cdma_dat_rd_rsp_pd;
  103. input cvif2cdma_wt_rd_rsp_valid; /* data valid */
  104. output cvif2cdma_wt_rd_rsp_ready; /* data return handshake */
  105. input [513:0] cvif2cdma_wt_rd_rsp_pd;
  106. output cdma2sc_dat_updt; /* data valid */
  107. output [11:0] cdma2sc_dat_entries;
  108. output [11:0] cdma2sc_dat_slices;
  109. input sc2cdma_dat_updt; /* data valid */
  110. input [11:0] sc2cdma_dat_entries;
  111. input [11:0] sc2cdma_dat_slices;
  112. input mcif2cdma_dat_rd_rsp_valid; /* data valid */
  113. output mcif2cdma_dat_rd_rsp_ready; /* data return handshake */
  114. input [513:0] mcif2cdma_dat_rd_rsp_pd;
  115. input mcif2cdma_wt_rd_rsp_valid; /* data valid */
  116. output mcif2cdma_wt_rd_rsp_ready; /* data return handshake */
  117. input [513:0] mcif2cdma_wt_rd_rsp_pd;
  118. input [31:0] pwrbus_ram_pd;
  119. input sc2cdma_dat_pending_req;
  120. input sc2cdma_wt_pending_req;
  121. output cdma2sc_wt_updt; /* data valid */
  122. output [13:0] cdma2sc_wt_kernels;
  123. output [11:0] cdma2sc_wt_entries;
  124. output [8:0] cdma2sc_wmb_entries;
  125. input sc2cdma_wt_updt; /* data valid */
  126. input [13:0] sc2cdma_wt_kernels;
  127. input [11:0] sc2cdma_wt_entries;
  128. input [8:0] sc2cdma_wmb_entries;
  129. input dla_clk_ovr_on_sync;
  130. input global_clk_ovr_on_sync;
  131. input tmc2slcg_disable_clock_gating;

卷积DMA (CDMA)是卷积流水线中的一个阶段。它从SRAM/DRAM中取出数据用来进行卷积运算,按照卷积引擎所需的顺序将其存储到缓冲器(卷积Buffer或CBUF)中。支持的输入格式有:

  • 像素数据
  • 特征数据
  • 未压缩/压缩的权重
  • WMB
  • WGS

两个读取通道从CDMA连接到AXI接口,它们是权重读取通道和数据读取通道。为了获取上面列出的输入格式,通道被配置为该格式的模式,下表记录了读取通道映射的输入数据格式。

卷积DMA仅发送存储读取请求,卷积DMA发送的所有存储读取请求都是64字节对齐的。

CDMA由三个子模块组成,用于提取像素数据或特征数据进行卷积:CDMA_DC(NV_NVDLA_CDMA_dc, NV_NVDLA_CDMA_dc.v)、CDMA_WG(NV_NVDLA_CDMA_wg, NV_NVDLA_CDMA_wg.v)和CDMA_IMG(NV_NVDLA_CDMA_img, NV_NVDLA_CDMA_img.v)。

这些子模块的流程是相似的,但不同之处在于它们如何将数据排列到CBUF RAM。在任何时候,只有一个子模块被激活来获取像素/特征数据。

以CDMA_DC为例介绍流程:

  • 检查卷积缓冲区的状态是否有足够的可用空间。
  • 生成读取事务
  • 在共享缓冲区中缓存特征数据
  • 将特征立方体重构(reshape)为合适的顺序
  • 生成卷积缓冲器写地址
  • 将特征数据写入卷积缓冲器
  • 更新CDMA_STATUS子模块中卷积缓冲器的状态

卷积DMA使用专用引擎来处理Winograd的请求,CDMA_WG的结构和功能与CDMA_DC非常相似。但是,卷积缓冲区中生成的特征数据组织是不同的,因此CDMA_WG有一个特殊的获取序列。另外,CDMA_WG总是执行Winograd通道扩展。

CDMA_IMG引擎从外部存储器获取像素数据,它根据数据格式生成地址,对像素元素重新排序,并将它们写入卷积缓冲器的适当entry。CDMA_IMG的基本行为类似于CDMA_DC,但它对像素数据进行操作。

只有CDMA_DC引擎支持多批次模式。也就是说,在一个硬件层中提取多个输入特征数据立方体以提高性能,最大批量可达32。

CDMA还使用一个专用引擎来获取权重:CDMA_WT。与其他DMA引擎相比,CDMA_WT很简单,只是它可以一次支持三个读流。如果输入重量格式是未压缩的,则它仅获取重量数据。如果输入重量格式是压缩的,则权重、WMB和WGS都会被提取。有关权重格式的更多详细信息,请参见数据格式的详细说明。

如果输入权重数据被压缩,两个仲裁器被使能用于读取流的顺序。首先,权重循环仲裁器批准来自权重流或WMB流的请求。然后,获胜者利用静态优先级仲裁与WGS请求流竞争,WGS总是有优先权。最终的获胜请求被发送到权重通道以获取数据。

CDMA_WT总是试图尽可能多地填充卷积缓冲器,直到空闲entries用完或权重获取完成。

CDMA维护并传送CBUF中权重缓冲器和输入数据缓冲器的状态。CDMA和CSC中有两份状态。两个模块交换更新/发布信息,以决定何时获取新的特征/像素/权重数据以及何时发布这些数据元素。

能耗

卷积DMA在数据路径中应用时钟门控。卷积DMA的数据路径时钟在空闲时被选通,并且在可编程寄存器中没有配置硬件层。卷积DMA中的regfile子模块没有时钟门控,因此可以对新命令进行编程。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号