2. Intel HLS Compiler 基础:HLS设计流程、HLS与RTL对比、HLS编译环境搭建、HLS工程创建与运行

2.1 HLS设计流程:从C/C++到硬件加速

Intel HLS Compiler 允许开发者使用 C/C++ 或 SystemC 描述算法,自动生成高质量的 RTL 代码。其核心设计流程分为五个阶段,如下图所示:

Intel HLS Compiler 设计流程 C/C++ 算法 + 编译指示 HLS 编译 调度/绑定/控制 RTL 生成 Verilog/VHDL Quartus 编译 综合/布局布线 FPGA 下载 硬件验证 迭代优化(性能/面积/功耗) 关键输入 • 组件边界定义 • 接口协议选择
核心要点: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 开发环境需要以下组件:

  1. Intel Quartus Prime Pro Edition(版本 20.3 及以上,含 Agilex 器件支持)
  2. Intel HLS Compiler(集成在 Quartus 安装包中,或单独下载)
  3. 支持的 C/C++ 编译器(GCC 或 MSVC,用于 HLS 前端解析)
  4. 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 版本匹配,正确配置环境变量。
  • 工程实践:通过命令行模式创建工程,理解编译产物与性能报告。