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

news2024/9/19 13:47:07

概述

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

module NV_NVDLA_cdma (
   cdma_dat2cvif_rd_req_ready    //|< i
  ,cdma_dat2mcif_rd_req_ready    //|< i
  ,cdma_wt2cvif_rd_req_ready     //|< i
  ,cdma_wt2mcif_rd_req_ready     //|< i
  ,csb2cdma_req_pd               //|< i
  ,csb2cdma_req_pvld             //|< i
  ,cvif2cdma_dat_rd_rsp_pd       //|< i
  ,cvif2cdma_dat_rd_rsp_valid    //|< i
  ,cvif2cdma_wt_rd_rsp_pd        //|< i
  ,cvif2cdma_wt_rd_rsp_valid     //|< i
  ,dla_clk_ovr_on_sync           //|< i
  ,global_clk_ovr_on_sync        //|< i
  ,mcif2cdma_dat_rd_rsp_pd       //|< i
  ,mcif2cdma_dat_rd_rsp_valid    //|< i
  ,mcif2cdma_wt_rd_rsp_pd        //|< i
  ,mcif2cdma_wt_rd_rsp_valid     //|< i
  ,nvdla_core_clk                //|< i
  ,nvdla_core_rstn               //|< i
  ,pwrbus_ram_pd                 //|< i
  ,sc2cdma_dat_entries           //|< i
  ,sc2cdma_dat_pending_req       //|< i
  ,sc2cdma_dat_slices            //|< i
  ,sc2cdma_dat_updt              //|< i
  ,sc2cdma_wmb_entries           //|< i
  ,sc2cdma_wt_entries            //|< i
  ,sc2cdma_wt_kernels            //|< i
  ,sc2cdma_wt_pending_req        //|< i
  ,sc2cdma_wt_updt               //|< i
  ,tmc2slcg_disable_clock_gating //|< i
  ,cdma2buf_dat_wr_addr          //|> o
  ,cdma2buf_dat_wr_data          //|> o
  ,cdma2buf_dat_wr_en            //|> o
  ,cdma2buf_dat_wr_hsel          //|> o
  ,cdma2buf_wt_wr_addr           //|> o
  ,cdma2buf_wt_wr_data           //|> o
  ,cdma2buf_wt_wr_en             //|> o
  ,cdma2buf_wt_wr_hsel           //|> o
  ,cdma2csb_resp_pd              //|> o
  ,cdma2csb_resp_valid           //|> o
  ,cdma2sc_dat_entries           //|> o
  ,cdma2sc_dat_pending_ack       //|> o
  ,cdma2sc_dat_slices            //|> o
  ,cdma2sc_dat_updt              //|> o
  ,cdma2sc_wmb_entries           //|> o
  ,cdma2sc_wt_entries            //|> o
  ,cdma2sc_wt_kernels            //|> o
  ,cdma2sc_wt_pending_ack        //|> o
  ,cdma2sc_wt_updt               //|> o
  ,cdma_dat2cvif_rd_req_pd       //|> o
  ,cdma_dat2cvif_rd_req_valid    //|> o
  ,cdma_dat2glb_done_intr_pd     //|> o
  ,cdma_dat2mcif_rd_req_pd       //|> o
  ,cdma_dat2mcif_rd_req_valid    //|> o
  ,cdma_wt2cvif_rd_req_pd        //|> o
  ,cdma_wt2cvif_rd_req_valid     //|> o
  ,cdma_wt2glb_done_intr_pd      //|> o
  ,cdma_wt2mcif_rd_req_pd        //|> o
  ,cdma_wt2mcif_rd_req_valid     //|> o
  ,csb2cdma_req_prdy             //|> o
  ,cvif2cdma_dat_rd_rsp_ready    //|> o
  ,cvif2cdma_wt_rd_rsp_ready     //|> o
  ,mcif2cdma_dat_rd_rsp_ready    //|> o
  ,mcif2cdma_wt_rd_rsp_ready     //|> o
  );


