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.mzph.cn/diannao/23562.shtml

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

相关文章

mysql中 redo日志(上)

大家好。我们知道InnoDB 存储引擎是以页为单位来管理存储空间的&#xff0c;我们进行的增删改查操作其实本质上都是在访问页面。而在真正访问页面之前&#xff0c;需要把在磁盘上的页缓存到内存中的Buffer Pool之后才可以访问。那么我们思考一个问题&#xff1a;如果我们只在内…

数组去重的方法(原生JS)for in 和 for of 的区别

1. filter : function unique(arr) {return arr.filter(function(item, index, arr) {//当前元素&#xff0c;在原始数组中的第一个索引当前索引值&#xff0c;否则返回当前元素return arr.indexOf(item, 0) index;}); }var arr [1,1,true,true,true,true,15,15,false,false…

沃通CA参与《证书透明规范》及《自动化证书管理规范》两项商密标准制定

沃通CA加入由零信技术牵头的两项商密标准《证书透明规范》及《自动化证书管理规范》编制工作。沃通CA作为国内依法设立的电子认证服务机构与领先的SSL证书服务商&#xff0c;很荣幸参与到两项商密标准的编制工作中&#xff0c;不仅提供多年SSL证书领域的应用经验&#xff0c;还…

MacBook M系列芯片安装php8.2

适用于M1\M2\M3等系列的MacBook&#xff0c;记录下安装过程 安装brew 打开终端&#xff0c;执行如下命令&#xff1a; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"安装zsh&#xff08;非必须&#xff09; …

Taro(React)使用富文本编辑器Editor

在写项目的过程中很容易涉及到让使用者&#xff0c;输入一些介绍或者文本等相关功能&#xff0c; 前端在拿到这些文本时是需要直接渲染的&#xff0c;如果不使用富文本编辑器&#xff0c;这个时候得到的文章是没有格式的&#xff0c;这对于使用者来说体验非常的不好&#xff0c…

AUTOSAR网络管理报文(学习笔记)

文章分为三个部分来 简绍AUTOSAR的网络管理的优点或缺点 AUTOSAR全称AUTomotive Open System ARchitecture&#xff08;汽车开放系统架构&#xff09;。有一点需要注意 注意看全称中的英文大写部分&#xff0c;写全称时必须要按照上面的格式写&#xff0c;不能只写首字母大写…

--- JAVA 多态 ---

多态&#xff0c;顾名思义就时有多种形态&#xff0c;那咋样才嫩共有多种形态呢&#xff0c;再java中就是用不同的对象去调用同一个方法&#xff0c;产生了不同的结果。 看这段代码&#xff0c;我调用的是同一个方法&#xff0c;且只是传入的对象的不同&#xff0c;但是产生了不…

Linux网络服务之SSH(远程访问及控制)

ssh远程管理&#xff1a; ssh是一种安全通道协议&#xff0c;用来实现字符界面的远程登录。远程复制&#xff0c;远程文本传输。 ssh对通信双方的数据进行了加密 用户名和密码登录 密钥对认证方式&#xff08;可以实现免密登录&#xff09; ssh 22 网络层 传输层 数据传输…

【成品设计】基于红外线的目标跟踪无线测温系统设计

《基于红外线的目标跟踪无线测温系统设计》 整体功能&#xff1a; A端&#xff1a;无线跟踪端 主控&#xff1a;采用STM32F103C8T6单片机作为核心控制。360度编码模块数字脉冲输出红外解码编码模块OLED屏幕。 B端&#xff1a;无线待测端 主控&#xff1a;采用STM32F103C8T…

C语言杂谈:函数栈帧,函数调用时到底发生了什么

我们都知道在调用函数时&#xff0c;要为函数在栈上开辟空间&#xff0c;函数后续内容都会在栈帧空间中保存&#xff0c;如非静态局部变量&#xff0c;返回值等。这段空间就叫栈帧。 当函数调用&#xff0c;就会开辟栈帧空间&#xff0c;函数返回时&#xff0c;栈帧空间就会被释…

SpringBoot——整合Servlet的三大组件:过滤器(Filter)

目录 过滤器 一、用过滤器检查用户是否登录 LoginFilter自定义过滤器 FilterConfig配置类 FilterController控制器 SpringbootFilterApplication启动类 二、用过滤器统计资源访问量 LoginFilter FilterController 在开发SpringBoot项目时&#xff0c;开发人员经常需…

iOS swift5 加载网络图片的第三方框架

Kingfisher - github: 类似SDWebImage 参考博客&#xff1a; 一些swift项目中常用的处理图片的第三方框架 - 博客园

数据动态变化时实现多选及回显

<template><el-dialog title"设置权限" :visible.sync"showDialog" :close-on-click-modal"false" :append-to-body"true" width"800px"><div v-loading"loading"><el-radio-group v-model&…

RobotMaster编程语言:深度探索与实践挑战

RobotMaster编程语言&#xff1a;深度探索与实践挑战 RobotMaster编程语言&#xff0c;作为机器人编程领域的一颗璀璨明珠&#xff0c;其独特性与复杂性吸引了无数探索者的目光。本文将从四个方面、五个方面、六个方面和七个方面深入剖析这一编程语言的奥秘&#xff0c;同时揭…

Servlet实现会话追踪登录功能(结合JDBC)

目录 1.技术要求 2.关于会话Session 生活例子 代码体现 1.存储到session 2.从session中拿出 3.完成登录功能 4.利用Session作追踪 关于jstl应用 关于EL表达式应用 注意 5.测试 1.技术要求 核心&#xff1a; &#xff08;1&#xff09;Servlet项目的搭建 &#x…

C++---模板进阶(非类型模板参数,模板的特化,模板分离编译)

我们都学习和使用过模板&#xff0c;而这篇文章我们来将一些更深入的知识。在此之前&#xff0c;我们在使用C编程时可以看到模板是随处可见的&#xff0c;它能支持泛型编程。模板包括函数模板和类模板&#xff0c;我们有的人可能会说是模板函数和模板类&#xff0c;但严格讲这样…

MyQueue(队列)

目录 一、队列的定义 二、队列方法的实现 1、定义队列 2、后端插入 3、前端操作 4、判断队列是否为空 5、队列大小 三、队列方法的使用 一、队列的定义 队列是一种特殊的线性表&#xff0c;特殊之处在于它只允许在表的前端&#xff08;front&#xff09;进行删除操作&am…

Ripple:使用Wavelet Approximations来加速FHE的Programmable Bootstraps

1. 引言 University of Delaware和Nillion团队的 Charles Gouert、Mehmet Ugurbil、Dimitris Mouris、Miguel de Vega 和 Nektarios G. Tsoutsos&#xff0c;2024年论文《Ripple: Accelerating Programmable Bootstraps for FHE with Wavelet Approximations》&#xff0c;开源…

JVM内存分析之JVM分区与介绍

JVM&#xff08;Java Virtual Machine&#xff09;作为Java平台的核心组件&#xff0c;为Java应用程序的运行提供了一个虚拟的计算机环境。为了更好地理解和优化Java应用程序的性能&#xff0c;对JVM的内存管理进行深入分析是至关重要的。本文将详细介绍JVM的内存分区及其功能。…

关于一些优化的知识

1、凸优化&#xff1a;一定可找到全局最优解 非凸优化&#xff1a;一般是局部最优解 2、无约束优化问题求解方法&#xff1a;梯度下降、拟牛顿法、高斯牛顿法、LM算法 3、 解释&#xff0c;就是右边的式子对应于就是当前这个xk这个点基础上朝着pk取走步长为a得到了对应的值&…