HLS 3.接口综合与结构体

本文介绍了HLS中结构体接口的默认处理方式和DATA PACK优化约束的使用,该约束可以提高吞吐量,但不支持嵌套结构体。当结构体包含数组且满足条件时,Vivado HLS会自动展开循环。使用DATA PACK的结构体需考虑AXI接口的字节对齐。此外,讨论了指针多次存取可能导致的问题,并推荐使用hls::stream以避免意外行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

结构体接口默认是拆分成它的成员,每个成员有单独的接口。

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相似,只不过还多了一步,把改造的数组和其他结构体的元素组合起来。

接口综合与多次存取指针

使用指针多次存取,在综合后会发生预期之外的行为。在下面例子中,指针d_i是被读4次,d_o被写2次。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值