2. Intel HLS Compiler 基础:HLS设计流程、HLS与RTL对比、HLS编译环境搭建、HLS工程创建与运行
2.1 HLS设计流程:从C/C++到硬件加速
Intel HLS Compiler 允许开发者使用 C/C++ 或 SystemC 描述算法,自动生成高质量的 RTL 代码。其核心设计流程分为五个阶段,如下图所示:
核心要点:HLS 流程的关键在于 编译指示(pragma) 的运用。开发者通过 pragma 控制流水线、展开、数组分区等微架构决策,而 HLS 编译器负责将这些高层次约束映射为具体的硬件结构。
2.2 HLS 与 RTL 对比:优势与局限
HLS 并非要完全取代 RTL,而是在不同抽象层次上提供互补的设计方法。下表从多个维度对比两者的差异:
| 对比维度 | HLS(C/C++) | RTL(Verilog/VHDL) |
|---|---|---|
| 抽象层次 | 算法级 / 事务级(TLM) | 寄存器传输级(RTL) |
| 设计速度 | 快,适合算法探索与快速原型 | 慢,需手动管理每个时钟周期 |
| 时序控制 | 编译器自动调度,开发者通过 pragma 干预 | 完全手动控制,精确到每个时钟沿 |
| 接口灵活性 | 支持 Avalon/AXI/Stream 等标准接口 | 任意自定义接口,无抽象限制 |
| 资源优化 | 依赖编译器优化,精细控制有限 | 可极致优化,适合关键路径 |
| 调试难度 | 可在 C 级仿真调试,波形分析较抽象 | 波形级调试直观,但信号量大 |
| 适用场景 | 信号处理、图像处理、AI 推理、协议栈 | 高速接口、精确时序、低功耗控制逻辑 |
设计建议:在 Agilex 项目中,推荐采用 HLS 为主 + RTL 为辅 的策略。使用 HLS 快速实现算法核心,对性能关键或时序敏感的模块(如高速收发器接口、精确时钟管理)保留 RTL 实现,通过接口协同实现最佳平衡。
2.3 HLS 编译环境搭建
搭建 Intel HLS Compiler 开发环境需要以下组件:
- Intel Quartus Prime Pro Edition(版本 20.3 及以上,含 Agilex 器件支持)
- Intel HLS Compiler(集成在 Quartus 安装包中,或单独下载)
- 支持的 C/C++ 编译器(GCC 或 MSVC,用于 HLS 前端解析)
- ModelSim / QuestaSim(用于 RTL 协同仿真)
环境变量配置示例(Linux Bash):
# 设置 Quartus 与 HLS 环境
export QUARTUS_ROOTDIR=/opt/intelFPGA_pro/23.3/quartus
export HLS_ROOT=$QUARTUS_ROOTDIR/../hls
export PATH=$HLS_ROOT/bin:$QUARTUS_ROOTDIR/bin:$PATH
# 验证安装
i++ --version
# 预期输出:Intel(R) HLS Compiler, version 23.3.x.x
常见问题:Windows 环境下,请确保使用 Intel FPGA 命令行工具 而非标准 cmd。建议使用 Quartus 自带的 Nios II Command Shell 或 Quartus Prime Shell,以避免路径和权限问题。
2.4 HLS 工程创建与运行
Intel HLS Compiler 支持两种工程模式:命令行模式(推荐)和 GUI 模式(Quartus 集成)。以下以命令行模式为例,展示完整的工程创建与运行流程。
2.4.1 工程目录结构
my_hls_project/
├── src/
│ ├── vector_add.cpp # HLS 组件源码
│ └── vector_add.h # 头文件(接口定义)
├── tb/
│ └── test_vector_add.cpp # C 级测试平台
├── scripts/
│ └── run_hls.tcl # HLS 编译脚本
└── Makefile # 自动化构建
2.4.2 组件源码示例
// vector_add.h
#pragma once
#include <HLS/hls.h>
// 定义组件接口:使用 ihc::mm_host 映射到 Avalon-MM
component void vector_add(
ihc::mm_host<int, ihc::aspace<1>, ihc::awidth<32>> &mem_a,
ihc::mm_host<int, ihc::aspace<2>, ihc::awidth<32>> &mem_b,
ihc::mm_host<int, ihc::aspace<3>, ihc::awidth<32>> &mem_c,
int size
) {
#pragma hls_loop pipeline
for (int i = 0; i < size; ++i) {
mem_c[i] = mem_a[i] + mem_b[i];
}
}
2.4.3 编译脚本与运行命令
# run_hls.tcl
# 创建 HLS 工程
create_project -name vector_add -part Agilex7
# 添加源文件
add_source -type cpp src/vector_add.cpp
# 设置顶层组件
set_top_component vector_add
# 设置时钟频率(MHz)
set_clock_frequency 300
# 运行 HLS 编译
run_hls
# 生成 RTL 与 IP 核
generate_ip
# 退出
exit
执行编译:
# 方式一:直接使用 i++ 命令
i++ -march=Agilex7 -o vector_add_hls vector_add.cpp
# 方式二:通过 Tcl 脚本
i++ -c run_hls.tcl
2.4.4 编译输出产物
编译成功后,输出目录包含以下关键文件:
| 文件/目录 | 说明 |
|---|---|
vector_add_hls/ |
HLS 工程目录,包含编译报告 |
vector_add_hls/reports/ |
面积、时序、吞吐量报告(HTML 格式) |
vector_add_hls/ip/ |
生成的 IP 核(.qsys / .ip 文件) |
vector_add_hls/synthesis/ |
综合后的 RTL 网表(.v / .vhd) |
vector_add_hls/simulation/ |
仿真脚本与测试向量 |
性能评估:编译完成后,务必查看 report.html 中的 II(Initiation Interval) 和 Latency 指标。对于上述向量加法示例,理想情况下 II=1 表示每个时钟周期都能启动一次新的循环迭代,达到最大吞吐量。
2.5 本章小结
本章建立了 Intel HLS Compiler 的基础知识框架:
- 设计流程:从 C/C++ 到 FPGA 硬件的五阶段流水线,强调迭代优化的重要性。
- HLS vs RTL:HLS 提升设计抽象层次,RTL 保留精细控制,两者在 Agilex 项目中互补使用。
- 环境搭建:确保 Quartus Pro + HLS Compiler 版本匹配,正确配置环境变量。
- 工程实践:通过命令行模式创建工程,理解编译产物与性能报告。