
Vitis HLS
文章平均质量分 89
记录Vitis HLS相关学习笔记和实用示例
hi94
探索智能硬件发展,拥抱AI改变未来
展开
-
Vitis HLS 学习笔记--块级控制(IDE 2024.1 + 执行模式 + 默认接口实现)
本文总结 HLS 块级控制协议,包括以下内容:执行模式(重叠模式;顺序模式;自动重启模式)接口范式(存储器;串流;寄存器)对比 Vitis Kernel Flow 与 Vivado IP Flow 示例了解 Wave Viewer 中的波形原创 2025-03-31 21:29:23 · 1094 阅读 · 4 评论 -
Vitis HLS 学习笔记--块级控制(示例:Stream Chain Matrix Multiplication)
这个内核的核心功能是通过使用数据流和级联矩阵乘法来提高性能。它利用了 ap_ctrl_chain 协议,这允许内核在当前操作完成后立即开始下一个操作,从而实现了更高的并行性和效率。内核包含两个版本:简单的 krnl_simple_mmult 和链式的 krnl_chain_mmult。简单版本使用 ap_ctrl_hs 协议,而链式版本使用 ap_ctrl_chain 协议,后者提供了额外的控制信号来管理内核操作的流程。原创 2024-06-18 18:28:58 · 1344 阅读 · 0 评论 -
Vitis HLS 学习笔记--函数例化(Function Instantiation)
函数例化是Vitis HLS中的一种高级优化技术,它允许开发者在保持函数层次结构的同时,对特定函数实例进行局部优化。这种技术通过利用编译时已知的常量输入参数,简化函数的控制逻辑,从而可能改善延迟和吞吐量。默认情况下,函数在RTL中作为独立层级块保留,或者分解到更高层次的函数中,所有实例共享单一RTL实现。通过使用FUNCTION_INSTANTIATE编译指示,可以为每个函数调用创建唯一的RTL实现,允许针对每个实例进行局部最优化。原创 2024-06-17 23:39:07 · 1344 阅读 · 0 评论 -
Vitis HLS 学习笔记--添加 RTL 黑盒函数
Vitis HLS 工具通过集成 Verilog RTL IP 到 C/C++ HLS 项目中,简化了硬件设计过程。RTL 黑盒技术允许设计者在特定区域内使用已有的 Verilog 或 VHDL 编写的 RTL 模块,从而重用优化好的硬件模块,避免重新实现,提高设计效率和可靠性。使用 Vitis HLS 时,设计者需要编写 RTL 函数签名、创建黑盒 JSON 描述文件并包含 RTL IP 文件。在 Vitis HLS 中添加这些文件后,运行仿真和综合步骤即可完成集成。原创 2024-06-14 23:54:59 · 897 阅读 · 0 评论 -
Vitis HLS 学习笔记--Vitis Accelerated Libraries介绍
Vitis Accelerated Libraries为开发者提供了一套丰富的、经过优化的开源库,旨在通过FPGA和其他硬件加速技术显著提高各种应用程序的性能。这些库覆盖了广泛的领域,包括但不限于线性代数、数字信号处理、图像处理、数据分析、数据压缩、数据库管理以及金融计算等。通过将这些高级库分为三个层级:L1原始函数、L2内核函数和L3软件API,Vitis库确保了不同技能水平的开发者都能找到合适的工具来优化他们的应用程序。原创 2024-06-13 23:45:52 · 2198 阅读 · 0 评论 -
Vitis HLS 学习笔记--变量存储(移除内存分配malloc)
Vitis HLS不支持动态创建或删除C/C++对象,因此开发者必须寻找替代方案。本文通过一个例子展示了如何在不定义USE_MALLOC的情况下,使用栈内存代替堆内存进行内存分配。示例中的函数example通过两个循环处理输入数组,使用栈上的局部变量而非malloc分配的内存,从而在编译时确定内存大小,这对硬件合成至关重要。原创 2024-06-12 23:35:35 · 1479 阅读 · 0 评论 -
Vitis HLS 学习笔记--数据类型(矢量 hls::vector)
在 Vitis HLS 中,矢量数据类型提供了一种高效的数据处理方式,允许开发者利用 SIMD 操作一次性处理多个数据元素。通过使用 hls::vector,开发者可以创建一个由 N 个类型为 T 的元素组成的矢量。这种数据结构在内存中连续存储,且当元素类型和数量都是 2 的幂时,对齐到其总大小,可以实现最优的内存访问效率。原创 2024-06-11 23:37:05 · 1164 阅读 · 1 评论 -
Vitis HLS 学习笔记--循环(当边界包含变量时)
在硬件设计中,固定的循环迭代次数对于资源分配和时序分析至关重要。Vitis HLS 在处理包含变量边界的循环时面临挑战,因为这限制了某些优化操作的执行。通过使用 LOOP_TRIPCOUNT 指令指定迭代次数的范围,可以帮助工具更好地进行时延分析。此外,将循环重写为固定次数的迭代,同时在循环体内部使用条件语句来控制执行,可以满足硬件设计的需求,允许循环展开和流水线化,从而提高性能。这些方法为变量边界循环提供了有效的解决方案,使得即使在变量驱动的情况下,也能实现硬件设计的优化。原创 2024-06-09 23:54:18 · 1006 阅读 · 0 评论 -
Vitis HLS 学习笔记--变量存储(数据对齐、结构充填)
在现代计算机系统中,数据对齐和结构填充是确保数据存储和访问效率的关键因素。数据对齐涉及将数据按照处理器优化的边界排列,以加快访问速度。结构填充则是在数据结构中插入额外空间,以保持成员变量的正确对齐。这些概念在硬件设计中尤为重要,因为 FPGA 和其他硬件加速器对数据布局的要求更为严格。Vitis HLS 等工具允许开发者自定义对齐和填充规则,以优化软件与硬件之间的数据交互,从而提升整体性能。理解并应用这些原则,可以帮助开发者在存储器要求和性能之间找到最佳平衡点。原创 2024-06-08 23:37:27 · 1304 阅读 · 0 评论 -
Vitis HLS 学习笔记--MAXI(位宽拓展)
在Vitis工具流程中,Vitis HLS可以通过自动调整m_axi接口端口宽度至512位来提高突发访问能力。这种自动端口扩展仅适用于标准C语言数据类型,不支持聚合类型。为了在Vivado IP流程中启用这一功能,必须显式设置config_interface命令。设置m_axi_max_widen_bitwidth和m_axi_alignment_byte_size可以指定接口的最大位宽和对齐字节数。代码实例展示了如何通过HLS指令配置接口和内存映射,以优化性能。原创 2024-06-07 23:32:21 · 1420 阅读 · 0 评论 -
Vitis HLS 学习笔记--MAXI(聚合与解聚)
在 Vitis HLS 设计中,使用 #pragma HLS aggregate 指令可以将结构体中的元素聚合成一个整体,这样可以作为一个单元一起处理。这种聚合默认是按照4字节对齐,但也可以通过指定 compact 参数来改变对齐方式。例如,compact=bit 会按位级对齐,而 compact=byte 则按字节级对齐。在 Vivado IP Flow 中,默认对齐是1字节,而在 Vitis Kernel Flow 中是4字节。聚合可以优化数据传输和存储,但可能需要位填充以保持对齐。原创 2024-06-06 20:15:00 · 1156 阅读 · 0 评论 -
Vitis HLS 学习笔记--初始化与复位(静态整列:RAM/ROM)
在本文中,我们探讨了静态阵列在Vitis HLS中的初始化和复位问题,特别是与全局阵列RAM相比,静态RAM的不同之处。我们了解到静态阵列可以映射到BRAM、URAM或LUTRAM,并且可以通过特定的HLS指令进行初始化和重置。在无reset情形下,静态变量存储器的值不受reset信号影响,而在含reset情形下,存储器的值会在reset信号有效时恢复到初始状态。此外,我们还讨论了静态ROM的实现,它是只读的,通常使用BRAM或LUTRAM实现,但不能使用URAM。原创 2024-06-05 23:49:51 · 1861 阅读 · 0 评论 -
Vitis HLS 学习笔记--初始化与复位(块级控制:阵列、实参)
本文讨论了初始化和复位在硬件设计中的不同方面。阵列的初始化是在编译时或上电时为变量赋予初始值,而复位是在运行时将变量恢复到其初始状态。控制的初始化和复位也是关键,通过复位信号可以在 kernel 端口添加复位行为。对于阵列,使用 static 限定符的存储器可以实现默认初始化行为,避免运算开销。此外,BRAM 和 URAM 的启动和重置方式也需要根据硬件平台进行考虑。原创 2024-06-04 23:51:58 · 1244 阅读 · 0 评论 -
Vitis HLS 学习笔记--初始化与复位(global_array_RAM)
在本文中,我们探讨了如何在Vitis HLS中处理FPGA的全局数组映射和初始化问题。通过示例代码,我们了解了如何将C++数组映射到不同类型的RAM,并使用#pragma HLS BIND_STORAGE指令来指定存储实现。我们还讨论了URAM的使用限制和手动数据打包的解决方案。最后,我们比较了两种解决方案:一种是不使用复位指令的solution_A,另一种是使用复位指令的solution_B。solution_B通过ROM和RAM的结合,提供了一种在复位信号激活时能够将数组恢复到初始状态的方法。原创 2024-06-03 23:38:02 · 1671 阅读 · 0 评论 -
Vitis HLS 学习笔记--循环(对比三种流水线类型STP、FLP、FRP)
在Vitis HLS中,流水线设计对于硬件性能至关重要。停滞的流水线(STP)在数据可用时持续执行,但可能导致死锁和时序问题。可刷新的流水线(FLP)则在没有新输入时停止读取,但会继续处理,避免了死锁,但可能需要更大的迭代间隔(II)。自由运行的流水线(FRP)提供了一种高效的解决方案,它通过减少扇出和简化控制逻辑来改善时序,同时允许流水线在无效数据传输时自我清理。尽管FRP增加了资源使用并可能引入延迟,但它的结构有利于布局和布线,减少了连线长度和复杂性。原创 2024-06-02 23:25:27 · 1423 阅读 · 0 评论 -
Vitis HLS 学习笔记--循环(FRP 自由运行流水线)
FRP自由运行流水线是一种高效的硬件架构风格,它通过持续运行来优化性能,即使在没有新的输入数据时也不会停滞。这种设计简化了控制逻辑,减少了资源使用,并提高了时序性能。然而,FRP流水线也有其局限性,如不支持MAXI接口,且在某些情况下可能导致死锁。原创 2024-06-01 23:48:38 · 806 阅读 · 0 评论 -
Vitis HLS 学习笔记--TLP(混合编程:控制驱动+数据驱动)
在Vitis HLS中,控制驱动(Control-driven)和数据驱动(Data-driven)的并行性是高效硬件设计的两个关键组成部分。控制驱动并行性通过#pragma HLS dataflow指令实现,允许不同函数在数据准备好时即刻并行执行,从而优化整体性能。数据驱动并行性则通过hls::task类实现,它将函数封装为可并行执行的任务。这两种技术的结合,使得设计者能够充分利用硬件资源,实现复杂算法的高效执行。原创 2024-05-31 23:37:03 · 851 阅读 · 0 评论 -
Vitis HLS 学习笔记--变量存储(通道的FIFO/PIPO选择)
本文通过调整 Vitis HLS 编译器的默认设置,选择FIFO或者PIPO作为通道缓存。PIPO 缓冲器可以自动调节,确保任务之间的重叠执行,而不会出现死锁。而显式手动串流的 FIFO 通道虽然可以更快地开始重叠执行,但需要小心调整队列大小,以避免死锁问题。原创 2024-05-30 23:25:39 · 1284 阅读 · 0 评论 -
Vitis HLS 学习笔记--块级控制(ap_ctrl_chain、ap_ctrl_hs、ap_ctrl_none)
当设计硬件模块时,块级控制协议是至关重要的组成部分。这些协议允许模块同步和控制其操作流程,包括何时开始处理数据、何时完成数据处理以及何时处于空闲状态准备接受新的数据输入。其中,ap_ctrl_chain 和 ap_ctrl_hs 协议用于控制驱动的TLP,可以用于顺序执行和流水线执行。而 ap_ctrl_none 协议适用于数据驱动的TLP,它不包含握手信号,完全由数据可用性来驱动模块操作。原创 2024-05-28 23:27:40 · 1421 阅读 · 0 评论 -
Vitis HLS 学习笔记--TLP(控制驱动/数据流模型/Dataflow视图)
Dataflow视图是一种强大的性能分析工具,通过展示数据流结构和通道信息,帮助用户深入了解设计的性能特征。其功能包括源代码浏览、进程和通道详细表、自动交叉探测等,为设计调试提供了有力支持。与流水线优化相比,数据流优化更注重动态性和并行性,能够根据输入数据的可用性灵活调度执行顺序,提升系统性能。然而,需要注意的是,在未执行RTL协同仿真前,数据流视图可能缺乏关键性能数据,需添加DATAFLOW编译指令以补充信息。 Dataflow视图的应用有助于设计优化和性能调试,提升系统的整体效率与性能。原创 2024-05-23 22:12:40 · 1632 阅读 · 0 评论 -
Vitis HLS 学习笔记--TLP(控制驱动:处理死锁deadlock)
在数据流优化中,通道类型、握手机制、FIFO大小和死锁避免都是关键因素。通过Dataflow查看器和协同仿真数据,您可以有效地优化设计,提高性能并避免潜在问题。原创 2024-05-22 23:10:49 · 1654 阅读 · 0 评论 -
Vitis HLS 学习笔记--TLP(示例:控制驱动TLP)
本文对《Vitis HLS 学习笔记--抽象并行编程模型-控制驱动与数据驱动-CSDN博客》中的控制驱动任务示例进行了详细解析,重点分析了 kernel 代码的并行处理机制及各模块的实现。通过查看综合报告、Schedule Viewer 和 Dataflow Viewer,确认了 funcB 和 funcC 的并行执行和 vecOut 的 FIFO 设置。并介绍了 Vitis IDE 的关键设置,包括数据文件加载、Flow Target 配置及 FIFO 深度调整。原创 2024-05-21 23:17:47 · 1551 阅读 · 0 评论 -
Vitis HLS 学习笔记--TLP(控制驱动 vs 数据驱动)
任务级并行度(TLP)通过同时执行多个任务提升应用效率和性能。Vitis HLS 提供了数据驱动和控制驱动两种 TLP 模型。数据驱动模型像自动化流水线,适用于无外部存储器交互且函数间无数据依赖的应用;控制驱动模型则更像一个指挥官,适合不同部分需相互通信的应用。数据驱动模型中,任务通过 hls::task 声明,通道通过 hls::stream 模拟,注意避免死锁。控制驱动模型使用 C++ 顺序语义创建并行处理流水线,任务级并行执行函数,需使用 DATAFLOW 编译指示。两者结合,实现高效并行计算。原创 2024-05-20 23:30:51 · 1615 阅读 · 0 评论 -
Vitis HLS 学习笔记--TLP(不良编程例子)
本文讨论了数据流水线中常见的三种绕过问题:输入绕过、中间绕过和输出绕过,导致性能下降。通过优化,绕过问题得以解决,提升了流水线性能。分别优化了三个示例:输入绕过:将两个独立的函数调用合并,使数据流更紧凑。中间绕过:重新组织数据流,减少不必要的传递,简化路径。输出绕过:改进输出处理,确保每个数据都被正确处理和传递。这些优化措施有助于减少延迟,提高数据处理效率,增强整体性能。原创 2024-05-19 23:50:11 · 828 阅读 · 0 评论 -
Vitis HLS 学习笔记--TLP(概述:抽象并行编程模型)
HLS工具通过识别代码中可并行执行部分来加速硬件性能,但软件常见技巧如动态内存分配在硬件中难以应用,增加了转换难度。高效FPGA软件开发需掌握并行处理原则,包括任务集合与通道机制。任务通过控制或数据驱动,在本地存储器和I/O端口支持下执行。通道提供阻塞和非阻塞语义以保证数据传输的可靠性,但需注意阻塞可能导致死锁,非阻塞可能导致数据丢失。这些原理是编写高效FPGA代码的关键。原创 2024-05-18 22:53:31 · 951 阅读 · 0 评论 -
Vitis HLS 学习笔记--变量存储(避免使用多重访问指针、理解volatile)
虽然 Vitis HLS 在指针上支持多重访问指针,但强烈建议使用 hls::stream 类替代多重访问指针来实现所需的行为,以避免陷入困难。如果设计使用接口上的顶层函数的实参列表中的指针,那么在使用指针执行多重访问时需考量一些特殊注意事项。当任一指针以相同方式多次执行读取或写入时,就会发生多重访问。原创 2024-05-17 16:36:44 · 1066 阅读 · 0 评论 -
Vitis HLS 学习笔记--变量存储(基本指针和算术指针)
在Vitis HLS中,指针的使用与传统的C/C++环境存在显著差异,尤其是在涉及硬件综合时。基本指针可以直接指向数据,并且通常不会对硬件综合产生负面影响,但在顶层函数的接口中使用时需要注意指针的实现方式。另一方面,算术指针的灵活性在软件编程中很有用,但在硬件设计中可能引入问题,因为硬件需要按照固定顺序访问数据。为了克服这些问题,可以通过使用数组和RAM接口来替代指针,以更好地满足硬件设计的需求。总之,在进行Vitis HLS设计时,需要仔细考虑指针的使用方式,以确保最终的硬件实现符合设计要求。原创 2024-05-16 23:48:02 · 1330 阅读 · 0 评论 -
Vitis HLS 学习笔记--变量存储(优化本地存储器访问瓶颈)
通过对原始代码进行优化,成功地改善了内存访问模式,提高了循环执行效率。优化后的代码减少了存储器访问次数,优化了数据重用,以及改进了迭代间隔,使得每个时钟周期都可以开始一个新的迭代。这些优化措施有效地减少了存储器访问延迟,提高了硬件执行效率。优化后的代码在性能和效率上都有了显著的提升,更适用于高性能处理应用场景。原创 2024-05-16 15:00:30 · 1089 阅读 · 0 评论 -
Vitis HLS 学习笔记--变量存储(资源绑定:使用URAM)2
通过本文深入探讨了在Vitis HLS环境下设计的存储器模型的内部机制。通过分析生成的RTL代码和IMPL报告,我们了解到该存储器模型利用URAM实现,具有读写功能,并且限制了级联深度为1。特别地,我们注意到存储器的初始化操作在Vitis HLS中被转化为硬件实现的一部分,这为预加载存储器内容提供了便利。总的来说,本文为使用Vitis HLS设计存储器提供了实用的指导,加深了对存储器设计原理的理解。原创 2024-05-15 23:53:21 · 1557 阅读 · 0 评论 -
Vitis HLS 学习笔记--变量存储(资源绑定:使用URAM)1
本文提供了对使用 URAM 进行高性能内存解决方案设计的全面理解,详细介绍了在 Vivado IP 流程中使用 AP_Memory 进行与存储器资源通信的方法,并介绍了使用 UltraRAM(URAM)的优势和意义。通过代码解析,展示了在 Vitis HLS 环境中设计的一个简单存储器模型。原创 2024-05-14 23:33:28 · 1494 阅读 · 0 评论 -
Vitis HLS 学习笔记--hls::stream(理解串流:do-while)2
针对《Vitis HLS 学习笔记--理解串流Stream(2)-CSDN博客》博文的内容,做进一步说明。原创 2024-05-10 23:52:20 · 1038 阅读 · 0 评论 -
Vitis HLS 学习笔记--hls::stream(理解串流:do-while)1
在硬件中可以被设计为连续处理数据的模块,尽管其代码表面上看只处理一次数据。重要的是要理解硬件设计和软件逻辑之间的差异:硬件模块可以被设计为重复触发,以连续处理数据流,而不仅仅是单个数据项。原创 2024-05-09 23:37:49 · 1486 阅读 · 0 评论 -
Vitis HLS 学习笔记--hls::stream(理解串流:基础)
在Vitis HLS中,hls::stream是一个关键的数据结构,用于处理数据流。它类似于C++标准库中的std::stream,但专门设计用于硬件描述语言。hls::stream具有类似无限深度的FIFO的行为,支持顺序读写操作,并可灵活定义数据类型和FIFO深度。通过示例代码和综合报告,我们了解到hls::stream在硬件设计中的重要作用,以及如何根据需求配置不同的接口实现。这使得在设计硬件加速器时更加灵活、可控。原创 2024-05-07 23:49:57 · 1545 阅读 · 0 评论 -
Vitis HLS 学习笔记--hls::stream(示例:STREAM_TO_MASTER、信号TKEEP/TSTRB)
本文详细介绍了如何利用 Vitis HLS 工具将 AXI Stream 格式的数据流转换为并行存储数据,并通过 AXI Master 接口写入到存储器中。通过示例代码和编译器指令的解释,读者可以了解到 AXI Stream 接口和 AXI Master 接口的特点以及在 FPGA 设计中的应用。同时,本文还分析了示例中各个函数的功能和参数,以及综合报告中的重要信息。原创 2024-05-06 23:47:59 · 1420 阅读 · 0 评论 -
Vitis HLS 学习笔记--循环(流水线基本用法)
本文介绍了使用pipeline进行硬件优化的基本方法,并通过示例展示了不同优化方式的性能影响。针对累加计算函数,我们通过内外层循环的pipeline优化和数组访问优化,显著提高了时序性能,从405个周期降至3个周期。这些优化方法可有效应用于其他硬件设计中,提高性能和效率。原创 2024-05-04 23:55:56 · 1447 阅读 · 0 评论 -
Vitis HLS 学习笔记--循环(HLS眼中的完美循环嵌套形式)
本文介绍了在处理嵌套循环时的重要性以及创建完美嵌套循环的关键原则。优化循环结构对于硬件描述和高级综合中的性能至关重要,其中完美循环嵌套的设计能够最大程度地利用硬件资源和并行计算能力,提高性能并降低时延。通过确保最内层循环包含所有计算、循环边界为常量以及没有循环间的逻辑依赖,可以实现这一目标。在HLS工具中,利用指令如#pragma HLS UNROLL和#pragma HLS PIPELINE可以进一步优化循环结构。原创 2024-05-03 23:41:50 · 1772 阅读 · 0 评论 -
Vitis HLS 学习笔记--MAXI(突发传输:手动控制)
这篇文章探讨了在《Vitis HLS 学习笔记--AXI4 主接口-CSDN博客》中介绍的AXI4主接口的突发传输。虽然适用于HLS工具能够自动推断突发传输的情况,但并非所有情况工具都能自动推断。文章提供了详细的操作方法和示例,帮助读者在各种情况下优化存储器访问。本文分享了在Vitis HLS中使用AXI4主接口进行手动突发传输的方法。首先,解释了突发传输的前置条件,包括请求类型、顺序、连续性等。接着,介绍了通过hls::burst_maxi对象实现手动突发传输的方法,包括构造函数、读取和写入方法的使用。原创 2024-05-02 23:44:35 · 1860 阅读 · 0 评论 -
Vitis HLS 学习笔记--IDE(Schedule Viewer 调度查看器)
Vitis HLS中的schedule viewer是设计和优化硬件加速器过程中的一个关键工具,它通过提供算法执行的详细视图,帮助设计者理解、分析和优化他们的设计。原创 2024-04-29 20:18:31 · 1970 阅读 · 0 评论 -
Vitis HLS 学习笔记--MAXI(认识 MAXI 接口、全局/本地存储器、MAXI报告、理解 Volatile)
本文介绍了在使用 Vitis HLS 进行高层次综合时,利用 AXI4 存储器映射 (m_axi) 接口进行数据传输的方法和优势。首先,对于 MAXI 接口的认识和概述进行了阐述,MAXI 接口作为主动、全局、存储器级别的接口,提供了在 FPGA 内部和外部存储器之间高效传输数据的能力。接着,通过代码示例详细展示了如何在函数接口中使用 MAXI 接口进行数据传输,以及如何利用突发模式提高数据传输效率。原创 2024-04-28 19:21:24 · 2979 阅读 · 0 评论 -
Vitis HLS 学习笔记--块级控制(驱动程序:s_axilite 寄存器详解)
使用 Vitis HLS 工具进行硬件设计带来了额外的“隐式”优势,即在驱动程序的自动生成方面。本文详解 S_AXILITE Registers 寄存器及其驱动过程。通过对 s_axilite 协议下生成的寄存器进行解释,我们了解了这些寄存器的作用和每个寄存器位的含义。原创 2024-04-28 13:26:18 · 1575 阅读 · 0 评论