3996 字
20 分钟
怎么学HLS
2026-01-08
2026-03-30
无标签

我是怎么学HLS

本人是大二开始接触FPGA,研一研二做了两个大型的FPGA项目。一年多的HLS学习开发经验,在某信号处理系统中,采用HLS设计了核心算法,并迭代优化多版,最终满足了纯HDL设计的指标要求。

我学习HLS的用途是用于实现信号处理算法,基本都是从零手搓,只会调用FFT、FIR等硬IP,对于调图像处理等软件库缺少经验分享。

下面的教程本来是写给组内师弟师妹看的,现在稍作整理,给其他准备学习HLS的同学、工程师,指下方向,尽微薄之力。

0、前言

0.1 谁适合学习HLS

需要有半年以上的verilog编写经验的人,这里的半年不包含学习时间。

HLS并不是写C/C++实现功能,需要针对代码背后的硬件实现进行优化,做到C与硬件框架的一一映射,没有半年的verilog设计经验是缺乏这种思维的。通常优化算法占用80%往上的时间,经验充足了这个时间占比会缩短。

下图是我对某个算法,优化过程的大致示意图。保证整体趋势的前提下,我做了数值的变动,比例都是大致的。

png

0.2 vivado的版本

我的学习路线是,先用vivado2021的 vivado hls跟着UG871教程学习,后续采用vivado2024的vitis进行工程开发。

HLS是将C/C++转换成HDL语言,这个转换过程与软件背后的优化算法息息相关,而这个算法更新迭代较快,同样的代码,用2018版本的vivado hls编译出来的,与2025 版本的vitis编译出来,完全是两个结果,最新版本的比老版本快40%不止资源还更少,这都得益于算法的改变。

有很多人vivado选择老版本,比如2018.3版本,说这个版本最稳定。我对此持保留态度,至少在研究生阶段没有什么影响。

  1. 传统的HDL开发,vivado的版本无所谓,因为优化算法已经很完善了,新版本并不会带来多少好处。至于稳定性,我个人使用经验来看,都差不多,我们日常开发并不会碰到BUG,也许什么高级功能有BUG?
  2. HLS开发新的版本优化更好。
  3. 我们应该拥抱新技术,固守不变只会落后挨打。

1、学习路线

1.1 入门

1.1.1 UG871

一本动手实验手册。 它通过一系列精心设计的实验,手把手地教如何使用Vitis HLS工具。 内容从最基础的创建项目、C仿真、综合、C/RTL联合仿真,到应用PIPELINEUNROLL等核心优化指令来提升设计性能、降低资源占用的全过程。 跟着他做过一遍后,会对hls有个基础的认知,但是光有这些还不够,如果想要立马实现一个复杂的hls工程,恐怕会觉得力不从心。

主要精力放在第2、4、6、7章,这四章构成了Vitis HLS开发思想的骨架。能熟练运用Analysis Perspective分析性能瓶颈,并选择合适的优化指令(PIPELINE, UNROLL, ARRAY_PARTITION, DATAFLOW等)时候,HLS算是入门了。

AMD Technical Information Portal

1.1.2 高亚军

1.1.3 Parallel Programming for FPGAs

1.1.4 其他教程

正点等的HLS教材,不要在他们上面浪费时间。

下面这个教程还可以。这一篇对于VITIS HLS的操作和编写讲解的非常详细,并且引入了许多概念和理解。缺点是没有去vivado里面仿真。

Vitis HLS

台大的课程也还不错,不过学习过上面的内容后,这个教程就显得有些鸡肋了。

【台湾大学×BoLedu】FPGA高层次综合技术HLS于应用加速 (2022秋 赖瑾)_哔哩哔哩_bilibili

1.2、深入

1.2.1 ug1399

1.2.2 调用硬件ip

HLS设计中,是可以直接调用vivado中的硬件ip的,这极大的提高了资源利用和运行效率。“深入”阶段,只需要调用出FFT和FIR库就可以,目的是学会调用方法,等项目中用到了具体某个ip,再查询“字典”学习就可以。

image-20260108144154714

1.2.3 Parallel Programming for FPGAs

学习第三章之外的章节,并不一定要去跟着实现算法,重点学习教程中的设计思想,如果把算法转换成HLS代码,同时通过指令和修改C/C++写法,尽可能的利于硬件实现,优化硬件并行性。

1.3、其他

1.3.1 ai辅助

ai的发展迅速,我们不能一直守旧,用“古法编程”的方式开发程序。HLS是一个将C/C++转换成硬件描述语言的一个工具,大模型编写HDL不方便,但是编写C/C++这一样的高级语言信手拈来,因此HLS是ai大模型与FPGA硬件开发的不错切入口。