//
// NV_NVDLA_cdma_ports.v
//
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 */
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 */

output          cdma2buf_dat_wr_en;    /* data valid */
output   [11:0] cdma2buf_dat_wr_addr;
output    [1:0] cdma2buf_dat_wr_hsel;
output [1023:0] cdma2buf_dat_wr_data;

output         cdma2buf_wt_wr_en;    /* data valid */
output  [11:0] cdma2buf_wt_wr_addr;
output         cdma2buf_wt_wr_hsel;
output [511:0] cdma2buf_wt_wr_data;

output        cdma2csb_resp_valid;  /* data valid */
output [33:0] cdma2csb_resp_pd;     /* pkt_id_width=1 pkt_widths=33,33  */

output  cdma2sc_dat_pending_ack;

output  cdma2sc_wt_pending_ack;

output        cdma_dat2cvif_rd_req_valid;  /* data valid */
input         cdma_dat2cvif_rd_req_ready;  /* data return handshake */
output [78:0] cdma_dat2cvif_rd_req_pd;

output [1:0] cdma_dat2glb_done_intr_pd;

output        cdma_dat2mcif_rd_req_valid;  /* data valid */
input         cdma_dat2mcif_rd_req_ready;  /* data return handshake */
output [78:0] cdma_dat2mcif_rd_req_pd;

output        cdma_wt2cvif_rd_req_valid;  /* data valid */
input         cdma_wt2cvif_rd_req_ready;  /* data return handshake */
output [78:0] cdma_wt2cvif_rd_req_pd;

output [1:0] cdma_wt2glb_done_intr_pd;

output        cdma_wt2mcif_rd_req_valid;  /* data valid */
input         cdma_wt2mcif_rd_req_ready;  /* data return handshake */
output [78:0] cdma_wt2mcif_rd_req_pd;

input         csb2cdma_req_pvld;  /* data valid */
output        csb2cdma_req_prdy;  /* data return handshake */
input  [62:0] csb2cdma_req_pd;

input          cvif2cdma_dat_rd_rsp_valid;  /* data valid */
output         cvif2cdma_dat_rd_rsp_ready;  /* data return handshake */
input  [513:0] cvif2cdma_dat_rd_rsp_pd;

input          cvif2cdma_wt_rd_rsp_valid;  /* data valid */
output         cvif2cdma_wt_rd_rsp_ready;  /* data return handshake */
input  [513:0] cvif2cdma_wt_rd_rsp_pd;

output        cdma2sc_dat_updt;     /* data valid */
output [11:0] cdma2sc_dat_entries;
output [11:0] cdma2sc_dat_slices;

input        sc2cdma_dat_updt;     /* data valid */
input [11:0] sc2cdma_dat_entries;
input [11:0] sc2cdma_dat_slices;

input          mcif2cdma_dat_rd_rsp_valid;  /* data valid */
output         mcif2cdma_dat_rd_rsp_ready;  /* data return handshake */
input  [513:0] mcif2cdma_dat_rd_rsp_pd;

input          mcif2cdma_wt_rd_rsp_valid;  /* data valid */
output         mcif2cdma_wt_rd_rsp_ready;  /* data return handshake */
input  [513:0] mcif2cdma_wt_rd_rsp_pd;

input [31:0] pwrbus_ram_pd;

input  sc2cdma_dat_pending_req;

input  sc2cdma_wt_pending_req;

output        cdma2sc_wt_updt;      /* data valid */
output [13:0] cdma2sc_wt_kernels;
output [11:0] cdma2sc_wt_entries;
output  [8:0] cdma2sc_wmb_entries;

input        sc2cdma_wt_updt;      /* data valid */
input [13:0] sc2cdma_wt_kernels;
input [11:0] sc2cdma_wt_entries;
input  [8:0] sc2cdma_wmb_entries;

