| name | vitis-hls-synthesis |
| description | Vitis HLS 综合助手,用于 C/C++ 到 RTL 转换。涵盖内核开发、pragma 优化、接口配置和综合报告分析。综合后实现使用 vivado-impl,时序分析使用 vivado-analysis,硬件调试使用 vivado-debug。 |
Vitis HLS 综合开发助手
此技能帮助您在 Vitis HLS 环境中高效进行 FPGA 高层次综合开发。完整语法参考请参阅 REFERENCE.md。
何时使用此技能
- 需要编写或优化 C/C++ HLS 内核代码
- 需要添加 pragma 优化指令(pipeline、unroll、dataflow、array_partition 等)
- 需要配置综合约束文件(.cfg)
- 需要运行 Vitis HLS 综合命令
- 需要分析综合报告(时序、资源、II 值)
- 需要配置接口协议(AXI4-Stream、M_AXI、s_axilite 等)
- 需要选择适当的数据类型(任意精度类型、HLS 特定类型)
- 需要优化 DDR 访问和 HBM 带宽
工作流程
1. 项目初始化
确认项目结构和目标器件,创建基础目录:
mkdir -p <project>/src <project>/tb
2. 代码开发
编写 HLS 内核代码,根据需要添加 pragma 优化指令,选择适当的数据类型和接口协议。
3. 配置文件
创建 .cfg 配置文件,指定器件、时钟、接口、优化和其他参数。
4. 运行流程
执行综合流程:
- C 仿真验证功能正确性
- C 综合生成 RTL
- C/RTL 联合仿真验证硬件功能
- 导出 IP 或 Vitis 内核
5. 报告分析
检查综合报告确认时序(WNS>0,TNS=0)、II 和资源使用满足设计要求。
快速参考
核心命令
| 任务 | 命令 |
|---|
| 环境设置 | source <Vitis_dir>/settings64.sh |
| 综合 | v++ -c --mode hls --config <config.cfg> |
| C 仿真 | vitis-run --mode hls --csim --config <config.cfg> |
| 综合 | vitis-run --mode hls --csynth --config <config.cfg> |
| 联合仿真 | vitis-run --mode hls --cosim --config <config.cfg> |
| 导出 IP | vitis-run --mode hls --package --config <config.cfg> |
常用 Pragmas
| 优化类型 | 指令示例 |
|---|
| Pipeline | #pragma HLS PIPELINE II=1 |
| Loop Unroll | #pragma HLS UNROLL factor=4 |
| Array Partition | #pragma HLS ARRAY_PARTITION variable=arr type=cyclic factor=2 |
| Dataflow | #pragma HLS DATAFLOW |
| Interface Configuration | #pragma HLS INTERFACE mode=m_axi port=mem bundle=gmem |
核心配置参数
| 参数 | 描述 |
|---|
part=<part_number> | 目标器件型号 |
clock=<ns> | 时钟周期(ns) |
flow_target=<vivado/vitis> | 目标输出类型 |
syn.top=<function_name> | 顶层函数名称 |
syn.file=<source_file> | 源文件路径 |
完整语法和参数参考请参阅 REFERENCE.md。参考实现示例可在 examples/ 目录中找到——当用户需要编码模式或最佳实践时,首先阅读这些文件。
常见场景示例
1. Pipeline 优化内核
对循环添加 pipeline 优化以实现 II=1:
void kernel(float A[32][32], float B[32][32], float C[32][32]) {
#pragma HLS INTERFACE m_axi port=A bundle=gmem
#pragma HLS INTERFACE m_axi port=B bundle=gmem
#pragma HLS INTERFACE m_axi port=C bundle=gmem
for (int i = 0; i < 32; i++) {
for (int j = 0; j < 32; j++) {
#pragma HLS PIPELINE II=1
float sum = 0;
for (int k = 0; k < 32; k++) {
sum += A[i][k] * B[k][j];
}
C[i][j] = sum;
}
}
}
2. Array Partition 优化
分区数组以改善并行访问:
#pragma HLS ARRAY_PARTITION variable=input_data type=cyclic factor=4 dim=1
#pragma HLS ARRAY_PARTITION variable=weights type=complete dim=1
3. Dataflow 任务并行
实现多阶段任务并行:
void top(hls::stream<int> &in, hls::stream<int> &out) {
#pragma HLS DATAFLOW
hls::stream<int> fifo1, fifo2;
#pragma HLS STREAM variable=fifo1 depth=16
#pragma HLS STREAM variable=fifo2 depth=16
read_image(in, fifo1);
process_image(fifo1, fifo2);
write_image(fifo2, out);
}
4. AXI4-Stream 接口
实现 AXI4-Stream 输入和输出:
#include "hls_stream.h"
void axis_process(hls::stream<ap_int<32>> &in, hls::stream<ap_int<32>> &out) {
#pragma HLS INTERFACE axis port=in
#pragma HLS INTERFACE axis port=out
#pragma HLS PIPELINE II=1
ap_int<32> data = in.read();
out.write(data);
}
5. 定点转换
转换为定点以优化性能:
#include "ap_fixed.h"
typedef ap_fixed<16, 8, AP_RND, AP_SAT> fixed_t;
fixed_t value = 1.5f;
相关技能
综合后流程
- vivado-impl:HLS 生成 IP 的布局布线优化
- vivado-analysis:时序报告分析和收敛策略
- vivado-constraints:添加顶层时序和物理约束
仿真和调试
- vivado-sim:RTL 功能和时序仿真
- vivado-debug:ILA/VIO 硬件调试配置
自动化
- vivado-tcl:HLS IP 集成和项目自动化脚本