高层次综合(HLS)-简介

    本文是关于Xilinx HLS的简单介绍,从HLS是什么以及HLS的优势出发,进一步阐述了其功能,并针对Xilinx官方的例子对其进行了分析。关键观点包括

  • HLS采用C/C++等高级语言描述功能,可以降低FPGA代码的开发时间
  • HLS的应用对象是硬件工程师,IP的架构设计依旧由工程师自行指定
  • Vivado HLS提供了一套较为完整的代码开发、性能分析和优化、C/RTL仿真、IP导出流程

1.为什么要HLS?

    HLS是FPGA代码的综合技术。FPGA的基本知识可以从FPGA学习之基本结构得到。Xilinx的文档《Introduction to FPGA Design with Vivado High-Level Synthesis》中的两幅图可以很好的回答这一问题。

image

    上图表明,虽然FPGA具有的高的性能,然而采用RTL设计FPGA代码需要较长的开发时间。

image

    然而,采用HLS之后,FPGA开发的时间大大降低了,甚至可能低于DSP和GPU;这大大加速的FPGA的开发时间,使得开发具有了更强的灵活性和高效性,HLS的逐步完善使得FPGA的开发高效性更进一步。技术的发展使得人们可以把精力放在设计上,而更少的去关注底层的具体实现。

2.HLS是什么?

    Vivado的HLS工具的前世今生可以从AutoESL与Xilinx那些人和事中看到,这篇文章写得很有趣。HLS是高层次综合的的简称,“综合”即“Synthesis”,在ug627《XST User Guide》中解释综合是将程序代码翻译为称为NGC的特殊网表文件中,这样才能够对其进行实现。

    至于“层次”,或许可以这样理解。书中一般把FPGA设计分为以下几个级别(对于这个分级实际上没有一个特定的说法,可以参考第13章抽象级别的描述):

  • 系统级
  • 算法级
  • RTL级
  • 门级、开关级

    一般认为RTL级及以下设计是可用的,“层次”即从什么角度去描述想要实现的功能。譬如,a xor b采用门级描述就是a,b是一个异或门的输入;而采用高一点层次描述就是a+b。显然,越低层次的描述越困难,后文例子中也能发现这一点。

   HLS就是从高层次描述,之后综合成可用的网表文件的技术。这里的“高”指采用C、C++等编写程序,而不是传统的HDL语言。然而,实际上Vivado套件中是预先采用Vivado HLS这个软件将C程序转换成为Verilog HDL或者VHDL代码,之后进行下一步操作的,并不是直接综合C代码。

3.Vivado HLS的使用

    《Vivado Design Suite Tutorial :High-level Synthesis》是一本针对Xilinx HLS的很好的入门指南。通过几个具体的例子,文档手把手的介绍了Vivado HLS的使用方式以及功能。本节将更进一步的对其进行补充

3.1 C代码编写

     Vivado HLS实现的最基本的功能是将C/C++代码综合为HDL代码。所以编程使用的语言是C/C++语言。下面是其中的一个例子(代码为Xilinx例程)

 1 *******************************************************************************/
 2 #include "fir.h"
 3 
 4 void fir (
 5   data_t *y,
 6   coef_t c[N],
 7   data_t x
 8   ) {
 9 #pragma HLS INTERFACE ap_vld port=x
10 
11 #pragma HLS RESOURCE variable=c core=RAM_1P_BRAM
12 
13 
14   static data_t shift_reg[N];
15   acc_t acc;
16   data_t data;
17   int i;
18   
19   acc=0;
20   Shift_Accum_Loop: for (i=N-1;i>=0;i--) {
21         if (i==0) {
22             shift_reg[0]=x;
23             data = x;
24     } else {
25             shift_reg[i]=shift_reg[i-1];
26             data = shift_reg[i];
27     }
28     acc+=data*c[i];;       
29   }
30   *y=acc;
31 }
View Code

    代码实现了一个FIR滤波器,输入输出关系如下式所示

    和编写一般的C代码不同,编写HLS代码依旧需要保留硬件的思想,时刻注意硬件的限制。这一点也可以从工具的名字看出,Vivado这套设计套件是提供给硬件工程师使用的。在进行C代码设计之前,我们需要对数据从哪来,写到哪里去,计算过程中的并行度/流水线和各类存储的访问有明确的设计。C代码实际上只是具体设计的描述,其编写方式不是随意的。