input   dla_clk_ovr_on_sync;
input   global_clk_ovr_on_sync;
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子模块没有时钟门控,因此可以对新命令进行编程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2038573.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Nacos】docker部署nacos服务

docker部署nacos服务 1.直接执行命令2.如果网络出现问题 1.直接执行命令 docker run -e JVM_XMS256m -e JVM_XMX256m --env MODEstandalone \ --name mynacos -d -p 8848:8848 -p 9848:9848 -p 9849:9849 \ docker.io/nacos/nacos-server:v2.1.12.如果网络出现问题 执行如下命…

计算机系统基础知识:计算机组成和基本原理

文章目录 1. 总线1.1 系统总线1.2 外总线 2. 中央处理单元2.1 CPU组成运算器控制器寄存器组内部总线 2.2 多核处理器 3. 存储系统3.1 分类3.2 层次结构3.3 主存储器3.4 高速缓存3.5 外存储器3.6 云存储 4. 输入/输出技术4.1 接口的功能和分类4.2 主机和外设间的连接方式4.3 编址…

定制化三防平板:满足个性化需求

定制化服务的核心在于理解并满足用户的个性化需求。对于三防平板而言&#xff0c;这意味着设备不仅需要具备防水、防尘、防摔的基本特性&#xff0c;更需根据用户的特定工作环境和使用习惯&#xff0c;进行功能和设计上的优化。 例如&#xff0c;对于在极端温度环境下作业的人…

51单片机-LED灯蜂鸣器数码管按键DS18B20温度传感器

LDE灯的相关程序 LED灯闪烁 LED流水灯 方法1 方法二&#xff1a; 因为P1口可以直接控制P1^0~P1^7的8个led灯&#xff0c;利用一个8位的二进制数字来进行控制即可。如果要点亮P1^0 只需要给P1口传递 1111 1110即可。 蜂鸣器的使用 什么是蜂鸣器&#xff1f; 蜂鸣器是一种一…

【C++】类和对象 ——中

1. 赋值运算符重载 1.1 运算符重载 • 当运算符被⽤于类类型的对象时&#xff0c;C语⾔允许我们通过运算符重载的形式指定新的含义。C规定类类型对象使⽤运算符时&#xff0c;必须转换成调⽤对应运算符重载&#xff0c;若没有对应的运算符重载&#xff0c;则会编译报错。 •…

Leetcode—1143. 最长公共子序列【中等】

2024每日刷题&#xff08;155&#xff09; Leetcode—1143. 最长公共子序列 实现代码 class Solution { public:int longestCommonSubsequence(string text1, string text2) {int m text1.length();int n text2.length();vector<vector<int>> dp(m 1, vector&…

sadtalker推理的时候报错:IndexError: Cannot choose from an empty sequence

问题描述 在进行推理的时候&#xff0c;报错IndexError: Cannot choose from an empty sequence&#xff0c;如下图 解决办法&#xff1a; 这个报错是因为你输入的音频太短了&#xff0c;不到1秒就会报这个错。你可以输入个大于1秒的视频试一下。 也可以修改代码解决这个问题…

Python教程(十四):Requests模块详解

目录 专栏列表前言&#xff1a;安装 Requests查看包安装情况&#xff1a; RESTful 介绍RESTful API设计原则示例 基本用法1. 查询ID为1的用户&#xff08;GET&#xff09;2. 创建新用户&#xff08;POST&#xff09;3. 更新ID 为 1 的用户&#xff08;PUT&#xff09;4. 删除ID…

Haproxy讲解

Haproxy: haproxy是一个开源的高性能反向代理和负载均衡器&#xff0c;主要用于‌TCP和‌HTTP流量管理。 功能和特点&#xff1a;haproxy能够处理大量的并发连接&#xff0c;支持TCP和HTTP协议&#xff0c;具有高可用性和负载均衡功能。它特别适用于需要处理大量流量的网站&am…

AI终于会画手了,Flux.1一出世就直接碾压Stable Diffusion(SD)和Midjourney(MJ)

