HLS 开发
文章平均质量分 87
记录HLS的学习历程
Vuko-wxh
道阻且长 行则将至。
展开
-
HLS - intel HLS 指令使用指南
本文主要介绍关于intel的HLS工具的相关指令的使用方法。原创 2022-05-09 17:14:43 · 1189 阅读 · 0 评论 -
HLS-指令使用指南
写在前面本文记录了HLS的所使用的大部分指令,参考UG1270,对每个指令进行讲解,并有相关示例。内核优化pragma HLS allocation说明指定实例限制以限制已实现内核中的资源分配。这定义并可以限制用于实现特定功能、循环、操作或内核的 RTL 实例和硬件资源的数量。 ALLOCATION pragma 在函数体、循环或代码区域内指定。例如,如果 C 源代码有四个函数 foo_sub 的实例,则 ALLOCATION pragma 可以确保最终 RTL 中只有一个 foo_sub 实原创 2021-09-25 22:14:03 · 8188 阅读 · 3 评论 -
HLS设计方法论 - 数据访问模式
本文参考赛灵思的官方手册UG1270,主要介绍了数据访问模式,以帮助我们更好的进行HLS的开发设计。原创 2021-09-24 22:22:32 · 494 阅读 · 0 评论 -
HLS设计方法论 - 结构优化策略
写在前面本文参考赛灵思的官方手册UG1270,主要介绍了结构优化策略,以帮助我们更好的进行HLS的开发设计。结构优化策略C代码可以包含防止函数或循环以所需性能流水线化的描述。 这通常由 C 代码的结构或用于实现 PL 逻辑的默认逻辑结构暗示。 在某些情况下,这可能需要修改代码,但在大多数情况下,这些问题可以使用额外的优化指令来解决。以下示例显示了使用优化指令来改进实现结构和流水线性能的情况。 在这个初始示例中,将 PIPELINE 指令添加到循环中以提高循环的性能。 此示例代码显示了在函数内部使用的原创 2021-09-15 13:34:04 · 672 阅读 · 0 评论 -
HLS设计方法论 - 优化硬件函数方法论及流水操作的优化策略
写在前面本文参考赛灵思的官方手册UG1270,主要介绍了硬件函数的设计方法论和操作的优化策略,以帮助我们更好的进行HLS的开发设计。优化硬件函数概述Vivado HLS 的默认行为是以顺序方式执行函数和循环,以便硬件准确反映 C/C++ 代码。 优化指令可用于增强硬件函数的性能,允许流水线操作,从而显着提高函数的性能。 本文概述了优化设计以获得高性能的一般方法。在尝试使用 Vivado HLS 优化设计时,有许多可能的目标。 该方法假设您希望创建具有尽可能最高性能的设计,在每个时钟周期处理一个新输入原创 2021-09-12 09:09:09 · 1743 阅读 · 0 评论 -
HLS实践 - 06 - 优化设计
HLS优化概述使用HLS创建高质量 RTL 设计的一个关键部分是能够将优化应用于 C 代码。 HLS总是试图最小化循环和函数的延迟。为此,在循环和函数内,它尝试并行执行尽可能多的操作。 在函数级别,HLS总是尝试并行执行函数。除了这些自动优化之外,指令还用于:并行执行多个任务,例如,同一函数的多次执行或同一循环的多次迭代。 这就是流水线。重构阵列(块 RAM)、函数、循环和端口的物理实现,以提高数据的可用性并帮助数据更快地通过设计。提供有关数据相关性或缺乏数据相关性的信息,从而允许执行更多优化。原创 2022-05-01 12:00:00 · 859 阅读 · 0 评论 -
HLS实践 - 05 - 分析并使用透视图优化操作
写在前面学习使用透视图进行分析代码运算瓶颈,根据透视图优化操作。代码概览双击Source文件夹中的dct.cpp文件,打开源代码进行查看。本示例使用 DCT 函数。 下图显示了此代码的概览。图左侧显示了代码层次结构。顶层函数 dct 有三个子函数:read_data、dct_2d 和 write_data。函数 dct_2d 有一个子函数 dct_1d。图中心显示了每个函数内部的循环,图右侧显示了如何通过函数和循环处理数据。read_data函数执行,数据通过循环RD_Loo原创 2022-04-29 17:19:46 · 998 阅读 · 4 评论 -
HLS实践 - 04 - 任意精度
概述C/C++ 提供的数据类型固定为 8 位(8的整数倍):char(8 位)short(16 位)int(32 位)long long(64 位)float(32 位)double(64 位)精确宽度整数类型,例如 int16_t(16 位)和 int32_t(32 位)创建硬件时,通常需要更准确的位宽。位宽设置不恰当可能会造成丢失数据或者浪费资源, Vivado 高级综合 (HLS) 提供多种位精确或任意精度数据类型,允许您使用任何(任意)宽度对变量进行建模。在本次设计中,使用标原创 2022-04-29 16:41:52 · 662 阅读 · 0 评论 -
HLS实践 - 03 - 接口优化设计
写在前面本文使用UG871的示例工程,第一个工程说明什么是块级 I/O 协议以及如何控制它们;第二个工程进行设置端口IO协议;第三个工程对数组接口进行设计;第四个工程使用AXI接口设计。块级接口协议新建工程并添加文件添加UG871提供的文件如下:将adders.c和adders.h添加到source。adders.c#include "adders.h"int adders(int in1, int in2, int in3) {// Prevent IO protocols on a原创 2021-08-24 13:32:06 · 833 阅读 · 0 评论 -
HLS实践 - 02 - 简单优化FIR设计
写在前面本文对UG871提供的FIR滤波器进行简单的优化设计。该工程的设计目标是: 创建具有最高吞吐量的此设计,最终设计应该能够处理输入有效信号提供的数据,产生伴随输出有效信号的输出数据。滤波器系数将存储在 FIR 设计外部的单端口 RAM 中。创建工程并添加相关文件FIR滤波器工程 ,添加introduction 的 Lab3中相关的C和H文件添加到工程。如图所示:添加完成后,点击c synthesis,完成c综合可以得到综合后的设计报告。分析综合报告当前版本综合后的接口信息如下:通原创 2021-08-20 13:36:42 · 484 阅读 · 0 评论 -
HLS实践 - 01 - 使用TCL脚本创建工程
写在前面本文演示如何基于现有Vivado HLS项目创建Tcl命令文件并使用Tcl。创建TCL文件打开Vivado HLS命令提示符。2.在Windows上,在Xilinx Design Tools文件夹下找到 Vivado HLS Command Prompt。在Vivado HLS项目时,Tcl文件将自动保存在项目层次结构中。在HLS界面中,展开solution1中的Constraints文件夹,可以看到script.tcl和directives.tcl脚本。可以双击文件script.tcl原创 2021-08-20 13:33:21 · 1418 阅读 · 0 评论 -
HLS介绍 - 05 - 软件仿真
写在前面本文参考xilinx的UG998的第七章,主要介绍了关于仿真测试平台的相关内容,以及在HLS中无法进行验证的相关情况的说明。Testbench类似在FPGA开发平台的testbench,这里只需要进行编写main函数进行测试hls综合的目标函数,在HLS可以进行C仿真还有C和RTL联合仿真。软件测试平台任何HLS生成模块的验证都需要软件测试台。软件测试台具有以下重要功能:证明针对FPGA实现的软件运行且不产生分段故障证明算法的功能正确性分段错误在HLS中是一个问题,就像原创 2021-08-30 12:42:54 · 3309 阅读 · 0 评论 -
HLS介绍 - 04 - 以控制为中心的算法
写在前面本文参考UG998的第六章,介绍了以控制为中心的算法。它还包括示例和最佳实践建议,以最大限度地提高HLS生成的实现的性能。概念以控制为中心的算法是一种可以在任务执行期间根据系统级因素进行更改的算法。以计算为中心的算法在任务期间对所有输入数据值应用相同的操作,而以控制为中心的算法则根据当前输入端口状态确定其操作。用 C/C++ 表达控制循环循环是用于表达迭代计算的基本编程结构。 与所有编译器一样,HLS 允许将循环表示为 for 循环、while 循环和 do-while 循环。 使用 V原创 2021-08-26 13:40:02 · 627 阅读 · 0 评论 -
HLS介绍 - 03 - 以计算为中心的算法
写在前面本文参考UG998的第五章,介绍了以计算为中心的算法。它还包括示例和最佳实践建议,以最大限度地提高HLS生成的实现的性能。概念以计算为中心的算法是每个任务配置一次的算法,并且在任务期间不能更改其行为。硬件中的任务与C/C++程序中的函数调用相同。任务的大小由HLS用户控制。图中显示了Sobel边缘检测操作的代码。这是一个以计算为中心的算法的示例,它可以划分为不同大小的任务。该算法是一种二维滤波操作,通过计算x和y方向上每个像素的梯度来计算图像中区域的边缘。正如目前编写的,此代码可以由HLS原创 2021-08-26 13:37:12 · 668 阅读 · 2 评论 -
HLS介绍 - 02 - HLS原理与软件编译器的区别
写在前面通过将FPGA作为执行结构,Vivado HLS能够优化代码的吞吐量、功耗和延迟。本文参考UG998的第四章,主要介绍Vivado HLS的工作原理及其与传统软件编译器的区别。运算运算是指计算结果值所涉及的应用程序的算术和逻辑组件。此定义排除比较语句,因为它们是在条件语句中处理的。在处理操作时,Vivado HLS与其他编译器的主要区别在于对设计的限制。对于处理器编译器,固定的处理体系结构意味着用户只能通过限制操作依赖性和操纵内存布局来影响性能,从而最大限度地提高缓存性能。相比之下,Viv原创 2021-08-25 13:22:07 · 1160 阅读 · 0 评论 -
HLS介绍 - 01 - FPGA的架构、结构以及硬件设计相关概念
写在前面学习HLS,首先要了解关于软件和硬件的区别,本文参考是xilinx官方手册UG998的第二章和第三章,主要介绍了FPGA的架构、FPGA的并行结构,以及HLS需要知道的相关硬件概念。FPGA架构FPGA 的基本结构由以下元素组成:查找表 (LUT):该元素执行逻辑运算。触发器(FF):该寄存器元素存储LUT 的结果。电线(wire):这些元素将元素相互连接。输入/输出(I/O) :这些物理上可用的端口将数据输入和输出FPGA。这些元素的组合产生了的基本 FPGA原创 2021-08-25 13:11:46 · 1365 阅读 · 0 评论 -
HLS开发学习-15- HLS优化指令汇总
本文是本系列专题的第十五篇,参考高亚军老师的视频教程以及课程的ppt,也是高亚军老师课程的最后一讲,这里只给出相对应方面的优化指令,不再引用课程中的示例。原创 2021-08-02 14:46:56 · 500 阅读 · 0 评论 -
HLS开发学习-14- Vivado HLS 函数层面的优化
写在前面本文是本系列专题的第十四篇,参考高亚军老师的视频教程以及课程的ppt,主要介绍了Vivado HLS 函数层面的优化。原创 2021-08-02 14:32:51 · 940 阅读 · 0 评论 -
HLS开发学习-13- 数组优化
写在前面本文是本系列专题的第十三篇,参考高亚军老师的视频教程以及课程的ppt,主要介绍了vivado HLS对数组优化。原创 2021-08-02 13:58:00 · 1541 阅读 · 0 评论 -
HLS开发学习-12- for 循环优化(二)
写在前面本文是本系列专题的第十二篇,参考高亚军老师的视频教程以及课程的ppt,主要介绍了vivado HLS对for 循环优化。循环嵌套的优化循环的类型完美循环嵌套:循环次数为常数,循环体只会在最内部的循环中出现。**半完美循环嵌套:**内部循环体次数为常数,外部循环体次数为变量,循环部分只在最内层循环出现。不完美循环嵌套:内外层的循环此时为常量,但是循环体存在内外循环中。或者是这种,循环体只出现在最内层中,但是内层的循环次数不确定,是个变量。对于不完美循环嵌套,内部循环有变量边界,原创 2021-08-02 10:43:53 · 1121 阅读 · 0 评论 -
HLS开发学习-11- for 循环优化(一)
本文是本系列专题的第十一篇,参考高亚军老师的视频教程以及课程的ppt,主要介绍了vivado HLS对for 循环优化。原创 2021-08-02 09:02:00 · 1660 阅读 · 0 评论 -
HLS开发学习-10- 接口综合
本文是本系列专题的第十篇,参考高亚军老师的视频教程以及课程的ppt,主要介绍了接口综合的相关内容。原创 2021-07-31 16:36:47 · 1994 阅读 · 2 评论 -
HLS开发学习-09- 描述高效的C测试平台
本文是本系列专题的第九篇,参考高亚军老师的视频教程以及课程的ppt,主要介绍了高效的C测试平台相关内容。原创 2021-07-09 10:55:55 · 887 阅读 · 3 评论 -
HLS开发学习-08- Vivado HLS下C_C++测试平台的基本架构
写在前面本系列的第8篇,ppt引用来自赛灵思hls教程,主要介绍HLS下C_C++测试平台的基本架构。原创 2020-08-27 13:16:22 · 799 阅读 · 0 评论 -
HLS开发学习-07- Vivado HLS 中的 C++ 基本运算
本文是本系列专题的第七篇,参考高亚军老师的视频教程以及课程的ppt,主要介绍了vivado HLS的C++ 基本运算处理。原创 2020-07-05 00:32:02 · 1565 阅读 · 0 评论 -
HLS开发学习-06- 数据类型的处理-- HLS 中的复合数据类型
本文是本系列专题的第六篇,参考高亚军老师的视频教程以及课程的ppt,主要介绍了vivado HLS数据类型的处理,结构体和枚举类型的处理。原创 2020-07-02 20:03:12 · 662 阅读 · 0 评论 -
HLS开发学习-05- 数据类型的处理--数据类型转换
ap_[u]int定义与赋初值在下图中给出了HLS中支持的整数数据类型的编程的demo,由图理解即可,不做赘述。ap_[u]fixed定义与赋初值对于fixed类型的数据要说明一点的是这里的参数含义W 代表的是数据的总长I 代表的是数据的整数部分长度,小数部分则是W-IQ 是关于低位的量化精度的处理办法O 是关于溢出的相关操作在上图中,我们可以看到在使用AP_RND和AP_...原创 2020-05-07 23:58:46 · 1191 阅读 · 0 评论 -
HLS开发学习-04- 数据类型的处理--任意精度数据类型
数据类型下图给出了C和C++的数据类型,同样也指出了在HLS中不支持的数据类型。为什么要进行任意精度处理在C语言的数据类型下,比特都是给定的8,16,32,64。而不同于FPGA内部可以实现任意位宽的一个调配。所以在这个标准的下,FPGA内部的资源可能会造成浪费。在下图的PPT中,高亚军老师也给出了一个18*18的乘法器的例子,输入的端口为18比特仅仅比16多了2个比特,就浪费地使用了3...原创 2020-05-05 23:37:15 · 844 阅读 · 0 评论 -
HLS开发学习-03-VIVADO HLS设计流程
本文参考了高亚军老师的课程,搜索课程在各大电子网站和B站即可看到。传统的RTL设计流程在RTL设计流程中,是这样的设计流程:设计Verilog VHDL SV代码代码设计TB文件进行RTL级仿真不断修改综合实现系统级调试注意在综合分析时要根据需要满足资源布局还有时序的要求C语言设计流程在HLS工具的使用中最大的不同是你只需要进行C语言的编写设计和测...原创 2020-05-01 16:39:54 · 1129 阅读 · 0 评论 -
HLS开发学习-02-HLS工作机制
本文参考了高亚军老师的课程,简单介绍下HLS的流程ESL的发展电子设计经过了CAD–CAE–EDA的发展过程,并在后期提出来ESL概念,其实说到底,这也就是科学技术发展到一定水平后完全可以由机器来代替人们完成之前的复杂的过程,HLS的本质就是为了缩短开发的周期,加快算法的实现。我们不太需要掌握具体的底层的语法即可完成设计,对于优化的过程来说,我们也只需在高层次的语言比如C C++上进行修改...原创 2020-04-30 23:17:58 · 1046 阅读 · 0 评论 -
HLS开发学习-01-HLS介绍与FPGA简单内部介绍
介绍博主之前在全国FPGA竞赛中使用过HLS的部分内容,想着今年考研也不能毫无产出吧,所以抽一点时间来碎片化学习下HLS的相关知识。简单来说吧,因为传统的开发FPGA流程相比缓慢,不如软件开发的效率高,所以说HLS运营而生,使用高级语言来进行转换为底层的硬件代码。虽然说是支持高级语言比如说C与C++ 但是最主要的核心来说, HLS的开发也是要求开发这对代码的背后的硬件与FPGA内部结构相对...原创 2020-04-04 01:24:01 · 3929 阅读 · 0 评论