复合数据类型的高层次综合使用
一、高层次综合支持的可综合符合数据类型1.struct结构体2.enum枚举3.union联合体二、struct结构体1.stuct结构体可以作为顶层函数的实参在进行默认修饰和约束情况下综合后创建的端口就是结构体内部的成员自身本默认综合后的结果的直接反映其中标量成员作为标准的标量端口来实现的数组默认为内存端口来实现。2.对于 Vivado HLS 可综合的结构体的大小或复杂性并无限制。结构体中可包含所需的任意数量的数组维度和成员。仅当数组作为流传输例如FIFO 接口来实现时才会出现结构体实现的唯一限制。3.结构体可以使用data_pack指令来进行数据类型的打包实现。三、enum枚举1.在顶层函数的实参中使用 enum则会将枚举综合为 32 位值以符合标准 C 语言编译行为。2.枚举类型在设计内部则 Vivado HLS 会将其最优化到必需的最小位数。也就是说enum枚举在顶层函数接口中作为参数使用和放在函数内部使用被综合为rtl的结果不一样如果在顶层参数中应用一律综合为32bit的port端口如果在内部使用那么HLS高层次综合工具会依据其遍历范围来优化优化到最小的位数。四、union联合体1.union联合体不支持在顶层函数的接口上使用这个要注意2.在函数内部union联合体内部不能包含不同类型的指针或者不同类型的数组指针这个是不可综合的3.通过其它变量访问联合体注意不能通过if-else方式进行不同成员的访问这个是不可综合的for (int i 0; i 6; i)if (i3)A[i] intfp.intval.a B[i];elseA[i] intfp.intval.b B[i];}此代码不可综合需要修改为显式遍历才能综合A[0] intfp.intval.a B[0];A[1] intfp.intval.a B[1];A[2] intfp.intval.a B[2];A[3] intfp.intval.b B[3];A[4] intfp.intval.b B[4];A[5] intfp.intval.b B[5];4.hls高层次工具对union的综合只限于原生态的c类型的union不支持原生态的c语言的数据类型和用户自定义的类型之间的类型转换比如一个union中的成员为double和ap_uint64,这个是不可综合的因为double是原生态类型ap_uint64是新扩展的类型。五、原生态类型和新类型之间的转换方法1.使用static_cast类型模板进行处理valuestatic_castap_uint16 (myhalfvalue) 或 static_castunsigned short (myhalfvalue)。2.程序类 fp_structhalf 来通过 data() 或 to_int() 方法进行转换。使用 hls/utils/x_hls_utils.h 头文件。