HLS开发学习-06- 数据类型的处理-- HLS 中的复合数据类型

写在前面

本文是本系列专题的第六篇,参考高亚军老师的视频教程以及课程的ppt,主要介绍了vivado HLS数据类型的处理,结构体和枚举类型的处理。

结构体

结构体当struct被用作顶级函数的参数时,

标量成员被实现为标准标量端口
默认情况下,数组被实现为内存端口。

工程中建议-在头文件中定义结构体。

结构上的元素可以通过数据打包优化打包到单个向量中

  • Byte_pad
    • field_level
    • struct_level
      在这里插入图片描述

结构体示例

简单说明下这个例子,有过C基础的人都大致了解这个的操作,这里说一下结构体的大小:A占用1字节,B是位宽为4的长度为4的数组,占用4个字节所以一个结构体一共占用了5个字节。具体功能很简单这里就不细说了。
在这里插入图片描述

Data pack mode

数据打包的方式,这里我们在directive中可以进行配置,打包的模式。
在这里插入图片描述

field_level

field_level下的打包方式是:首先对每位数据都进行在标准字节长度下进行打包,这里的A位宽为4,但是一个字节位宽为8,所以A需要拓展为8位,如果A位宽为13,那么则需要打包在两个字节下,也即是打包的数据位宽为16。
在这里插入图片描述

struct_level

struct_level下的打包方式是:先打包结构,然后在标准字节长度下进行打包。和field_level相比,前者为所有数据都为8的倍数,后者则没有限制数据位宽,可以任意位宽,但是在整体打包后,需要对打包后的数据长度进行限制,化为整字节的长度。
在这里插入图片描述

打包方式对比

教程提及,两种的打包方式效果相似,暂时不作为区分
数据包可以减少延迟和初始间隔,即提高吞吐量
下面是刚刚的那个example的资源报表,经过了数据打包的操作,for循环展开,并行化处理,所以减少了延迟,提高了吞吐量。
在这里插入图片描述
这里老师提到了对于仿真的设置,可以创建虚拟总线(这里我暂时没接触到,暂时不深究)
在这里插入图片描述

枚举类型

枚举类型(也称为枚举)是一种数据类型,其中每个可能的值都定义为符号常量(称为枚举器)

  • 枚举是通过enum关键字声明的
  • 每个枚举数将根据其在枚举列表中的位置自动分配一个整数值
  • 默认情况下,第一个枚举器被分配整数值0,每个后续枚举器都有一个比前一个枚举器大1的值

在这里插入图片描述

枚举示例

根据刚刚介绍的枚举的处理,结合这里的例子,我们可以看出,在我们的函数调用的时候可以在case的索引值,相比原先的数字,我们可以更加直观的看出来每一个case的条件下执行的是具体哪种操作,我们可以利用枚举给每一步的操作命名。
在这里插入图片描述
Vivado HLS将自动推断模式的数据宽度,尽管默认情况下它是int该值与头文件中枚举类型定义的值一致,从仿真看出,工具和描述一致。
在这里插入图片描述

小结

Vivado HLS可以同时支持struct和enum结构和枚举
都可以在顶层函数接口上
如果结构在顶层函数接口,它可以通过数据包指令打包
如果顶级函数接口上的枚举,它实际上是一个整数,Vivado HLS将自动推断出数据宽度。

简单来说,HLS下进行结构体的调用时候,我们可以进行data pack 从而提高程序的效率,而引用枚举,目前我认为的实用操作就是在case下指示每一步操作,提高我们程序的可读性。在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41445387/article/details/106965075
HLS