HLS 支持的复合数据类型包括两种:Struct 和 Enumeration。

1. Struct

如果 top-level functions 的参数是 Arrays,最终会被转译为 memory ports。
和 C/C++ 编程相同,建议是将 struct 定义在 header 文件中方便引用。
在 struct 中使用的 elements 最终会被 packed into a single vector(类似 C 中顺序排列组成的内存块),有两种形式:field_level 和 struct_level。

示例如何规范定义和使用 struct
这里 sizeof(data_t) 大小为 5 的原因是,A 是 ap_int<4> 宽度为 4bits,占用一个 1 byte;同样 B 为 ap_uint<4> 数组会占用 4 byte,总共是 5 byte。

对于 struct 类型对应的 Directive 叫作 DATA_PACK,下方选择目标的 byte_pad 形式(上面提到的两种)。

a. Byte Pad: field_level

field_level 模式下,struct 中每个 elements 都需要扩展到 8 bit 倍数。
上图示例中由于每个元素都是 4 bits 所有最后都扩展为了 8 bits,最后总大小为 5x8=40 bits。

b. Byte Pad: struct_level

另一个是 struct_level,每个元素的实际位宽保留,要求 packed 后的 single vector 总的 bits 是 8 的倍数。
上图示例中原先大小为 20bits,packed 后大小变为 24bits。

从下图资源利用率,Interval 以及 latency 等来看,两种形式没有明显差别,并且都使系统的吞吐率提高了。
这种 Data Pack Mode 相当于把 for-loop 展开

在仿真时为了便于查看,可以将我们创建的 struct 中的元素,按照其实际的位宽拿出来,创建 virtual bus 便于查看。

2. Enumerated Type

所谓枚举类型,就是把需要的数值定义为符号常量便于使用,其中的元素会按照顺序被自动分配一个整数。

通过枚举类型提高了代码的可读性

如上图中代码所示,当定义的 enum 类型作为 function arguments 使用时,HLS 会自动推断该类型的 data width,其默认是 int 类型。

3. Summary