Vitis HLS 学习笔记--聚合与解聚-AXI主接口

目录

1. 简介

2. 用法及语法

3. 详细解读

4. 总结


1. 简介

在使用 Vitis HLS 工具进行硬件设计时,如果你在接口上使用了结构体,工具会自动把结构体里的所有元素组合成一个整体。就像把一堆零件组装成一个玩具一样。这样做的好处是,数据可以作为一个单元一起处理,而不是分开处理每个元素。

默认情况下,Vitis HLS 会自动做这个组合工作,你不需要特别告诉它去做。此外,为了确保数据的整齐排列,工具可能会在结构体的元素之间填充一些空位,这就像在书架上放书时,为了让书看起来整齐,你可能会在它们之间插入一些支撑物一样。通常,这种排列是按照4字节的大小来进行的,但你也可以设置成其他大小的对齐方式。

2. 用法及语法

#pragma HLS aggregate variable=<variable> compact=<arg>

其中:

variable=<variable>,指定要聚合的变量。

compact=[bit | byte | none | auto],指定已聚合的结构体的对齐方式。可选设置包括:

  • 按位级对齐
  • 按字节级对齐
  • 无对齐
  • 由工具自动判定对齐方式(默认行为)

示例一:

将函数 func 内含 3 个 8 位字段的结构体指针 AB 聚合到一个新的 24 位指针内并按位级对齐。

typedef struct{unsigned char R;unsigned char G;unsigned char B;
} pixel;pixel AB;#pragma HLS aggregate variable=AB compact=bit

示例二:

将含 3 个 8 位字段(R、G 和 B)的结构体阵列 AB[16] 聚合到一个含 16 个元素的 24 位新阵列内。

typedef struct{unsigned char R;unsigned char G;unsigned char B;
} pixel;pixel AB[16];#pragma HLS aggregate variable=AB

3. 详细解读

  • 对于 Vitis Kernel Flow,结构体的所有元素聚合都在 4 字节位置对齐。
  • 对于 Vivado IP Flow,结构体的所有元素聚合都在 1 字节位置对齐。
  • 此对齐可能需要添加位填充,以对齐各元素或者使各元素保持对齐。

可根据结构体元素的声明顺序推断出生成的新字宽标量的位对齐方式。结构体的第一个元素取矢量的 LSB,最后一个元素则与矢量的 MSB 对齐。
如果结构体包含阵列,那么 AGGREGATE 编译指示执行的操作与 ARRAY_RESHAPE 类似,可将重构的阵列与结构体中的其它元素组合在一起。在该结构体内部声明的所有阵列都将全部分区并重构为单一大宽度标量,与其它标量元素封装在一起。

默认情况下,聚合的结构体将进行填充而不是打包,但在 Vivado IP 流程中,可使用 AGGREGATE 编译指示或指令的compact=bit 选项将其打包。但定义为 AXI4 接口的任意端口(m_axi、s_axilite 或 axis)都无法使用compact=bit。

综合示例:

struct A {char Vchar;short Vshort;
};int example (A* arr) {
#pragma HLS interface m_axi port = arr depth = 10
#pragma HLS interface s_axilite port = arr//#pragma HLS aggregate variable = arr compact = autoint sum = 0;for (unsigned i = 0; i < 10; i++) {auto tmp = arr[i];sum += tmp.Vchar + tmp.Vshort;}return sum;
}

TestBench:

#include <iostream>struct A {char Vchar;short Vshort;
};extern int example (A* arr);int main() {A arr[N];for (unsigned i = 0; i < 10; i++) {arr[i].Vchar = i;arr[i].Vshort = i;}auto ret = example(arr);std::cout << "ret = " << ret << std::endl;if (ret != 90)return 1;return 0;
}

Waveform:

通过 Handshake 的 gmem_RVALID 信号,判断 maxi 传输时间段: 

通过查看 gmem_RVALID 有效期间的信号,可以看到结构体变量A在 gmem_RDATA[63:0] 中的分布:

看上去比较奇怪。

4. 总结

