VivadoHLS中函数的层次设计和优化1函数层次设计中函数调用的优化
Xilinx Vivado HLS中Floating-Point(浮点)设计介绍
Xilinx Vivado HLS中Floating-Point(浮点)设计介绍
编码风格与技巧
尽管通常Fixed-Point(定点)比FloaTIng-Point(浮点)算法的FPGA实现要更快,且面积更高效,但往往有时也需要FloaTIng-Point来实现。
这是因为Fixed-Point有限的数据动态范围,需要深入的分析来决定整个设计中间数据位宽变化的pattern,为了达到优化的QoR,并且要引入很多不同类型的Fixed-Point中间变量。
而FloaTIng-Point具有更大的数据动态范围,从而在很多算法中只需要一种数据类型的优势。
Xilinx Vivado HLS工具支持C/C++ IEEE-54标准单精度及双精度浮点数据类型,可以比较容易,快速地将C/C++ FloaTIng-Point算法转成RTL代码。
与此同时,为了达到用户期望的FPGA资源与性能,当使用Vivado HLS directives时需要注意C/C++编码风格与技巧相结合。
编码风格
1.1 单双精度浮点数学函数
#include
float example(float var)
{
return log(var); // 双精度自然对数
}
在C设计中,这个例子,Vviado HLS 生成的RTL实现将输入转换成双精度浮点,并基于双精度浮点计算自然对数,然后将双精度浮点输出转换成单精度浮点。
#include
float example(float var)
{
return logf(var); // 单精度自然对数
}
在C设计中,logf才是单精度自然对数,这个例子Vviado HLS 生成的RTL实现将基。
学习vivadoHLS第7章例程中文版
学习vivado第7章Lab1——设计优化概述创建高质量RTL设计的一个关键部分是采用高层次综合拥有优化C代码的能力。
高层次综合经常尝试减少循环和函数的延迟。
在循环和函数中为了获得这种目的,高层次综合尝试执行尽可能多的并行操作。
在函数层,高层次综合经常尝试执行并行函数。
除了这些自动优化,指令用于:•并行执行多个任务,例如,相同的函数多次执行或相同的循环多次迭代。
采用流水线。
•调整数组(块RAM),,函数,循环和端口的物理实现用以提高数据的利用率和帮助数据流尽快通过设计。
•提供的数据相依性的信息,或缺少这些信息,从而可进行更多优化。
最终的优化技术是修改的C源代码,以删除非预期依赖关系的代码,这种代码可能限制了硬件的性能教程是由两个实验练习组成。
你可以在这些实验练习中用Analysis perspective来执行分析。
前提条件是完成了本教程的Design Analysis教程Lab1参照循环和函数流水线的使用来创建的设计能够在一个时钟处理一个样本。
这个实验包括一些例子,这些例子给您机会去分析两个通常引起不能满足性能要求导致设计失败的原因:循环依赖关系和数据流限制或瓶颈。
Lab2这个实验展示了怎么从lab1中修改代码来帮助克服一些在代码中无意识存在的内在的性能限制。
教程设计描述从xilinx网站下载教程设计文件,在教程设计中查看信息。
教程所用的设计文件在教程目录vivado_HLS_Tutorial\Design_Optimization你在实验练习中使用的样本设计是一个矩阵乘法功能。
设计目标是在每个时钟周期处理一个新的采样,实现的接口作为数据流传输接口。
Lab1:优化矩阵乘法器这个练习使用矩阵乘法器设计用以展示你如何全面优化设计重点是在循环设计上,设计的目标是用FIFO接口在每个时钟周期读一个样本,同时使用最少资源。
这个分析包括了在使用函数级优化的循环级优化方法的比较。
这个练习解释了用户分析界面视角的基本操作,还有你如何用这个界面来驱动设计优化。
vivadoHLS优化
vivadoHLS优 化
//HLS数据类型: ap_fixed<总位宽,整数位宽> -------------------------------------------------------------------------(优化)Directive (函数/类 -> 变量/对象)Insert Directive (优化措施 ug902->design optimization)Directive :DATA_PACK 对结构体打包 :INTERFACE 对接口优化 :RESOURCE :STREAM Destination :Source File 对工程下所有solution :Directive File 对当前solution Options :mode->ap_ovld(对应优化措施) //:register //:depth :port->led_o(userport) //:clock name -------------------------------------------------------------------------Run simulation->C simulation dialog->Options:Clean Build
协同modelsim仿真:solution->run c/rtl simulation->Co simulation dialog ->simulator select:modelsim /rtl select:verilog /options->dump trace 输出目录:explorer->solution->sim->... --------------------------------------------------------------------------(HLS导出ip)工具栏->Export RTL->dialog->configure->name:[ip_name]
Vivado HLS工程testbench的三个要素
编写高效Vivado HLS工程testbench的三个要素在C程序的设计中,任何一个C程序的顶层都是main()函数。
而在vivado HLS的设计中,只要函数的层次在main()函数以下,都可以被综合。
但是每个vivado HLS工程只能指定一个top层函数作为输出RTL模块的顶层,其它和这个函数层次平行,不需要被综合的函数都可以作为testbench来使用。
这样就带来一个问题,如何编写vivado HLS工程的testbench更高效,或者说能更好的让HLS工具自动重用C testbench 验证产生的RTL代码就变得非常重要。
通常,在Vivado HLS中,好的C testbench设计原则是testbench设计和需要实现的算法函数分别保存在不同的文件中,并且充分利用头文件。
Testbench 常常包含了一些HLS综合不支持的操作,比如通过文件的读写取得仿真数据并保存结果,或者打印一些测试结果进行分析。
在头文件中,完成对testbench中所有的数据类型和函数的定义,以及包含共享的设计文件和函数库。
Vivado HLS中,只能指定一个top层函数用于综合,top层函数可以包含多个子函数。
当需要综合多个并行层次的函数时,可以编写一个wrapper函数作为top层函数,将需要综合的多个并行函数封装起来。
C testbench的目不仅是要验证需要综合的top函数功能正确(C编译器验证环境),同时重用C testbench作为综合产生RTL代码的仿真激励,HLS工具自动调用C testbench来验证RTL功能的一致性(C编译器和RTL仿真器的协同仿真环境)。
这样,编写一个好的风格testbench可以很好的提高设计的验证效率,如果在HLS综合前和综合过程中,需要修改综合函数的代码,可以用testbench 验证,确保需要综合的C算法功能正确。
Vivado HLS中推荐高效的testbench具有如下三个特征:1.Testbench代码和需要综合的C算法代码保存在不同的文件中(例子1-1)。
学习VivadoHLS第4章 例程中文版
学习Vivado第4章lab1——接口综合概述接口综合是将RTL接口添加到C设计的过程。
另外还把物理接口添加到RTL设计中,接口综合包括了相关联的I/O 协议,容许数据通过接口传输并自动与内部优化的逻辑同步。
本教程由4实验练习组成涵盖的主要功能和接口综合。
•Lab1: 查看函数的返回和块级协议•Lab2: 理解默认端口的I/O协议,并学会怎么选择I/O协议•Lab3: 查看一下数组端口实现,可以进行分区。
•Lab4: 为设计创建一个优化的实现并添加AXI4接口教程设计描述从xilinx网站下载教程的设计文件,参考信息中获取教程设计。
本教程使用教程目录中的设计文件Vivado_HLS_Tutorial\ Interface_Synthesis。
关于实验•使用前两个实验室在本教程中的示例的设计很简单,这有助于将焦点保持在接口。
•最后两个实验练习使用多通道累加器。
•本教程介绍如何实现采用高层次综合实现I/O端口和协议。
•在实验4中,创建一个在Lab3中使用最优实现的设计接口综合lab1:块级I/O协议概述这个实验解释了什么是块级I/O协议,并控制它们重点:在本教程中的图片和命令假定了教程数据目录Vivado_HLS_Tutorial被解压并放置在c:\vivado_HLS_Tutorial如果教程数据路径解压到不同的位置,或者在linux系统上,调整路径名称指向你选择放置Vivado_HLS_Tutorial目录位置。
步骤1:创建并打开工程1.打开Vivado HLS 命令提示符a.在windows系统中,采用Start>All Programs>Xilinx Design Tools>Vivado2014.2>Vivado HLS>Vivado HLS 2014.2 Command Prompt,如下图b.在linux系统下,打开新的shell,2. 用命令提示符窗口,如图55,把接口综合教程的路径变为lab13. 执行TCL并建立vivado HLS Project,采用的是vivado_hls–f run_hls.tcl如图55所示4. 当vivado HLS 完成,在用户界面里打开工程。
vivado implementation策略
Vivado Implementation 策略Vivado 是由赛灵思公司(Xilinx)推出的一款集成电路开发工具,专门用于 FPGA/CPLD 的设计、仿真、调试和实现。
Vivado Implementation 策略指的是在使用 Vivado 进行 FPGA 设计时,针对不同的项目需求和目标硬件评台,制定合适的实现策略,以优化设计的性能、功耗和资源利用率。
下面我们来探讨一些常见的 Vivado Implementation 策略。
一、时序约束优化在 FPGA 设计中,时序约束的准确性对于设计的性能至关重要。
通过合理地设置时序约束,可以确保设计在目标时钟频率下能够正常工作,并且最大化地利用 FPGA 资源。
时序约束还可以帮助 Vivado 在实现过程中更好地优化逻辑综合和布局布线,进而提高设计的时序稳定性和抗干扰能力。
在进行 Vivado Implementation 时,需要仔细分析设计中的关键路径,准确设置时序约束,并根据需要进行时序优化,以达到设计的性能指标。
二、资源利用率优化在 FPGA 设计中,资源利用率优化是指在实现过程中最大化地利用FPGA 提供的逻辑单元、存储单元和 DSP 资源,以及减少设计对资源的竞争和冲突。
为此,在进行 Vivado Implementation 时,可以采取一些策略来优化资源利用率,例如合并逻辑、减少冗余逻辑、优化存储器结构、合理分配 DSP 资源等。
通过合理的资源利用率优化,可以有效降低设计的成本和功耗,提高设计的可靠性和稳定性。
三、功耗优化随着移动设备、物联网、人工智能等应用的不断发展,对于 FPGA 设计的功耗要求也越来越高。
在 Vivado Implementation 过程中,需要采取一些策略来优化设计的功耗。
可以通过减少逻辑单元、优化时钟管理、采用低功耗 IP 核等方式来降低设计的功耗。
还可以利用Vivado 提供的功耗分析工具来评估设计的功耗情况,进一步优化设计的功耗性能。
vivado implementation opt design策略 -回复
vivado implementation opt design策略-回复Vivado implementation optimization design策略Vivado是Xilinx公司推出的一款用于FPGA设计的集成开发环境(IDE),旨在帮助设计师更高效地进行电路设计和实现。
Vivado提供了一系列优化策略,可以帮助设计师减少逻辑资源占用、提高性能和功耗效率。
本文将逐步介绍Vivado implementation优化设计策略,并提供一些实用技巧来最大化您设计的性能。
第一步:设计分析与约束在开始任何FPGA设计之前,首先需要对设计进行完整的分析和约束。
设计分析有助于了解设计的性能瓶颈和资源占用情况,约束则指定了设计的参数和目标。
以下是一些设计分析和约束的关键步骤:1. 设计分析:通过使用Vivado的综合工具,分析设计的RTL代码,以了解其最关键的模块、信号路径和时序约束。
这有助于识别出设计的性能瓶颈。
2. 约束生成:使用Xilinx提供的约束语言(XDC)生成约束文件。
这些约束文件可以用于指定时序约束、I/O约束和布局约束等。
根据您的设计需求,合理地设置这些约束可以帮助Vivado优化综合和布局。
第二步:综合与优化一旦设计分析和约束完成,接下来需要进行综合和优化。
综合是将RTL代码转换为逻辑门级电路的过程,而优化则是通过改进逻辑电路的布局和时序来提高性能和资源利用率。
1. 逻辑综合:使用Vivado中的逻辑综合工具可以将RTL代码转换为综合网表,这是一个包含逻辑门和寄存器的表示。
逻辑综合的目标是将代码转换为具有最小逻辑资源占用和最大性能的电路。
2. 优化技巧:通过Vivado的优化选项和技巧,可以改进综合网表的性能和资源利用率。
一些常用的优化技巧包括:- 逻辑优化:使用Vivado的逻辑优化选项,例如逻辑合并、逻辑消除和共享资源,以减少逻辑资源占用。
- 时序优化:使用Vivado的时序优化选项,例如时钟分配、时钟插入和时钟再分配,以改善设计的时序性能。
Vivado高层次综合.docx
Vivado高层次综合感谢你对Vivado HLS也就是XILINX’s 高层次综合解决方案有兴趣,这个解决方案综合c,c++和系统c代码成Verilog和VHDL RTL结构。
我们要说明基于c设计方法在图像处理算法实现的好处。
这个算法是工作在一张彩色图像,完成色彩变化后再进行边缘检测。
这个算法是测试不同的色彩变化,然后再进行边缘检测。
这个产生了迭代输出结果。
这是个典型的原始应用场景。
在这里设计者想去细调这个算法。
Vivado高层次综合提供内嵌的C仿真能力,帮助设计者做细调。
在这里,我们开始用Vivado高层次综合来调试图像处理算法。
这个功能调用表示了这个设计被实现成为RTL(寄存器级)。
在这个设计规格里面,两个函数调用体现了滤波器的功能。
在第一个滤波器里,一个循环体现了帧内像素颜色转化,现在的配置设置执行了彩色到棕褐色的转换。
使用来自Vivado高层次综合的调试能力,很容易理解设计描述的执行。
这个定时器显示了完成c仿真的速度。
这个测试向量成功地显示了输出结果和参考图像是相一致的。
这个说明了基于c设计好处中的一个,就是算法能全面快速地被验证。
现在我们满足了设计规格,我们能继续往前综合成RTL(寄存器级)。
对于我们的演示,我们想去跑75Mhz的时钟频率,这个目标就是处理每秒60帧的数据。
目标器件是kintex-7器件。
首次综合通常建立一个基准,这个基准创立了一个全面的报告,设计者参考这个报告,提供约束,得到所需的架构。
Vivado高层次综合显示了极其快速的综合时间,可以在短短几分钟内处理上千上万行c代码。
这,反过来,指向了设计探究的机会,真正地通过性能,资源和功耗指标的驱动去细调架构。
作为综合的结果,现在可以得到Verilog和VHDL RTL。
也就是我们首次基于c语言架构解决方案。
这个相应的报告给了我们功耗的评估,还有资源利用率。
注意到对于这个算法,存储器的要求高达139%,超过了Kintex-7器件的容量。
vivado参数定义 -回复
vivado参数定义-回复标题:Vivado参数定义:实现卓越FPGA开发的关键引言:在FPGA(现场可编程门阵列)开发中,使用合适的工具和参数对项目进行配置和管理至关重要。
Vivado是Xilinx公司开发的面向FPGA开发的综合工具,通过使用Vivado参数,可以更好地配置和优化FPGA设计。
本文将向读者介绍Vivado参数的定义和使用,帮助他们提高FPGA开发效率并实现卓越的项目。
一、什么是Vivado参数?Vivado参数是一组在Vivado设计流程过程中使用的选项和设置,用于配置和控制FPGA项目的各个方面。
这些参数可以在设计的各个阶段进行调整,以优化性能、资源利用率、功耗和设计复杂度等。
Vivado参数主要包括全局参数、项目参数和IP核参数。
二、全局参数的定义与使用1. 全局参数是适用于整个Vivado设计工程的参数,也称为全局设置。
如工程的编译目标设备、工程的编译方式(综合或实现)等。
设置全局参数可以通过"Tools"菜单中的"Settings"选项进行修改。
2. 全局参数的设置对整个工程具有全局性的影响。
比如,选择适合特定设备的全局参数,可以提高设计的性能和资源利用率。
而选择正确的编译方式,可以加速设计和提高开发效率。
三、项目参数的定义与使用1. 项目参数是适用于特定Vivado设计工程的参数,也称为局部参数。
这些参数可以在特定阶段或特定模块的设计中进行调整和优化,以满足项目的需求。
项目参数可以在相应的设置窗口中进行修改。
2. 项目参数的设置对特定模块的功能和性能具有直接影响。
例如,对于时序约束的设计,可以通过设置相关参数来实现时钟频率的优化和约束的管理。
对于电源管理,可以通过设置参数来控制功耗和能效等。
四、IP核参数的定义与使用1. IP(知识产权)核是Vivado设计中可重复使用的功能模块。
IP核参数是在设计和实例化IP核时设置的参数,用于控制IP核的功能和性能。
VIVADO教程
VIVADO教程Vivado是一种先进的、全面的FPGA设计和开发软件,由Xilinx公司开发。
它提供了设计、验证和实现FPGA和SoC解决方案的全套工具和功能。
本教程将介绍如何使用Vivado进行FPGA设计,包括项目创建、代码编写、仿真和实现等步骤。
1.项目创建在打开Vivado软件后,选择"Create New Project"来创建一个新项目。
按照向导的提示,选择项目名称、存储位置和目标设备等信息。
然后选择所需的工程类型,如RTL项目或IP集成项目。
最后选择工程源文件和约束文件,并点击"Finish"完成项目创建。
2.代码编写在Vivado中,可以使用多种语言编写FPGA设计代码,包括Verilog、VHDL和SystemVerilog等。
创建一个新文件,并将代码粘贴到文件中。
确保代码语法正确,并根据需要修改参数和端口定义。
3.模块综合在完成代码编写后,可以进行模块综合。
在Vivado中,选择"Flow"->"Run Synthesis"来对代码进行综合。
模块综合是将高级硬件描述语言(HDL)代码转换为门级网表的过程。
综合过程将代码优化并生成可实现的网表电路。
4.约束设置在进行设计实现之前,需要定义一些约束条件,以确保设计能够在FPGA上正确运行。
通过约束文件,可以指定时钟频率、I/O电平、时序要求等。
在Vivado中,选择"Design"->"Constraints"来添加约束文件,并根据需要定义约束。
5.仿真在进行设计实现之前,可以使用仿真工具来验证设计的正确性。
在Vivado中,选择"Flow"->"Run Simulation"来打开仿真工具。
在仿真工具中,可以加载测试向量并检查设计的输出。
如果仿真结果与预期一致,说明设计存在问题。
VivadoHLS中函数的层次设计和优化1函数层次设计中函数调用的优化
dint_t tmp_sum, tmp_sub; dint_t tmp_a,tmp_b;
sumsub_func(&A,&B,&tmp_sum,&tmp_sub); sumsub_func(&tmp_sum,&tmp_sub,&tmp_a,&tmp_b); shift_func(&tmp_a,&tmp_b,C,D); }
*outSum = *in1 + *in2; *outSub = *in1 - *in2; }
void shift_func(dint_t *in1, dint_t *in2, dout_t *outA, dout_t *outB) {
*outA = *in1 >> 1; *outB = *in2 >> 2; }
XFORM-602 信息报告了子函数缺省自动 inline 处理,也可以在 analysis 窗口中查看函数的层次结 构如下图:
上图中只有顶层函数 hier_func 保留,子函数全部 inline 掉。 对上面的工程做子函数的inline off约束(#pragma HLS INLINE off
),增加这个约束的目的是要求 HLS 不需要做子函数的 inline,保持所有 C 函数的层次,综合结果 在 analysis 窗口中图示如下:
首先我们建立一个 baseline 设计,增加 inline 约束将函数的层次打平到只有一层,这样可以 做更多跨过层次的优化,同时,对 array 增加 partition 的约束,把 array 映射到 register 上,增加
Vivado HLS工程testbench的三个要素
编写高效Vivado HLS工程testbench的三个要素在C程序的设计中,任何一个C程序的顶层都是main()函数。
而在vivado HLS的设计中,只要函数的层次在main()函数以下,都可以被综合。
但是每个vivado HLS工程只能指定一个top层函数作为输出RTL模块的顶层,其它和这个函数层次平行,不需要被综合的函数都可以作为testbench来使用。
这样就带来一个问题,如何编写vivado HLS工程的testbench更高效,或者说能更好的让HLS工具自动重用C testbench验证产生的RTL代码就变得非常重要。
通常,在Vivado HLS中,好的C testbench设计原则是testbench设计和需要实现的算法函数分别保存在不同的文件中,并且充分利用头文件。
Testbench常常包含了一些HLS综合不支持的操作,比如通过文件的读写取得仿真数据并保存结果,或者打印一些测试结果进行分析。
在头文件中,完成对testbench中所有的数据类型和函数的定义,以及包含共享的设计文件和函数库。
Vivado HLS中,只能指定一个top层函数用于综合,top层函数可以包含多个子函数。
当需要综合多个并行层次的函数时,可以编写一个wrapper函数作为top层函数,将需要综合的多个并行函数封装起来。
C testbench的目不仅是要验证需要综合的top函数功能正确(C编译器验证环境),同时重用C testbench作为综合产生RTL代码的仿真激励,HLS工具自动调用C testbench来验证RTL功能的一致性(C编译器和RTL仿真器的协同仿真环境)。
这样,编写一个好的风格testbench可以很好的提高设计的验证效率,如果在HLS综合前和综合过程中,需要修改综合函数的代码,可以用testbench验证,确保需要综合的C算法功能正确。
Vivado HLS中推荐高效的testbench具有如下三个特征:1.Testbench代码和需要综合的C算法代码保存在不同的文件中(例子1-1)。
学习vivadoHLS第7章例程中文版
学习vivado第7章Lab1——设计优化概述创建高质量RTL设计的一个关键部分是采用高层次综合拥有优化C代码的能力。
高层次综合经常尝试减少循环和函数的延迟。
在循环和函数中为了获得这种目的,高层次综合尝试执行尽可能多的并行操作。
在函数层,高层次综合经常尝试执行并行函数。
除了这些自动优化,指令用于:•并行执行多个任务,例如,相同的函数多次执行或相同的循环多次迭代。
采用流水线。
•调整数组(块RAM),,函数,循环和端口的物理实现用以提高数据的利用率和帮助数据流尽快通过设计。
•提供的数据相依性的信息,或缺少这些信息,从而可进行更多优化。
最终的优化技术是修改的C源代码,以删除非预期依赖关系的代码,这种代码可能限制了硬件的性能教程是由两个实验练习组成。
你可以在这些实验练习中用Analysis perspective来执行分析。
前提条件是完成了本教程的Design Analysis教程Lab1参照循环和函数流水线的使用来创建的设计能够在一个时钟处理一个样本。
这个实验包括一些例子,这些例子给您机会去分析两个通常引起不能满足性能要求导致设计失败的原因:循环依赖关系和数据流限制或瓶颈。
Lab2这个实验展示了怎么从lab1中修改代码来帮助克服一些在代码中无意识存在的内在的性能限制。
教程设计描述从xilinx网站下载教程设计文件,在教程设计中查看信息。
教程所用的设计文件在教程目录vivado_HLS_Tutorial\Design_Optimization你在实验练习中使用的样本设计是一个矩阵乘法功能。
设计目标是在每个时钟周期处理一个新的采样,实现的接口作为数据流传输接口。
Lab1:优化矩阵乘法器这个练习使用矩阵乘法器设计用以展示你如何全面优化设计重点是在循环设计上,设计的目标是用FIFO接口在每个时钟周期读一个样本,同时使用最少资源。
这个分析包括了在使用函数级优化的循环级优化方法的比较。
这个练习解释了用户分析界面视角的基本操作,还有你如何用这个界面来驱动设计优化。
(9条消息)vivadoHLS硬件化指令(三)HLS增大运算吞吐量的硬件优化
(9条消息)vivadoHLS硬件化指令(三)HLS增大运算吞吐量的硬件优化背景:为了更少的时延,我们需要增大吞吐量和流率,因此需要用到下面的优化指令。
目的:熟悉UG902文档中HLS关于增大吞吐量和流率的优化指令。
目录1. Task Pipeline1.1 Rewinding pipelined loops1.2 Flushing Pipeline1.3 Automatic loop pipeline2 Partition Array to improve pipelining3.dependencies3.1 去除false dependencies来改善loop pipeline4. loop unrolling1. Task PipelinePipeline的意思是一个操作并不需要完成所有的步骤,而下一个操作就会开始。
可以用于函数和循环。
如果没有pipeline优化指令,则函数每3个时钟周期读取一个数,每2个时钟周期输出一个数。
函数的Initiation Interval(II)为3,latency为2。
加了pipeline之后,II=1运用循环流水线,可以将一个8时钟周期的循环(II=3)改为4时钟周期。
PIPELINE指令的II(Initiation interval)默认值为1,II可以被确认。
Pipeline指令下面的层级的会被UNROLL,所有的子函数需要被单独的PIPELINE。
函数PIPELINE与循环PIPELINE的区别,如下图:•函数中,PIPELINE会永久运行不结束。
•循环中,PIPELINE指令会一直执行知道所有的循环结束。
1.1 Rewinding pipelined loopsLoops which are the top-level loop in a function or are used in a region where the DATAFLOW optimization is used can be made to continuously execute using the PIPELINE directive with the rewind option.即DATAFLOW指令需要使用PIPELINE的rewind 选项。
高层次综合(HLS)-简介
⾼层次综合(HLS)-简介本⽂是关于Xilinx HLS的简单介绍,从HLS是什么以及HLS的优势出发,进⼀步阐述了其功能,并针对Xilinx官⽅的例⼦对其进⾏了分析。
关键观点包括HLS采⽤C/C++等⾼级语⾔描述功能,可以降低FPGA代码的开发时间HLS的应⽤对象是硬件⼯程师,IP的架构设计依旧由⼯程师⾃⾏指定Vivado HLS提供了⼀套较为完整的代码开发、性能分析和优化、C/RTL仿真、IP导出流程1.使⽤HLS的动机HLS(High Level Synthesis,⾼层次综合)是⼀种代码的综合技术,特别的,本⽂中描述的HLS特指Xilinx FPGA上应⽤的HLS。
FPGA 的基本知识可以从得到。
Xilinx的⽂档《Introduction to FPGA Design with Vivado High-Level Synthesis》中的两幅图可以很好的回答这⼀问题。
上图表明,虽然FPGA具有的⾼的性能,然⽽采⽤RTL设计FPGA代码需要较长的开发时间。
然⽽,采⽤HLS之后,FPGA开发的时间⼤⼤降低了,甚⾄可能低于DSP和GPU;这⼤⼤加速的FPGA的开发时间,使得开发具有了更强的灵活性和⾼效性,HLS的逐步完善使得FPGA的开发⾼效性更进⼀步。
技术的发展使得⼈们可以把精⼒放在设计上,⽽更少的去关注底层的具体实现。
2.HLS是什么?Vivado的HLS⼯具的前世今⽣可以从中看到,这篇⽂章写得很有趣。
HLS是⾼层次综合的的简称,“综合”即“Synthesis”,在ug627《XST User Guide》中解释综合是将程序代码翻译为称为NGC的特殊⽹表⽂件中,这样才能够对其进⾏实现。
⾄于“层次”,或许可以这样理解。
书中⼀般把FPGA设计分为以下⼏个级别(对于这个分级实际上没有⼀个特定的说法,可以参考):系统级算法级RTL级门级、开关级⼀般认为RTL级及以下设计是可⽤的,“层次”即从什么⾓度去描述想要实现的功能。
Vivado HLS工程testbench的三个要素
编写高效Vivado HLS工程testbench的三个要素在C程序的设计中,任何一个C程序的顶层都是main()函数。
而在vivado HLS的设计中,只要函数的层次在main()函数以下,都可以被综合.但是每个vivado HLS工程只能指定一个top层函数作为输出RTL模块的顶层,其它和这个函数层次平行,不需要被综合的函数都可以作为testbench来使用。
这样就带来一个问题,如何编写vivado HLS工程的testbench更高效,或者说能更好的让HLS工具自动重用C testbench验证产生的RTL代码就变得非常重要。
通常,在Vivado HLS中,好的C testbench设计原则是testbench设计和需要实现的算法函数分别保存在不同的文件中,并且充分利用头文件.Testbench常常包含了一些HLS综合不支持的操作,比如通过文件的读写取得仿真数据并保存结果,或者打印一些测试结果进行分析。
在头文件中,完成对testbench中所有的数据类型和函数的定义,以及包含共享的设计文件和函数库。
Vivado HLS中,只能指定一个top层函数用于综合,top层函数可以包含多个子函数.当需要综合多个并行层次的函数时,可以编写一个wrapper函数作为top 层函数,将需要综合的多个并行函数封装起来。
C testbench的目不仅是要验证需要综合的top函数功能正确(C编译器验证环境),同时重用C testbench作为综合产生RTL代码的仿真激励,HLS工具自动调用C testbench来验证RTL功能的一致性(C编译器和RTL仿真器的协同仿真环境)。
这样,编写一个好的风格testbench可以很好的提高设计的验证效率,如果在HLS综合前和综合过程中,需要修改综合函数的代码,可以用testbench验证,确保需要综合的C算法功能正确。
Vivado HLS中推荐高效的testbench具有如下三个特征:1.Testbench代码和需要综合的C算法代码保存在不同的文件中(例子1—1)。
Vivado HLS工程testbench的三个要素
编写高效Vivado HLS工程testbench的三个要素在C程序的设计中,任何一个C程序的顶层都是main()函数。
而在vivado HLS的设计中,只要函数的层次在main()函数以下,都可以被综合。
但是每个vivado HLS工程只能指定一个top层函数作为输出RTL模块的顶层,其它和这个函数层次平行,不需要被综合的函数都可以作为testbench来使用。
这样就带来一个问题,如何编写vivado HLS工程的testbench更高效,或者说能更好的让HLS工具自动重用C testbench验证产生的RTL代码就变得非常重要。
通常,在Vivado HLS中,好的C testbench设计原则是testbench设计和需要实现的算法函数分别保存在不同的文件中,并且充分利用头文件。
Testbench常常包含了一些HLS综合不支持的操作,比如通过文件的读写取得仿真数据并保存结果,或者打印一些测试结果进行分析。
在头文件中,完成对testbench中所有的数据类型和函数的定义,以及包含共享的设计文件和函数库。
Vivado HLS中,只能指定一个top层函数用于综合,top层函数可以包含多个子函数。
当需要综合多个并行层次的函数时,可以编写一个wrapper函数作为top层函数,将需要综合的多个并行函数封装起来。
C testbench的目不仅是要验证需要综合的top函数功能正确(C编译器验证环境),同时重用C testbench作为综合产生RTL代码的仿真激励,HLS工具自动调用C testbench来验证RTL功能的一致性(C编译器和RTL仿真器的协同仿真环境)。
这样,编写一个好的风格testbench可以很好的提高设计的验证效率,如果在HLS综合前和综合过程中,需要修改综合函数的代码,可以用testbench验证,确保需要综合的C算法功能正确。
Vivado HLS中推荐高效的testbench具有如下三个特征:1.Testbench代码和需要综合的C算法代码保存在不同的文件中(例子1-1)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
hier_func
sumsub_func
shift_func
sumsub_func
图 2.1.1 函数层次关系 缺省情况下 HLS 综合会对这三个子函数做 inline 处理,HLS 认为这三个子函数都比较小,所以它 缺省做 inline 处理。在 console 中我们可以看到打印信息:
1.1.1 函数层次变化的判别 如何知道 HLS 综合后函数的层次关系发生变化?简单有效的方法是: 1. 查看控制台 Console 打印信息或者 HLS 自动保存的综合 log 文件。如果在综合过程中,HLS 缺省去掉了有些小的函数的层次,都会打印出这些函数被 inline 的信息,同时,对函数增 加 inline 约束的执行,也报告出来。 2. 检查综合报告后 RTL 模块的层次,虽然函数名称不是完全和 RTL 模块名相同,还是可以通 过 RTL 模块名映射函数名,查看层次的变化。
*outSum = *in1 + *in2; *outSub = *in1 - *in2; }
void shift_func(dint_t *in1, dint_t *in2, dout_t *outA, dout_t *outB) {
*outA = *in1 >> 1; *outB = *in2 >> 2; }
1 函数层次设计中函数调用的优化
在 VivadoHLS 中,除了一些小的函数外,工具缺省不会打破层次关系,也就是说函数调用有 几个层次,综合产生的 RTL 的模块 module 之间也会保持相应的层次关系,除非增加约束打乱这 种层次。
1.1 函数层次的合并和优化
像 RTL 层次优化原理一样,HLS 工程也需要顶层函数,跨过边界没法实现资源和性能的优化, 函数的层次有时候阻碍函数之间的逻辑和性能最优化,我们必须通过改变或者保持函数的层次关 系,满足对资源和性能的要求。
Inline 的典型应用就是进入或者退出函数调用时需要 1 个时钟周期的开销,inline 这个函数层 次意味着减小了 latency 并提高了 throughout。Inline 函数还有其它方法的好处,就是提高函数资 源的共享,并且可以对函数内部的单元做更多的硬件结构优化合并。
如下代码:
void sumsub_func(din_t *in1, din_t *in2, dint_t *outSum, dint_t *outSub) {
XFORM-602 信息报告了子函数缺省自动 inline 处理,也可以在 analysis 窗口中查看函数的层次结 构如下图:
上图中只有顶层函数 hier_func 保留,子函数全部 inline 掉。 对上面的工程做子函数的inline off约束(#pragma HLS INLINE off
),增加这个约束的目的是要求 HLS 不需要做子函数的 inline,保持所有 C 函数的层次,综合结果 在 analysis 窗口中图示如下:
void hier_func(din_t A, din_t B, dout_t *C, dout_t *D) {
dint_t tmp_sum, tmp_sub; dint_t tmp_a,tmp_b;
sumsub_func(&A,&B,&tmp_sum,&tmp_sub); sumsub_func(&tmp_sum,&tmp_sub,&tmp_a,&tmp_b); shift_func(&tmp_a,&tmp_b,C,D); }
VivadoHLS 中函数的层次设计和优化
Xilinx DSP specialist: Harvest Guo
VivadoHLS 中对性能的优化是通过 initiative interval 的优化和 latency 的优化来完成。对启动间隔 II 最小化就是尽可能的提高输入数据之间或者输出数据之间的速率。从输入来看,优化 II 就是尽 可能减少输入数据之间的时钟周期间隔,最大的吞吐率可以达到每个时钟周期有新的数据可以输 入或者数据可以输出。
如果从单个函数设计考虑,检查函数中 loop 循环是否需要设置 pipeline 约束,用于提高循环中 数据处理的吞吐率。
如果设计从函数层次关系考虑,当一个函数包含多个平行子函数的串行调用时,子函数之间存 在数据传递通道时,对子函数间可以采用 dataflow pipeline 策略。
在开始分析 vivadoHLS 设计优化之前,先介绍一下 HLS 中对性能的两个指标,延迟和启动间隔 (initiation interval)。延迟 Latency 和启动间隔 initiation interval 这两个指标一般都是针对不同的 层次结构来说的,对于 C/C++程序来说,它的基本层次元素就是函数 function 和常用到的循环结 构 loop,函数调用和循环嵌套具有不同的层次,如果设计中对层次元素进LS 缺省情况下,每个函数生成对应的 RTL 模块,保持和函数调用相同的层次关系,除非有些 小的函数 HLS 自动 inline 掉。同样的,如果上层函数多次调用同一个子函数,这个子函数对应的 RTL 模块也被多次重用,节约了资源,就如同 RTL 设计时这个模块被例化一样。
当函数很小或者很少的几次调用时,inline 这个函数可能更好的共享资源,这个函数中仅有的 几个单元能够更好的被共享。
1.1.2 通过函数 inline 约束合并函数层次提高性能 函数层次的优化通过 inline 约束来实现,对函数增加 inline 约束,此函数的边界被打开,它内
容直接复制到当前调用的函数中,有关此函数的层次将不存在。Inline 主要用来提高延迟的减少函 数调用的吞吐率,同时带来的负面效应就是常常增加资源的消耗,因为但子函数保持层次时,函 数体本身的资源都可以被共享,但 inline 掉层次后,可能只有子涵体中部分的操作可以共享。