Flux.1模型一发布&#xff0c;AI文生图终于会画手了&#xff0c;Flux.1模型比Stable Diffusion&#xff08;SD&#xff09;和Midjourney&#xff08;MJ&#xff09;更能将手部和长文本生成得更好更合理。 Flux.1模型生成的图&#xff0c;现在手部不再有畸形了。 同时&#xff…

hfs通过stunnel实现https访问

hfs通过stunnel实现https访问 REF:官方文档&#xff0c;有点老旧 https://blog.51cto.com/u_15015155/2554641 步骤 下载stunnel工具 download (笔者用的是windows的) 下载stunnel途中会进行本地证书的制作&#xff08;也可以用openssl自定义证书&#xff09;&#xff0c;如…

C++ 适配器

适配器 适配器是一种设计模式&#xff0c;我们最终实现的功能可以通过不同的路径来实现&#xff0c;那么这个路径就可以称作适配器。 例如下面的例子&#xff1a; 那么在c中也有适配器&#xff0c;例如stack、queue、priority_queue&#xff0c;它们并不是使用了什么新的内存…

【python爬虫】利用Python爬取天气数据,并做可视化分析

首先登录网站&#xff0c;查看网页内容及数据格式(使用代码查看内容)&#xff0c;选择两个城市及对应月份&#xff0c;爬取对应天气数据&#xff0c;进行数据预处理(如缺失值处理、数据类型转换、字符串截取等)&#xff0c;数据的初步探索性分析(如描述性统计、数据可视化查看数…

应对猫咪掉毛挑战,希喂、小米热门宠物空气净化器实测功效PK

随着养宠人群的增多&#xff0c;铲屎官们的需求日益增长&#xff0c;市场上出现了很多品牌的宠物空气净化器。然而&#xff0c;产品质量参差不齐&#xff0c;给消费者选择带来不少困难。劣质宠物空气净化器不仅无法有效去除宠物毛发、皮屑、异味及空气中的有害微粒&#xff0c;…

启动虚拟机:另一个程序已锁定文件的一部分,进程无法访问,打不开磁盘xxx或它所依赖的某个快照磁盘

theme: nico 你们好&#xff0c;我是金金金。 场景 启动虚拟机时报错如下 造成error的原因 这是一种虚拟机的保护机制 虚拟机在运行时&#xff0c;为了防止数据被篡改&#xff0c;会将所运行的文件保护起来。 当虚拟机突然崩溃或强制结束导致异常退出&#xff08;我昨天是直接…

【C++】设计模式 — 从零开始认识单例模式

人的一生本来就是一场有来无回的冒险。 --- priest 《残次品》--- 设计模式 — 单例模式 1 设计模式2 单例模式2.1 饿汉模式2.2 懒汉模式 3 总结 1 设计模式 设计模式&#xff08;Design Pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结…

YZ系列工具之YZ05:代码运行中调用“计算器”使用说明

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套一部VBA手册&#xff0c;教程分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的…

语音播报加入预警系统

语音播报加入预警系统 引言 引入语音警报 我们前一章, 已经把jq8900-16p模块, 单独进行了测试, 可以通过发送命令, 让模块播报设定好的声音。那么语音播报&#xff0c; 在预警系统中&#xff0c; 也必不可少&#xff0c; 我们现在有了led灯光警报,如果主人在睡觉, 是不能及时…

redis列表若干记录

2、列表 ziplist ziplist参数 entry结构 entry-data:节点存储的元素prelen&#xff1a;记录前驱节点长度encoding&#xff1a;当前节点编码格式encoding encoding属性 使用多个子节点存储节点元素长度&#xff0c;这种多字节数据存储在计算机内存中或者进行网络传输的时的字节…

排序算法——插入排序

一、插入排序概念 直接插入排序&#xff08;Insertion Sort&#xff09;是一种简单的排序算法&#xff0c;它的工作原理类似于人们手动排序卡片的方式。该算法通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插…