在 Vitis HLS 设计中,使用 #pragma HLS aggregate 指令可以将结构体中的元素聚合成一个整体,这样可以作为一个单元一起处理。这种聚合默认是按照4字节对齐,但也可以通过指定 compact 参数来改变对齐方式。例如,compact=bit 会按位级对齐,而 compact=byte 则按字节级对齐。在 Vivado IP Flow 中,默认对齐是1字节,而在 Vitis Kernel Flow 中是4字节。聚合可以优化数据传输和存储,但可能需要位填充以保持对齐。在定义 AXI4 接口时,不能使用 compact=bit。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows安装nc

前言 我们可能用nc时都要打开虚拟机,但为了方便,我们可以在本机上面安装nc,更加便捷 下载 nc(windows版) 配置 下载之后解压 这个就是我们要的nc了 输入cmd nc 连接就ok了 要是nc64.exe不舒服,你可以复制一下这个nc64.exe,然后再粘贴下来,重命名为nc 配置环境变量 这个…

【Python数据魔术】:揭秘类型奥秘,赋能代码创造

文章目录 &#x1f680;一.运算符&#x1f308;1. 算术运算符&#x1f308;2. 身份运算符&#x1f308;3. 成员运算符⭐4. 增量运算符⭐5. 比较运算符⭐6. 逻辑运算符 &#x1f680;二.可变与不可变&#x1f680;三.字符串转义&#x1f680;四.编码与解码&#x1f4a5;1. 基础使…

OpenCv之简单的人脸识别项目(动态处理页面)

人脸识别 准备九、动态处理页面1.导入所需的包2.设置窗口2.1定义窗口外观和大小2.2设置窗口背景2.2.1设置背景图片2.2.2创建label控件 3.定义视频处理脚本4.定义相机抓取脚本5.定义关闭窗口的函数6.按钮设计6.1视频处理按钮6.2相机抓取按钮6.3返回按钮 7.定义关键函数8.动态处理…

苹果WWDC 2024 带来的 AI 风暴:从生产力工具到个人助理,AI 将如何融入我们的生活?

2024年6月5日&#xff0c;苹果WWDC 2024全球开发者大会如约而至&#xff0c;带来了众多令人兴奋的新功能和新产品。其中&#xff0c;AI 技术的全面融入无疑是最引人注目的亮点。从 iOS、iPadOS 到 macOS&#xff0c;再到 Siri 和开发者工具&#xff0c;苹果正在将 AI 融入到其生…

Linux环境各种软件安装配置

安装Java 官网 找个喜欢的版本 下载好了传到linux里&#xff0c;xshell的xftp直接拖过去就可以传 #安装rpm包管理 yum install -y rpm or apt-get install rpm #查找Java rpm -qa | grep java\|jdk\|gcj\|jre #卸载java rpm -e --nodeps jdk-1.8-1.8.0_401-10.x86_64 #安装 …

斜率优化详解

斜率优化 [HNOI2008] 玩具装箱 状态转移方程&#xff1a; f i m i n ( f i , f j ( s u m i i − s u m j − j − L ) 2 ) i > j f_imin(f_i,f_j(sum_ii-sum_j-j-L)^2){i>j} fi​min(fi​,fj​(sumi​i−sumj​−j−L)2)i>j 设A为 s u m i i sum_ii sumi​i&…

【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(二)

主要内容介绍可tmux和vim的一些常用操作&#xff0c;可以当作笔记需要的时候进来查就行。 文章目录 前言 一、tmux和vim 二、Linux系统基本命令 1.tmux教程 2. vim教程 3.练习 总结 前言 主要内容介绍可tmux和vim的一些常用操作&#xff0c;可以当作笔记需要的时候进来查就行…

双非本科一年20w,已是人中龙凤了

大家好&#xff0c;我是白露啊。 “双非本科一年20w已经是人中龙凤了”……吗&#xff1f; 牛客上刷到这条帖子&#xff0c;我一开始以为是一个钓鱼、引战贴。看完才觉得他说的很对&#xff0c;现在在求职选择工作的时候&#xff0c;网上都觉得得40万、50万&#xff0c;但当真…

Next.js Tailwind CSS UI组件

摘要&#xff1a; 官网 今天公司使用到一个前端ui框架——Next.js Tailwind CSS UI组件&#xff01;这从头构建一个AI驱动的前端UI组件生成器&#xff0c;生成Next.js Tailwind CSS UI组件&#xff1a; 1、用Next.js、ts和Tailwind CSS构建UI组件生成器Web应用程序。 2、用Copi…