我们开发HLS项目的过程中,一定要用好ai,既不能抗拒使用它,无视时代的进步;也不能过分依赖他,目前AI大模型对硬件的理解仍然有限,对于需要深度优化的设计,仍然需要人去优化实现。实际开发过程中,实现功能其实用不了多久,优化算法会占用80%往上的时间。

如果未来AI发展的足够好了,也许AI->HLS->HDL是不错的路子,甚至直接淘汰掉HLS这一环,AI->HDL。不过当前AI的能力(claude4)是不足的。写出来能用,但也只是能用了,要是优化资源和时序问题,那么维护起来就是火葬场,经常用AI并且尝试去优化维护的同学一定深有体会。

1.3.2 创新点与毕业

能做HLS的师弟师妹(应该没有师妹)是非常幸运的,这个方向非常好出创新点,HLS是一个实现工具,用于实现算法,我们可以在算法上进行创新,并用HLS快速验证实现;也可以对于复杂、HDL不便于实现的算法,进行硬件实现,很多前人因为HDL设计复杂没有做过,你实现了,甚至是提出一种不错的HLS实现框架,这都是未来毕业论文的闪光点。

必须要提醒一点,HLS在学生秋招中,认可度不高。等你学习后会发现,这个技术如果投入生产,确实鸡肋,只能用于定制化和快速验证的场景。

笔者曾投递的论文,就是算子创新+HLS验证。

1.3.3 学习时间

UG871:约 48 - 66 小时

第一部分:HLS基础与核心优化 (建议学习重点)

这部分是掌握HLS思想和技术的基石,建议投入最主要的精力。

章节主要内容预估学习时间关键学习目标与注意事项
Ch 2: HLS IntroductionHLS设计全流程入门5 - 6 小时目标: 跑通第一个完整的HLS项目,建立宏观认识。
Lab 1: 必须掌握!从创建项目到C仿真、综合、C/RTL联合仿真、导出IP的每一步都要亲手操作。
Lab 2: Tcl脚本是自动化和可复现设计的关键,理解即可。
Lab 3: 核心! 首次接触“解决方案(Solution)”和优化指令,要仔细对比不同Solution带来的性能和资源差异。
Ch 3: C ValidationC代码验证与调试3 - 4 小时目标: 掌握如何编写一个好的自验证测试平台(Testbench),并学会使用HLS的C调试器。
Lab 1: 重点理解一个好的Testbench为何能自动化后续的RTL验证。
Lab 2 & 3: 了解对任意精度数据类型的调试方法。注意C++的ap_int类型比C的ap_cint更易于调试。
Ch 4: Interface Synthesis接口综合8 - 10 小时目标: 理解HLS如何将C函数参数映射为硬件端口,这是将HLS模块集成到系统中的关键。
Lab 1 & 2: 掌握块级协议(ap_ctrl_hs)和端口级协议(ap_vld, ap_ack)。
Lab 3: 核心! 重点学习如何将数组映射为RAM和FIFO接口,以及ARRAY_PARTITION指令如何将一个RAM接口拆分为多个,以提高并行访问能力。
Lab 4: AXI接口是与处理器和DMA交互的标准,必须掌握。
Ch 5: Arbitrary Precision Types任意精度数据类型2 - 3 小时目标: 理解使用ap_intap_fixed代替标准C类型对节省硬件资源的巨大好处。
关键: 对比Lab1(float)和Lab2(ap_fixed)的综合报告,直观感受资源(特别是DSP)的大幅减少。
Ch 6: Design Analysis设计分析6 - 8 小时目标: 本手册最核心的章节之一! 学会使用Analysis Perspective来分析性能瓶颈。
方法: 这是一个连贯的长实验,请务必耐心完成每一步。学会看懂Schedule Viewer,找出导致延迟(Latency)和启动间隔(Interval)过长的原因,例如数据依赖、内存端口瓶颈等。
Ch 7: Design Optimization设计优化5 - 7 小时目标: 本手册最核心的章节之二! 将第6章学到的分析技能应用于实际优化。
Lab 1: 重点理解循环依赖(Loop Dependencies)和资源瓶颈是如何限制流水线性能的,以及如何用ARRAY_RESHAPE等指令解决。对比函数流水线循环流水线的优劣。
Lab 2: 领悟一个重要思想:有时工具的优化是有限的,必须通过修改C代码结构来解锁更高性能。
Ch 8: RTL VerificationRTL验证3 - 4 小时目标: 学会如何使用C/RTL联合仿真来验证硬件设计的正确性,并生成波形文件进行调试。
Lab 1: 再次强调自验证Testbench的重要性。
Lab 2 & 3: 掌握生成波形文件并在Vivado或第三方仿真工具中查看的方法,这是调试硬件行为的必备技能。

