
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 · 1048 阅读 · 4 评论 -
Vitis HLS 学习笔记--IDE(Schedule Viewer 调度查看器)
Vitis HLS中的schedule viewer是设计和优化硬件加速器过程中的一个关键工具,它通过提供算法执行的详细视图,帮助设计者理解、分析和优化他们的设计。原创 2024-04-29 20:18:31 · 1946 阅读 · 0 评论 -
Vitis HLS 学习笔记--IDE(Syn Report 解读)1
综合报告是Vitis HLS工具链中一个关键的输出,它为开发者提供了关于其HLS设计的重要信息,包括时序估计、性能和资源使用情况、硬件接口细节以及软件到硬件的映射信息。本文通过三个简单的示例,详细解读这些报告,以便更好地理解 Vitis HLS 工具的输出,并利用这些信息来优化和调试硬件设计。原创 2024-04-26 23:39:18 · 2409 阅读 · 0 评论 -
Vitis HLS 学习笔记--IDE(快捷操作总结)
本文持续更新,分享一些实用操作指引,为提高使用Vitis HLS IDE效率。原创 2024-04-27 23:41:53 · 2168 阅读 · 0 评论 -
Vitis HLS 学习笔记--探究(示例:硬件卷积加速 Filter2DKernel)
就表示没有数据相关性,那么编译器就可以在同一个循环内自由地移动读写操作的位置,从而提高操作的可调度性和潜在的性能或面积优化。,就表示没有数据相关性,那么编译器就可以在流水线化或展开循环时并行执行多个循环的读写操作,从而提高吞吐量。,就表示有数据相关性,那么编译器就会保证每一次循环内的读写操作都按照顺序执行,不能移动位置。,就表示有数据相关性,那么编译器就会保证每一次循环的读写操作都按照顺序执行,不能并行化。工具计算循环的延迟,从而在报告中显示循环对总设计延迟的贡献,并帮助确定适合的优化方法。原创 2024-04-12 17:26:38 · 1329 阅读 · 0 评论 -
Vitis HLS 学习笔记--探究(readVec2Stream 函数)
readVec2Stream函数是一个高效的数据搬运工具,它专门设计用于将数据从主存(如DDR)高效地传输到FPGA上的流中。通过并行处理和流水线技术,该函数能够显著提高数据处理的吞吐量,从而优化整体的硬件性能。原创 2024-04-16 20:37:35 · 1203 阅读 · 0 评论 -
Vitis HLS 学习笔记--探究(BLAS 库中的 WideType 类型)
了解WideType的实现和功能,能够帮助开发者更好地设计和优化处理密集型数据操作的应用程序。WideType通过内部数组存储固定数量的数据项,并通过模板参数化以支持不同的数据类型和宽度,实现灵活的数据操作和存储。此外,WideType提供了一系列位级操作方法,如shift和unshift,以及数据访问和修改的方法,如重载的operator[]和getVal,从而使得对于底层数据的操作既直观又高效。原创 2024-04-17 15:05:29 · 1432 阅读 · 0 评论 -
Vitis HLS 学习笔记--探究(scal 函数)
Vitis Libraries在HLS中扮演了至关重要的角色,它汇集了众多领域内关键的函数以及它们的硬件实现版本,极大地方便了开发者。本文以BLAS库中的scale函数为例,该函数实现了向量的缩放运算,展示了Vitis Libraries的实用性和强大功能。scale函数通过模板参数、数据类型和流对象的复杂组合,实现了数据的并行处理与高效运算,虽然这些高度优化的实现在一开始可能令人望而生畏,但一旦掌握,便能大幅提升数据处理任务的性能。通过深入学习和实践,开发者可以解锁Vitis Libraries的潜力。原创 2024-04-16 17:56:58 · 1180 阅读 · 0 评论 -
Vitis HLS 学习笔记--C/C++ static 关键字的作用
在Vitis HLS中,偶尔会用到 static 关键字。考虑到Vitis HLS同时兼容C和C++语言,有必要理解这两种语言中static关键字细微差异。本文旨在梳理和总结C与C++中static关键字的具体差别,以便于开发者更加精确地应用于Vitis HLS环境中。原创 2024-04-26 15:43:55 · 1574 阅读 · 0 评论 -
Vitis HLS 学习笔记--函数例化(Function Instantiation)
函数例化是Vitis HLS中的一种高级优化技术,它允许开发者在保持函数层次结构的同时,对特定函数实例进行局部优化。这种技术通过利用编译时已知的常量输入参数,简化函数的控制逻辑,从而可能改善延迟和吞吐量。默认情况下,函数在RTL中作为独立层级块保留,或者分解到更高层次的函数中,所有实例共享单一RTL实现。通过使用FUNCTION_INSTANTIATE编译指示,可以为每个函数调用创建唯一的RTL实现,允许针对每个实例进行局部最优化。原创 2024-06-17 23:39:07 · 1328 阅读 · 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 · 878 阅读 · 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 · 1147 阅读 · 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 · 1388 阅读 · 0 评论 -
Vitis HLS 学习笔记--MAXI(突发传输:手动控制)
这篇文章探讨了在《Vitis HLS 学习笔记--AXI4 主接口-优快云博客》中介绍的AXI4主接口的突发传输。虽然适用于HLS工具能够自动推断突发传输的情况,但并非所有情况工具都能自动推断。文章提供了详细的操作方法和示例,帮助读者在各种情况下优化存储器访问。本文分享了在Vitis HLS中使用AXI4主接口进行手动突发传输的方法。首先,解释了突发传输的前置条件,包括请求类型、顺序、连续性等。接着,介绍了通过hls::burst_maxi对象实现手动突发传输的方法,包括构造函数、读取和写入方法的使用。原创 2024-05-02 23:44:35 · 1835 阅读 · 0 评论 -
Vitis HLS 学习笔记--MAXI(认识 MAXI 接口、全局/本地存储器、MAXI报告、理解 Volatile)
本文介绍了在使用 Vitis HLS 进行高层次综合时,利用 AXI4 存储器映射 (m_axi) 接口进行数据传输的方法和优势。首先,对于 MAXI 接口的认识和概述进行了阐述,MAXI 接口作为主动、全局、存储器级别的接口,提供了在 FPGA 内部和外部存储器之间高效传输数据的能力。接着,通过代码示例详细展示了如何在函数接口中使用 MAXI 接口进行数据传输,以及如何利用突发模式提高数据传输效率。原创 2024-04-28 19:21:24 · 2926 阅读 · 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 · 1390 阅读 · 0 评论 -
Vitis HLS 学习笔记--hls::stream(理解串流:do-while)2
针对《Vitis HLS 学习笔记--理解串流Stream(2)-优快云博客》博文的内容,做进一步说明。原创 2024-05-10 23:52:20 · 1030 阅读 · 0 评论 -
Vitis HLS 学习笔记--hls::stream(理解串流:do-while)1
在硬件中可以被设计为连续处理数据的模块,尽管其代码表面上看只处理一次数据。重要的是要理解硬件设计和软件逻辑之间的差异:硬件模块可以被设计为重复触发,以连续处理数据流,而不仅仅是单个数据项。原创 2024-05-09 23:37:49 · 1471 阅读 · 0 评论 -
Vitis HLS 学习笔记--hls::stream(理解串流:基础)
在Vitis HLS中,hls::stream是一个关键的数据结构,用于处理数据流。它类似于C++标准库中的std::stream,但专门设计用于硬件描述语言。hls::stream具有类似无限深度的FIFO的行为,支持顺序读写操作,并可灵活定义数据类型和FIFO深度。通过示例代码和综合报告,我们了解到hls::stream在硬件设计中的重要作用,以及如何根据需求配置不同的接口实现。这使得在设计硬件加速器时更加灵活、可控。原创 2024-05-07 23:49:57 · 1502 阅读 · 0 评论 -
Vitis HLS 学习笔记--变量存储(避免使用多重访问指针、理解volatile)
虽然 Vitis HLS 在指针上支持多重访问指针,但强烈建议使用 hls::stream 类替代多重访问指针来实现所需的行为,以避免陷入困难。如果设计使用接口上的顶层函数的实参列表中的指针,那么在使用指针执行多重访问时需考量一些特殊注意事项。当任一指针以相同方式多次执行读取或写入时,就会发生多重访问。原创 2024-05-17 16:36:44 · 1054 阅读 · 0 评论 -
Vitis HLS 学习笔记--变量存储(移除内存分配malloc)
Vitis HLS不支持动态创建或删除C/C++对象,因此开发者必须寻找替代方案。本文通过一个例子展示了如何在不定义USE_MALLOC的情况下,使用栈内存代替堆内存进行内存分配。示例中的函数example通过两个循环处理输入数组,使用栈上的局部变量而非malloc分配的内存,从而在编译时确定内存大小,这对硬件合成至关重要。原创 2024-06-12 23:35:35 · 1465 阅读 · 0 评论 -
Vitis HLS 学习笔记--变量存储(基本指针和算术指针)
在Vitis HLS中,指针的使用与传统的C/C++环境存在显著差异,尤其是在涉及硬件综合时。基本指针可以直接指向数据,并且通常不会对硬件综合产生负面影响,但在顶层函数的接口中使用时需要注意指针的实现方式。另一方面,算术指针的灵活性在软件编程中很有用,但在硬件设计中可能引入问题,因为硬件需要按照固定顺序访问数据。为了克服这些问题,可以通过使用数组和RAM接口来替代指针,以更好地满足硬件设计的需求。总之,在进行Vitis HLS设计时,需要仔细考虑指针的使用方式,以确保最终的硬件实现符合设计要求。原创 2024-05-16 23:48:02 · 1316 阅读 · 0 评论 -
Vitis HLS 学习笔记--变量存储(通道的FIFO/PIPO选择)
本文通过调整 Vitis HLS 编译器的默认设置,选择FIFO或者PIPO作为通道缓存。PIPO 缓冲器可以自动调节,确保任务之间的重叠执行,而不会出现死锁。而显式手动串流的 FIFO 通道虽然可以更快地开始重叠执行,但需要小心调整队列大小,以避免死锁问题。原创 2024-05-30 23:25:39 · 1205 阅读 · 0 评论 -
Vitis HLS 学习笔记--变量存储(优化本地存储器访问瓶颈)
通过对原始代码进行优化,成功地改善了内存访问模式,提高了循环执行效率。优化后的代码减少了存储器访问次数,优化了数据重用,以及改进了迭代间隔,使得每个时钟周期都可以开始一个新的迭代。这些优化措施有效地减少了存储器访问延迟,提高了硬件执行效率。优化后的代码在性能和效率上都有了显著的提升,更适用于高性能处理应用场景。原创 2024-05-16 15:00:30 · 1072 阅读 · 0 评论 -
Vitis HLS 学习笔记--变量存储(指令:ARRAY_PARTITION)
ARRAY_PARTITION 指令中非常重要,它用于优化数组的存储和访问。该指令可以将一个大数组分割成多个小数组,以提高并行处理能力和减少访问延迟。原创 2024-04-22 17:01:34 · 2614 阅读 · 0 评论 -
Vitis HLS 学习笔记--变量存储(资源绑定:使用URAM)2
通过本文深入探讨了在Vitis HLS环境下设计的存储器模型的内部机制。通过分析生成的RTL代码和IMPL报告,我们了解到该存储器模型利用URAM实现,具有读写功能,并且限制了级联深度为1。特别地,我们注意到存储器的初始化操作在Vitis HLS中被转化为硬件实现的一部分,这为预加载存储器内容提供了便利。总的来说,本文为使用Vitis HLS设计存储器提供了实用的指导,加深了对存储器设计原理的理解。原创 2024-05-15 23:53:21 · 1545 阅读 · 0 评论 -
Vitis HLS 学习笔记--变量存储(资源绑定:使用URAM)1
本文提供了对使用 URAM 进行高性能内存解决方案设计的全面理解,详细介绍了在 Vivado IP 流程中使用 AP_Memory 进行与存储器资源通信的方法,并介绍了使用 UltraRAM(URAM)的优势和意义。通过代码解析,展示了在 Vitis HLS 环境中设计的一个简单存储器模型。原创 2024-05-14 23:33:28 · 1466 阅读 · 0 评论 -
Vitis HLS 学习笔记--变量存储(指令:BIND_OP_STORAGE)
这些指令指导了高级综合(HLS)工具在优化指定数组的存储和操作实现时的行为。它们有助于在 FPGA 设计中实现更好的性能和资源利用率。存储类型的选择(BRAM、LUTRAM 或 URAM)以及专用 DSP 资源的使用会影响设计的整体效率。指定的延迟控制了这些操作的时序特性。原创 2024-04-22 22:43:22 · 1575 阅读 · 0 评论 -
Vitis HLS 学习笔记--变量存储(数据对齐、结构充填)
在现代计算机系统中,数据对齐和结构填充是确保数据存储和访问效率的关键因素。数据对齐涉及将数据按照处理器优化的边界排列,以加快访问速度。结构填充则是在数据结构中插入额外空间,以保持成员变量的正确对齐。这些概念在硬件设计中尤为重要,因为 FPGA 和其他硬件加速器对数据布局的要求更为严格。Vitis HLS 等工具允许开发者自定义对齐和填充规则,以优化软件与硬件之间的数据交互,从而提升整体性能。理解并应用这些原则,可以帮助开发者在存储器要求和性能之间找到最佳平衡点。原创 2024-06-08 23:37:27 · 1294 阅读 · 0 评论 -
Vitis HLS 学习笔记--变量存储(DDR中的图像数据:生成、存储、调取 + Filter2D函数)
通过 HLS 中提供的函数Filter2D,了解在硬件加速中,图像数据在 DDR 中的存储模式,从而理解的生成、调取方法,方便快速测试和验证。原创 2024-04-11 17:48:33 · 767 阅读 · 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 · 1635 阅读 · 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 · 1841 阅读 · 0 评论 -
Vitis HLS 学习笔记--初始化与复位(块级控制:阵列、实参)
本文讨论了初始化和复位在硬件设计中的不同方面。阵列的初始化是在编译时或上电时为变量赋予初始值,而复位是在运行时将变量恢复到其初始状态。控制的初始化和复位也是关键,通过复位信号可以在 kernel 端口添加复位行为。对于阵列,使用 static 限定符的存储器可以实现默认初始化行为,避免运算开销。此外,BRAM 和 URAM 的启动和重置方式也需要根据硬件平台进行考虑。原创 2024-06-04 23:51:58 · 1223 阅读 · 0 评论 -
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 · 1330 阅读 · 0 评论 -
Vitis HLS 学习笔记--块级控制(驱动程序:s_axilite 寄存器详解)
使用 Vitis HLS 工具进行硬件设计带来了额外的“隐式”优势,即在驱动程序的自动生成方面。本文详解 S_AXILITE Registers 寄存器及其驱动过程。通过对 s_axilite 协议下生成的寄存器进行解释,我们了解了这些寄存器的作用和每个寄存器位的含义。原创 2024-04-28 13:26:18 · 1557 阅读 · 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 · 1387 阅读 · 0 评论 -
Vitis HLS 学习笔记--数据类型(矢量 hls::vector)
在 Vitis HLS 中,矢量数据类型提供了一种高效的数据处理方式,允许开发者利用 SIMD 操作一次性处理多个数据元素。通过使用 hls::vector,开发者可以创建一个由 N 个类型为 T 的元素组成的矢量。这种数据结构在内存中连续存储,且当元素类型和数量都是 2 的幂时,对齐到其总大小,可以实现最优的内存访问效率。原创 2024-06-11 23:37:05 · 1148 阅读 · 1 评论 -
Vitis HLS 学习笔记--数据类型(任意精度:ap_int.h / ap_fixed.h)2
这篇文章的目的,正是要揭开ap_int.h和ap_fixed.h这两个强大工具的神秘面纱,更好地理解其背后的原理和应用方式。原创 2024-04-15 15:35:34 · 1462 阅读 · 0 评论 -
Vitis HLS 学习笔记--数据类型(任意精度:ap_int.h / ap_fixed.h)1
使用标准的数据类型(如 int、float 等)往往会导致资源浪费,因为这些类型的位宽是固定的,可能远远超过实际需求。例如,在执行加法操作时,较小的数据位宽意味着较少的逻辑门延迟,从而加快运算速度。此外,较小的数据位宽还可以减少数据传输的带宽需求,提高整体系统的性能。在执行加法或减法运算时,两个浮点数的指数可能不同,需要进行对阶操作,即调整两个数的指数使其相同,然后才能对尾数进行加减操作。浮点运算单元(FPU)的设计比定点运算单元复杂得多,需要更多的逻辑电路和更多的时钟周期来完成一个运算。原创 2024-04-09 07:30:00 · 1997 阅读 · 0 评论 -
Vitis HLS 学习笔记--TLP(控制驱动 vs 数据驱动)
任务级并行度(TLP)通过同时执行多个任务提升应用效率和性能。Vitis HLS 提供了数据驱动和控制驱动两种 TLP 模型。数据驱动模型像自动化流水线,适用于无外部存储器交互且函数间无数据依赖的应用;控制驱动模型则更像一个指挥官,适合不同部分需相互通信的应用。数据驱动模型中,任务通过 hls::task 声明,通道通过 hls::stream 模拟,注意避免死锁。控制驱动模型使用 C++ 顺序语义创建并行处理流水线,任务级并行执行函数,需使用 DATAFLOW 编译指示。两者结合,实现高效并行计算。原创 2024-05-20 23:30:51 · 1594 阅读 · 0 评论