一、联合体在高层次综合中应用说明1.联合体在一般C语言设计中比较常用但是在高层次综合中其实不太推荐使用2.在高层次综合中综合工具并不能保证你使用union联合体中的多个成员使用相同的内存综合工具可能将union的成员综合为一个内存空间也可能将其综合为多个独立的寄存器。这样就不能保证不同的类型访问的是相同的数据了。union {struct {int a; int b; } intval;double fpval;} intfp;这个联合体中综合工具并不一定会将intval和fpval综合为同一个寄存器而是有可能综合为一个64bit的寄存器但是也有可能综合为三个无任何关联的寄存器。3.上述代码中在我们嵌入式设计中使用的是内存重叠Vivado HLS 不保证 union 的所有字段共享相同内存/寄存器。它可能会在硬件实现中优化掉这种重叠。所以union的使用要慎重。二、union在高层次综合中字节顺序和硬件布局是不确定的1.union在c语言中通过作为i类型的双关type punning操作或者位操作2.如果vivado hls工具考虑时序II为主要目标可能为了时序会将union中的成员综合为不同的独立寄存器在 HLS 中union 的内存重叠不是硬性要求否则会妨碍优化。HLS 可能会选择为 double 和 struct 使用独立的寄存器/信号以提高时序。三、原因分析在普通的C编译器如GCC、LLVM中union 的物理要求是绝对重叠fpval 和 intval 必须占用完全一致的物理内存地址。这是CPU指令集规范决定的。但是在Vivado HLS中union 被综合为硬件电路寄存器、LUT、布线。Vivado HLS 会执行强力的综合优化以追求最佳的硬件时序速度和面积资源。如果没有强制约束HLS 可能会分析出 fpval 和 intval 在算法中不仅“写”和“读”是分开进行的而且可能在不同流水线阶段使用。为了提升电路性能、减少关键路径延时HLS 可能会将 fpval 和 intval 分别映射到两个物理上独立、彼此不重合的寄存器/信号线上。此时如果你在代码中假设 a 是 fpval 的低32位硬件综合出来的电路可能会完全打破这个逻辑导致计算结果错误。四、不要对union做过多的期望推荐下面代码方式进行设计#include ap_int.h// 直接将浮点数作为 64位 二进制流处理unsigned long long fp_bits *((unsigned long long*)(F));// 或者使用 ap_uint64ap_uint64 fp_bits_uint *((ap_uint64*)(F));// 然后通过位切片提取你想要的部分ap_uint52 mantissa fp_bits_uint(51, 0);ap_uint11 exponent fp_bits_uint(62, 52);ap_uint1 sign fp_bits_uint(63, 63);
union联合体在高层次综合设计中应用(一)
发布时间:2026/6/7 22:14:42
一、联合体在高层次综合中应用说明1.联合体在一般C语言设计中比较常用但是在高层次综合中其实不太推荐使用2.在高层次综合中综合工具并不能保证你使用union联合体中的多个成员使用相同的内存综合工具可能将union的成员综合为一个内存空间也可能将其综合为多个独立的寄存器。这样就不能保证不同的类型访问的是相同的数据了。union {struct {int a; int b; } intval;double fpval;} intfp;这个联合体中综合工具并不一定会将intval和fpval综合为同一个寄存器而是有可能综合为一个64bit的寄存器但是也有可能综合为三个无任何关联的寄存器。3.上述代码中在我们嵌入式设计中使用的是内存重叠Vivado HLS 不保证 union 的所有字段共享相同内存/寄存器。它可能会在硬件实现中优化掉这种重叠。所以union的使用要慎重。二、union在高层次综合中字节顺序和硬件布局是不确定的1.union在c语言中通过作为i类型的双关type punning操作或者位操作2.如果vivado hls工具考虑时序II为主要目标可能为了时序会将union中的成员综合为不同的独立寄存器在 HLS 中union 的内存重叠不是硬性要求否则会妨碍优化。HLS 可能会选择为 double 和 struct 使用独立的寄存器/信号以提高时序。三、原因分析在普通的C编译器如GCC、LLVM中union 的物理要求是绝对重叠fpval 和 intval 必须占用完全一致的物理内存地址。这是CPU指令集规范决定的。但是在Vivado HLS中union 被综合为硬件电路寄存器、LUT、布线。Vivado HLS 会执行强力的综合优化以追求最佳的硬件时序速度和面积资源。如果没有强制约束HLS 可能会分析出 fpval 和 intval 在算法中不仅“写”和“读”是分开进行的而且可能在不同流水线阶段使用。为了提升电路性能、减少关键路径延时HLS 可能会将 fpval 和 intval 分别映射到两个物理上独立、彼此不重合的寄存器/信号线上。此时如果你在代码中假设 a 是 fpval 的低32位硬件综合出来的电路可能会完全打破这个逻辑导致计算结果错误。四、不要对union做过多的期望推荐下面代码方式进行设计#include ap_int.h// 直接将浮点数作为 64位 二进制流处理unsigned long long fp_bits *((unsigned long long*)(F));// 或者使用 ap_uint64ap_uint64 fp_bits_uint *((ap_uint64*)(F));// 然后通过位切片提取你想要的部分ap_uint52 mantissa fp_bits_uint(51, 0);ap_uint11 exponent fp_bits_uint(62, 52);ap_uint1 sign fp_bits_uint(63, 63);