LVGL欢乐桌球游戏(LVGL+2D物理引擎学习案例)

LVGL欢乐桌球游戏&#xff08;LVGL2D物理引擎学习案例&#xff09; 视频效果&#xff1a; https://www.bilibili.com/video/BV1if421X7DL

UFS协议入门-分层结构

写在前面:本文参考UFS jedec3.1,本文思维导图如下 1. 分层概述 UFS协议分为3层,从上至下分别是:应用层(UAP),传输层(UTP),互联层(UIC),具体结构如下图所示。 2.1 应用层 在应用层(UAP)中,包括:UFS指令集(UCS),设备管理器(Device Manager),任务管理器(Task Manager…

MeiliSearch-轻量级且美丽的搜索引擎

MeiliSearch-轻量级且美丽的搜索引擎 MeiliSearch 是一个功能强大、快速、开源、易于使用和部署的搜索引擎。它具有以下特点&#xff1a; 支持中文搜索&#xff1a;MeiliSearch 对中文有良好的支持&#xff0c;不需要额外的配置。高度可定制&#xff1a;搜索和索引都可以高度…

GPT-4o多模态大模型的架构设计

GPT-4o&#xff1a;大模型风向&#xff0c;OpenAI大更新 OpenAI震撼发布两大更新&#xff01;桌面版APP与全新UI的ChatGPT上线&#xff0c;简化用户操作&#xff0c;体验更自然。同时&#xff0c;全能模型GPT-4o惊艳亮相&#xff0c;跨模态即时响应&#xff0c;性能卓越且性价比…

计算机网络 期末复习(谢希仁版本)第3章

对于点对点的链路&#xff0c;目前使用得最广泛的数据链路层协议是点对点协议 PPP (Point-to-Point Protocol)。局域网的传输媒体&#xff0c;包括有线传输媒体和无线传输媒体两个大类&#xff0c;那么有线传输媒体有同轴电缆、双绞线和光纤&#xff1b;无线传输媒体有微波、红…

Flink的简单学习五

一 动态表与连续查询 1.1 动态表 1.是flink的支持流数据Table API 和SQL的核心概念。动态表随时间的变化而变化 2.在流上面定义的表在内部是没有数据的 1.2 连续查询 1.永远不会停止&#xff0c;结果是一张动态表 二 Flink SQL 2.1 sql行 1.先启动启动flink集群 yarn-see…

全球首创4090推理!昆仑万维开源Skywork-MoE模型

昆仑万维近期宣布开源了其2千亿参数规模的稀疏大模型Skywork-MoE。这个模型是基于他们之前开源的Skywork-13B模型中间checkpoint扩展而来的&#xff0c;并且宣称是首个完整应用MoE Upcycling技术的开源千亿MoE大模型。此外&#xff0c;它也是首个支持使用单台RTX 4090服务器&am…

SpringSecurity入门(一)

1、引入依赖 spring-boot版本2.7.3&#xff0c;如未特殊说明版本默认使用此版本 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><g…

16 DTLS协议

加密解密基本概念 什么是非对称加密 什么是公钥 这个就是谁都能获得的钥匙什么是私钥 只有一个人能获得 非对称加密就是公钥上的锁&#xff0c;私钥才能打开&#xff0c;私钥上的锁公钥才能打开。比如说就是地下党接头的时候&#xff0c;把一个信息放在盒子里&#xff0c;然…

大数据概论总结

三次信息化浪潮 : 信息技术的支撑 : 存储设备容量不断增加 CPU的处理能力不断提高 网络带宽不断增加 数据产生方式的变革促成大数据时代的来临 运营式系统阶段用户原创内容感知式系统阶段 大数据发展历程 : 分为三个阶段 : 大数据的概念 : 1 . 数据量大 : 根据IDC作出…

每日一练:攻防世界:base64stego

base64stego&#xff1a; 打开压缩包发现被加密&#xff0c;用winhex查看&#xff0c;发现是伪加密&#xff0c;修改文件目录区的全局方式位标记&#xff0c;成功打开压缩包&#xff0c;得到一个文本 这里我想的有三种情况&#xff1a;1.直接base64解码&#xff0c;然后看解码…