Vivado HLS 优化指令详解
Vivado HLS (High-Level Synthesis) 提供了一系列优化指令(Pragmas)来指导高层次综合过程,帮助开发者优化硬件设计。以下是各类优化指令的详细说明:
文章目录
- 1. 接口优化指令
- 1.1 INTERFACE
- 1.2 RESOURCE
- 2. 循环优化指令
- 2.1 PIPELINE
- 2.2 UNROLL
- 2.3 LOOP_TRIPCOUNT
- 3. 数组优化指令
- 3.1 ARRAY_PARTITION
- 3.2 ARRAY_RESHAPE
- 4. 函数优化指令
- 4.1 INLINE
- 4.2 ALLOCATION
- 5. 数据流优化指令
- 5.1 DATAFLOW
- 5.2 STABLE
- 6. 其他优化指令
- 6.1 LATENCY
- 6.2 OCCURRENCE
- 6.3 DEPENDENCE
- 优化指令使用策略
- 注意事项
1. 接口优化指令
1.1 INTERFACE
#pragma HLS INTERFACE mode=<mode> port=<name> bundle=<name>
- 功能:指定函数端口的硬件接口协议
- 参数:
mode
:接口模式(ap_none, ap_stable, ap_vld, ap_ack, ap_hs, ap_ovld, ap_fifo, ap_memory, bram, axis等)port
:端口名称bundle
:接口分组名称
- 示例:
#pragma HLS INTERFACE mode=ap_fifo port=data_in
1.2 RESOURCE
#pragma HLS RESOURCE variable=<variable> core=<core> latency=<int>
- 功能:指定变量使用的硬件资源
- 参数:
core
:指定使用的IP核(DSP48, FIFO等)latency
:指定操作延迟
2. 循环优化指令
2.1 PIPELINE
#pragma HLS PIPELINE II=<int> enable_flush=<bool> rewind=<bool>
- 功能:对循环或函数进行流水线优化
- 参数:
II
:目标初始间隔(Initiation Interval)enable_flush
:是否启用流水线刷新rewind
:是否启用循环重绕
- 示例:
#pragma HLS PIPELINE II=2
2.2 UNROLL
#pragma HLS UNROLL factor=<N> skip_exit_check=<bool>
- 功能:展开循环以增加并行性
- 参数:
factor
:展开因子(完全展开设为0)skip_exit_check
:是否跳过退出条件检查
- 示例:
#pragma HLS UNROLL factor=4
2.3 LOOP_TRIPCOUNT
#pragma HLS LOOP_TRIPCOUNT min=<int> max=<int> avg=<int>
- 功能:指定循环迭代次数估计值(仅用于分析)
- 参数:
min
:最小迭代次数max
:最大迭代次数avg
:平均迭代次数
3. 数组优化指令
3.1 ARRAY_PARTITION
#pragma HLS ARRAY_PARTITION variable=<name> type=<type> factor=<int> dim=<int>
- 功能:对数组进行分区以提高并行访问能力
- 参数:
type
:分区类型(complete, block, cyclic)factor
:分区因子dim
:对多维数组的哪一维进行分区
- 示例:
#pragma HLS ARRAY_PARTITION variable=buff type=cyclic factor=4 dim=1
3.2 ARRAY_RESHAPE
#pragma HLS ARRAY_RESHAPE variable=<name> type=<type> factor=<int> dim=<int>
- 功能:重新组织数组结构(分区+合并)
- 参数:同ARRAY_PARTITION
4. 函数优化指令
4.1 INLINE
#pragma HLS INLINE off|recursive
- 功能:内联函数调用以减少函数调用开销
- 参数:
off
:禁用内联recursive
:递归内联
4.2 ALLOCATION
#pragma HLS ALLOCATION instances=<name> limit=<int> function
- 功能:限制特定操作的实例数量
- 参数:
instances
:操作名称limit
:最大实例数
5. 数据流优化指令
5.1 DATAFLOW
#pragma HLS DATAFLOW disable_start_propagation=<bool>
- 功能:启用任务级流水线,允许函数/循环并行执行
- 参数:
disable_start_propagation
:是否禁用启动传播
5.2 STABLE
#pragma HLS STABLE variable=<name>
- 功能:标记变量在数据流区域内是稳定的
6. 其他优化指令
6.1 LATENCY
#pragma HLS LATENCY min=<int> max=<int>
- 功能:指定操作或函数的延迟约束
6.2 OCCURRENCE
#pragma HLS OCCURRENCE cycle=<int>
- 功能:指定操作的相对调度约束
6.3 DEPENDENCE
#pragma HLS DEPENDENCE variable=<name> type=<type> direction=<dir> distance=<int>
- 功能:指定数据依赖关系以优化流水线
- 参数:
type
:依赖类型(intra/inter)direction
:依赖方向(RAW, WAR, WAW)distance
:依赖距离
优化指令使用策略
-
性能优化路径:
- 首先使用PIPELINE优化关键循环
- 然后使用UNROLL增加并行性
- 最后使用ARRAY_PARTITION解决存储瓶颈
-
资源优化路径:
- 使用ALLOCATION限制资源使用
- 使用INLINE减少函数调用开销
- 使用RESOURCE指定特定实现
-
接口优化路径:
- 使用INTERFACE指定合适的硬件接口
- 使用DATAFLOW实现任务级并行
注意事项
- 优化指令会显著影响综合结果,建议增量式添加和验证
- 某些指令可能有冲突,需要权衡使用
- 使用指令后应检查综合报告验证效果
- 过度优化可能导致时序问题或资源使用过多
通过合理组合这些优化指令,可以显著提高HLS设计的性能、资源利用率和吞吐量。