结构体接口默认是拆分成它的成员,每个成员有单独的接口。
DATA_PACK优化约束用来把结构体成员打包成一个宽的向量,所有成员能被同时读写,提高了吞吐量。成员按照c代码中的顺序,第一个成员对齐低位,最后一个成员对齐高位。DATA_PACK不支持队成员是结构体的结构体打包。
DATA_PACK约束创建的唯一宽向量能够在一个时钟周期被存取。有种情况,结构体含有数组,有循环要使用这些数据并且数据能在一个周期内被存取时,Vivado HLS将自动展开循环来提高吞吐量。但可以使用config_unroll命令和 tripcount_threshold选项来控制循环的展开。如下,展开的循环数量将不超过16。
config_unroll -tripcount_threshold 16
注意:如果结构体使用DATA_PACK约束,结构体只能使用AXIM接口。
如果使用DATA_PACK的结构体要用AXI4接口去实现时,需要考虑-byte_pad选项。-byte_pad选项是用来自动把成员对齐8位。对齐有时是Xilinx IP需要的。如果一个使用DATA_PACK的AXI4接口要去被实现,你需要参考要去连接的Xilinx IP来决定是否需要对齐。
如下结构体,采用不同情况去实现。
typedef struct{
int12 A;
int18 B[4];
int6 C;
} my_data;
void foo(my_data *a )
如果结构体含有数组,可以使用ARRAY_PARITION约束去拆分数组,或者使用ARRAY_RESHAPE去拆分数组再重组被拆分元素成一个更宽的数组。DATA_ARRAY执行的操作与ARRAY_RESHAPE相似,只不过还多了一步,