第二部分:系统级集成与应用 (建议根据需求选学)

这部分内容涉及将HLS IP集成到更复杂的系统中,需要学生具备一定的Vivado和嵌入式系统基础。

章节主要内容预估学习时间关键学习目标与注意事项
Ch 9: Using HLS IP in IP Integrator在Vivado IPI中集成HLS IP4 - 6 小时前提: 需要对Vivado的IP Integrator有基本了解。
目标: 学会将HLS生成的IP核与其他的Xilinx IP(如FFT)连接起来,构建一个简单的IP子系统。
Ch 10: Using HLS IP in a Zynq SoC Design在Zynq SoC中集成HLS IP10 - 15 小时前提: 需要嵌入式系统基础,了解Zynq架构(PS+PL),并最好有实体开发板。
目标: 掌握软硬件协同设计的完整流程。
Lab 1: 学习通过AXI-Lite接口,让CPU(软件)来控制HLS模块(硬件)。
Lab 2: 学习通过AXI-StreamDMA,实现CPU内存与HLS模块之间的高速数据流传输,这是性能加速的关键。
Ch 11: Using HLS IP in System Generator在System Generator中集成HLS IP2 - 3 小时前提: 需要有Matlab/Simulink和System Generator使用经验。
目标: 了解HLS IP在DSP设计流程中的应用。对于非DSP方向的学生,此章节可以选学或跳过

《Parallel Programming for FPGAs》前三章:约 15 - 19 小时

章节主要内容 (根据中文版目录)预估学习时间关键学习目标与实践关联
第1章: FPGA并行计算思想介绍FPGA与CPU/GPU的根本区别,引入空间计算、延迟(Latency)和吞吐率(Throughput)等核心概念。3 - 4 小时学习目标: 从根本上转变思维,从习惯的CPU“时间串行”思维,切换到FPGA的“空间并行”思维。
实践关联: 这是理解HLS所有性能报告的基础。当你在UG871的报告中看到LatencyInterval这两个指标时,本章会告诉你它们在硬件层面的真正含义。你会明白,HLS优化的核心目标,往往是牺牲一定的初始延迟(Latency),来换取极致的吞-吐率(通过降低Interval)
第2章: Vitis HLS入门宏观介绍HLS的设计流程,包括C代码、测试平台(Testbench)、综合、验证和IP导出。4 - 5 小时学习目标: 系统化地理解HLS工具的工作流程,将UG871中的零散操作串联成一个完整的理论框架。
实践关联: 如果说UG871的第2章是带你“走了一遍流程”,那么本书的第2章就是给你一张“流程地图”,并告诉你每个站点(C仿真、综合、C/RTL联仿)的意义和目的。特别是对Testbench的重要性的论述,会让你更加深刻地理解为什么一个好的测试平台是HLS项目的生命线。
第3章: 程序优化方法本书前三章的精华所在! 详细讲解HLS最核心的几大优化技术背后的硬件原理。8 - 10 小时学习目标: 彻底搞懂PIPELINE, DATAFLOW, ARRAY_PARTITION等关键优化指令为什么能起作用。
实践关联: 这是你从“会用工具”到“懂工具”的飞跃。
函数和循环流水(Pipelining): 读完这部分,你会明白UG871中加入PIPELINE指令后,Schedule Viewer里那些操作是如何被重叠调度到不同时钟周期,从而实现II=1的。
任务级流水线 (Dataflow): 这会解释UG871第6章DCT案例中,为什么最后使用DATAFLOW优化,能让read_data, dct_2d, write_data这几个函数像工厂流水线一样并行工作,从而大幅降低整体Interval
数组划分 (Array Partitioning): 这是另一个核心。你会理解为什么默认情况下数组会被综合成Block RAM,而BRAM的端口数量有限(通常是2个),这会成为并行处理的瓶-颈。ARRAY_PARTITION指令就是打破这个瓶颈,将一个BRAM拆成多个小RAM或大量寄存器,提供更多的并行访问端口。这完美解释了UG871第7章矩阵乘法中遇到的性能问题和解决方法。

后记

我把需要的文档材料都整理好,放在了公众号:四臂西瓜。后台回复:hls学习路线

怎么学HLS
/posts/怎么学hls/
作者
唐承乾
发布于
2026-01-08
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

Personal Site
唐承乾
Profile Image of the Author
技术笔记、长期专题与电子书草稿

嵌入式 & AI 工作流。螺旋式学习,把踩过的坑整理成以后还能复用的东西。

GitHub 知乎
CSDN