2. Vivado HLS开发环境搭建:从安装到第一个工程
好,咱们正式开始动手了。这一章我带你走一遍Vivado HLS的环境搭建流程。说实话,很多初学者卡在这一步——不是装不上,就是License搞不定,折腾半天连个Hello World都跑不起来。我当年刚接触HLS时也踩过不少坑,今天把这些经验都分享给你。
2.1 Vivado HLS安装:版本选择与注意事项
Vivado HLS是Xilinx(现在是AMD)的工具。它集成在Vivado Design Suite里,不需要单独下载。我个人习惯用Vivado的独立安装包,这样能保证HLS和Vivado版本完全匹配。
版本选择建议:
- 2020.1 ~ 2021.2:这些版本比较稳定,我项目里用得最多
- 2022.1+:支持C++17,语法更现代,但有些旧IP可能不兼容
- 不要用2019.1之前的版本:那时候HLS的优化能力差很多,说白了就是不好用
安装步骤(以Windows为例):
- 从AMD官网下载Vivado WebPACK或Design Edition(约20-30GB)
- 运行安装程序,选择“Vivado HLx”组件
- 勾选“Vivado HLS”和“Vitis HLS”(新版本叫法不同)
- 安装路径不要有中文和空格——这是老生常谈了,但总有人犯
- 等待安装完成(约30分钟到1小时,取决于你的电脑)
2.2 License配置:别让工具卡住你
装完工具,第一件事就是配License。没有License,Vivado HLS只能跑仿真,不能综合——说白了就是只能看不能做。
License类型:
| 类型 | 适用场景 | 获取方式 |
|---|---|---|
| Node-Locked | 固定电脑使用 | 购买后绑定MAC地址 |
| Floating | 多台电脑共享 | 需要License服务器 |
| WebPACK免费版 | 小规模设计(器件限制) | 官网注册即可 |
配置步骤:
- 打开Vivado HLS,点击
Help → Obtain License - 选择
Load License,找到你的.lic文件 - 或者手动设置环境变量:
XILINXD_LICENSE_FILE指向License文件路径 - 重启Vivado HLS,检查
Help → License Status是否显示Valid
2.3 创建第一个HLS工程:从零开始
好,环境搭好了,咱们来创建第一个工程。我选一个最简单的例子:实现一个加法器。别小看它,麻雀虽小五脏俱全。
创建步骤:
- 打开Vivado HLS,点击
Create New Project - 输入工程名:
adder_hls,选择保存路径 - 添加顶层函数文件:点击
Add Files,新建一个adder.cpp - 选择顶层函数:在
Top Function里填adder - 选择器件:比如
xc7z020clg484-1(Zynq-7020) - 点击
Finish
现在,在 adder.cpp 里写入以下代码:
// adder.cpp - 一个简单的加法器
#include <ap_int.h>
typedef ap_uint<8> data_t;
data_t adder(data_t a, data_t b) {
#pragma HLS INTERFACE ap_ctrl_none port=return
#pragma HLS INTERFACE s_axilite port=a
#pragma HLS INTERFACE s_axilite port=b
data_t result = a + b;
return result;
}
这段代码里,我用了 ap_uint<8> 而不是普通的 int。为什么?因为HLS综合时,ap_int 能精确控制位宽,综合出来的硬件更小。我在项目中吃过亏——用 int 综合出来一个32位加法器,其实我只需要8位——白白浪费了资源。
写一个测试文件 adder_tb.cpp:
// adder_tb.cpp - 测试文件
#include <iostream>
#include "adder.h"
int main() {
data_t a = 10, b = 20;
data_t result = adder(a, b);
std::cout << "Result: " << (int)result << std::endl;
if (result == 30) {
std::cout << "Test Passed!" << std::endl;
return 0;
} else {
std::cout << "Test Failed!" << std::endl;
return 1;
}
}
2.4 工程结构解析:每个文件夹是干什么的
创建完工程,你会看到左侧有个 Explorer 面板。里面有几个文件夹,我一个个给你讲清楚。
| 文件夹/文件 | 作用 | 我的建议 |
|---|---|---|
src/ |
存放你的C/C++源文件 | 把顶层函数和子函数都放这里 |
tb/ |
存放测试文件(Testbench) | 每个模块都要写测试,别偷懒 |
solution1/ |
综合结果目录 | 可以创建多个solution对比优化效果 |
impl/ |
综合后的RTL代码 | 一般不用手动修改 |
report/ |
综合报告(时序、资源、延迟) | 这是你最需要关注的地方 |
solution目录里还有子目录:
syn/:综合后的Verilog/VHDL代码sim/:仿真结果report/:综合报告,包括csynth.rpt(综合报告)和export.rpt(导出报告)
solution1 里做第一次综合,然后复制一份 solution2 做优化。这样能对比前后效果,看看优化到底有没有用。
2.5 运行综合与仿真:验证你的设计
代码写好了,咱们来跑一下。点击工具栏上的绿色三角(Run C Simulation),先做C仿真。如果测试通过,你会看到控制台输出 Test Passed!。
然后点击 Solution → Run C Synthesis → Active Solution,开始综合。综合完成后,打开 report/csynth.rpt,你会看到:
- Latency:从输入到输出需要多少个时钟周期
- II (Initiation Interval):每多少个时钟周期可以接受一次新输入
- Resource Usage:用了多少LUT、FF、DSP、BRAM
对于我们的加法器,综合结果应该是:Latency = 1,II = 1,资源消耗几乎为零。嗯,这很正常——一个8位加法器能有多大?
pragma not supported,检查一下你的HLS版本。有些旧版本不支持 ap_ctrl_none 这种接口pragma。我遇到过这种情况,换成 ap_hs 就好了。
2.6 知识体系总览
这一章的内容,我用一张图给你总结一下:
这张图把这一章的内容串起来了。你想想看,从安装到创建工程,再到理解每个文件夹的作用,其实就是一个完整的流程。我建议你跟着做一遍,别光看——动手才是硬道理。
好了,环境搭好了,工程也跑通了。下一章咱们开始真正进入流水线设计——嗯,那才是HLS的精髓所在。