3.2 Pragma

    和一般C代码不同,HLS里有特定的Pragma来对代码进行进一步指定,这是因为从C代码中,编译器往往得不到足够的信息来完成优化工作,譬如

  • 数据的输入输出采用何种接口
  • 程序内部的计算并行度是多少
  • 计算过程中是否需要进行流水线设计

    这一些无法在C代码中指定的内容,可以采用Pragma进行指定,以对综合过程进行更高的控制。

譬如在上述FIR滤波器的例子中,可以使用采用更多的资源进行乘加操作,以达到更高的性能,同时对存储进行设计以防止访存的冲突,具体的pragma为

#pragma HLS UNROLL

#pragma HLS ARRAY_PARTITION variable=shift_reg complete dim = 1

3.3 性能分析

    可以在综合后的报告中对Performance进行评估,也可以在Analysis窗口进行其调度的进一步分析,以判断性能是否满足预期,如下图所示

 

    可以看到当了UNROLL LOOP操作后,吞吐量得到了提升(solution3 v.s. solution1)。上述优化以吞吐量为目标的,利用流水结构以及Unrolled loop可以优化吞吐量,原因如下图所示

image

 

image

3.4 C/RTL仿真

    在HLS中进行仿真较为简单,采用testbench完成c语言的仿真后,RTL的仿真过程可由综合器自动完成,点击按钮即可。也可具体查看仿真波形。

3.5 导出IP

 

4. 参考资料

ug902《Vivado Design Suite User Guide:High-level Synthesis》

ug871《Vivado Design Suite Tutorial :High-level Synthesis》

转载于:https://www.cnblogs.com/sea-wind/p/4024665.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Chapter 1: High-Level Synthesis Introduction to C-Based FPGA Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Understanding Vivado HLS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Using Vivado HLS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Data Types for Efficient Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 Managing Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 Design Optimization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 RTL Verification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 Exporting the RTL Design. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 Chapter 2: High-Level Synthesis C Libraries Introduction to the Vivado HLS C Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 Arbitrary Precision Data Types Library. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 HLS Stream Library. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 HLS Math Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 HLS Video Library. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 HLS IP Libraries. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 HLS Linear Algebra Library. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278 HLS DSP Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295 Chapter 3: High-Level Synthesis Coding Styles Introduction to Coding Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297 Unsupported C Constructs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297 C Test Bench. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312 Loops. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324 Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 Hardware Efficient C Code. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 C++ Classes and Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382 Assertions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390 SystemC Synthesis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393 Send Feedback High-Level Synthesis www.xilinx.com 5 UG902 (v2015.4) November 24, 2015 Chapter 4: High-Level Synthesis Reference Guide Command Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414 GUI Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484 Interface Synthesis Reference. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488 AXI4-Lite Slave C Driver Reference. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507 HLS Video Functions Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521 HLS Linear Algebra Library Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580 HLS DSP Library Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589 C Arbitrary Precision Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605 C++ Arbitrary Precision Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619 C++ Arbitrary Precision Fixed-Point Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638 Comparison of SystemC and Vivado HLS Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 662 Appendix A: Additional Resources and Legal Notices Xilinx Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 670 Solution Centers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 670 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 670 Training Resources. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 671 Please Read: Important Legal Notices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 671
HLS(High-Level Synthesis)高层次综合是一种将高级语言描述的硬件设计转化为可综合的硬件描述的技术。其具体流程如下: 1. 高级语言描述:首先,设计师使用高级编程语言(如C或C++)编写硬件行为描述。这些描述通常包括数据流和控制流,并与软件开发类似。 2. 硬件分区:接下来,设计师将硬件描述分解为不同的并行或顺序执行的任务,这些任务可以在不同的硬件资源(如FPGA)上并行执行。 3. 任务调度和优化:在这一阶段,HLS工具试图找到一个最佳的任务调度方式,以最大化性能,并通过减少资源使用来优化设计。 4. 数据流分析:HLS工具将对数据流进行分析,以确保数据的正确性和合理性。这包括对数据依赖关系进行解析,并检查任何潜在的冲突。 5. 控制流分析:在这一阶段,HLS工具对控制流进行分析,并生成状态转换图以描述不同状态之间的关系。 6. RTL生成:一旦数据流和控制流分析完成,HLS工具将生成RTL(Register-Transfer Level)描述,这是一种硬件级的描述,包括寄存器、管道和数据路径。 7. 验证和调试:最后,设计师需要对生成的RTL描述进行验证和调试,以确保硬件功能与高级语言描述一致。 通过这些步骤,HLS可以将高级语言描述转化为硬件级的RTL描述,加速硬件设计的开发和验证过程。它提供了一种高层次的抽象,使硬件设计师能够专注于算法和功能,而不是底层细节。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值