在FPGA开发中,使用C++结合HLS工具可以将高层级代码转换为硬件描述语言,再通过RTL协同仿真验证转换后的逻辑是否符合预期。搭建这样的协同设计环境需要完成工具安装、项目配置、仿真流程设置等多个步骤。

环境准备
首先需要安装Xilinx Vivado和Vitis HLS工具,这两个工具是完成HLS转换和协同仿真的核心依赖。安装时选择完整安装模式,确保包含HLS、仿真器和RTL相关组件。同时需要安装C++编译环境,Windows系统可以安装MinGW,Linux系统可以直接使用系统自带的GCC工具链。
工具版本选择
建议选择Vivado 2022.1及以上版本,这些版本对C++标准的支持更完善,HLS转换的优化能力更强,协同仿真的兼容性也更好。安装完成后需要设置环境变量,将工具的bin目录添加到系统的PATH变量中,方便后续在命令行调用相关工具。
创建HLS项目
打开Vitis HLS,新建一个项目,设置项目名称和存储路径。在项目配置中,选择目标FPGA器件型号,这个型号需要和后续RTL仿真使用的器件保持一致。然后添加C++源文件,也就是需要转换为硬件逻辑的顶层函数代码。
以下是一个简单的C++加法函数示例,作为HLS转换的顶层模块:
#include <ap_int.h>
// 顶层加法函数,使用HLS可综合的数据类型
void add_func(ap_int<32> a, ap_int<32> b, ap_int<32>* res) {
#pragma HLS INTERFACE ap_ctrl_none port=return
#pragma HLS INTERFACE s_axilite port=a
#pragma HLS INTERFACE s_axilite port=b
#pragma HLS INTERFACE s_axilite port=res
*res = a + b;
}
配置HLS综合选项
在项目的Solution设置中,配置综合目标时钟频率,一般设置为10ns左右,根据目标FPGA的性能调整。同时可以开启优化选项,比如循环展开、流水线优化等,提升生成硬件逻辑的性能。配置完成后点击Run C Synthesis,执行HLS综合,生成对应的RTL代码。
RTL协同仿真配置
HLS综合完成后,需要配置RTL协同仿真,验证生成的RTL逻辑和原始C++代码的功能一致性。在Vitis HLS中切换到RTL Simulation选项卡,选择仿真工具为Vivado Simulator,也可以选择ModelSim等第三方仿真器。
需要准备C++测试平台代码,用于给顶层函数输入测试数据,验证输出结果。测试平台代码不需要可综合,只需要能正常调用顶层函数即可:
#include <iostream>
#include "add_func.h"
int main() {
ap_int<32> a = 10;
ap_int<32> b = 20;
ap_int<32> res;
// 调用顶层函数
add_func(a, b, &res);
// 验证结果
if (res == 30) {
std::cout << "Test passed!" << std::endl;
return 0;
} else {
std::cout << "Test failed! res = " << res << std::endl;
return 1;
}
}
执行协同仿真
点击Run RTL Simulation按钮,工具会自动将HLS生成的RTL代码和测试平台关联,执行仿真过程。仿真完成后会输出仿真结果,如果测试通过,说明HLS转换后的RTL逻辑功能和原始C++代码一致。如果测试失败,可以查看仿真波形,定位逻辑错误,回到C++代码修改后重新综合仿真。
常见问题解决
- 如果HLS综合时报错,检查C++代码是否使用了不可综合的语法,比如动态内存分配、文件操作等,这些语法无法转换为硬件逻辑。
- 协同仿真时如果找不到RTL文件,检查HLS综合是否成功生成了RTL代码,默认生成的RTL文件存放在项目的solution1/impl/verilog目录下。
- 仿真结果不一致时,可以先执行C仿真,验证测试平台和原始C++代码的逻辑是否正确,再排查HLS综合的优化选项是否影响了功能。
环境验证
完成上述配置和仿真后,可以尝试修改C++顶层函数的逻辑,比如改为减法运算,重新执行HLS综合和RTL协同仿真,验证环境是否能正常支持功能迭代。如果整个流程都能顺利执行,说明C++的FPGA协同设计环境已经配置完成,可以开展后续的开发工作。