Xilinx Vitis HLS教程1--Vitis HLS概述[02/12]

本文介绍了Xilinx Vitis HLS工具,用于将C/C++代码综合为硬件内核,实现高性能和低延迟。Vitis HLS支持高层次综合,包括调度、绑定和控制逻辑提取等阶段,允许在C语言层面开发和验证算法,通过编译指示进行优化。文中通过实例展示了调度和绑定、控制逻辑提取和性能评估,提供了Vitis HLS设计流程的基本概念。


2. Vitis HLS简介

kernel 内核
pragmas 编译指示
FSM,有限状态机 , Finate state machine
synthesize,综合
schedule,调度


Vitis™ HLS是一款高级综合工具,允许 C、C++ 和OpenCL™函数硬连线(hardwired)到器件逻辑结构和 RAM/DSP 块上。Vitis HLS在Vitis应用加速开发流程中实现硬件内核(hardware kernel),并使用 C/C++ 代码为Vivado® Design Suite中的Xilinx®器件设计开发 RTL(寄存器传输设计级别)IP(功能块) 。

在Vitis应用程序加速流程中,Vitis HLS工具可自动执行大部分代码修改,以实现和优化可编程逻辑中的 C/C++ 代码并实现低延迟和高吞吐量。推导出需要的编译指示(pragmas),以为函数参数生成正确接口以及在代码中用pipeline优化循环和函数,这是Vitis HLS在应用程序加速流程中的基础。Vitis HLS还支持自定义您的代码以实现不同的接口标准或特定优化,从而实现您的设计目标。

Vitis HLS设计流程一般如下:
1.编译、仿真、调试C/C++代码;
2.观察report,以分析和优化设计;
3.将C代码综合(synthesize)成RTL设计;
4.用RTL协同仿真器验证RTL实现;
5.将RTL实现打包成编译后的目标文件(.xo),或者导出到RTL IP.

2.1 HLS基础

Xilinx Vitis HLS工具将C/C++方法综合(synthesize)成RTL代码,以加速可编程逻辑。Vitis HLS与Vitis核心开发套件和应用程序加速设计流程紧密集成。

使用高层次综合HLS的好处包括:

  • 在C语言级开发、验证算法,脱离硬件实现细节进行抽象设计;
  • 用C仿真器验证设计,迭代速度远远快于传统RTL设计;
  • 用优化pragma控制C综合过程,以创建更高性能的实现;
  • 从C源码和编译指示中创建多个解决方案,以探索设计空间,找到最佳实践;
  • 快速重新编译C源码,以针对不同平台和硬件;

HLS包括以下阶段:

  1. 根据以下因素做调度(schedule),以决定每个时钟周期内采取什么操作:
    – 某个操作的依赖已经满足或者可用;
    – 时钟周期的长度或者时钟频率;
    – 目标device中,该操作完成所需要的时间;
    – 可用的资源分配;
    – 任何其他的用户自定义优化指示;
    注:有些目标device很快,可以在一个时钟周期内完成多个操作;有些目标device更慢,HLS自动将操作调度到多个时钟周期。
  2. 绑定硬件资源以执行每个调度后的操作,并将算子(如加法、乘法、平移)映射到特定的RTL实现。例如,一个mult算子映射到RTL中的实现可以是组合或者流水线乘法器。
  3. 控制逻辑提取(control logic extraction)创建了一个有限状态机 (FSM, Finate state machine),它根据定义好的调度,对 RTL 设计中的操作进行序列化。

2.1.1 举例:调度和绑定

int foo(char x, char a, char b, char c) {
 char y;
 y = x*a+b+c;
 return y;
}

在这个例子中,HLS调度阶段决定在每个时钟周期做哪些操作:
– 第一个时钟周期:乘法和第一个加法
– 第二个时钟周期:如果第二个时钟周期时第一个加法的结果已经可用,则进行第二个加法,并产生输出
在最终的硬件实现中,HLS将参数实现到顶层函数的输入输出端口,在本例中,参数就是简单的数据端口,每个输入变量是8bit char,输出端口是32bit int。
!注意:在硬件中用C代码的不可忽视的优势是,可以在更少的时钟周期完成所有操作。即使在这么简单的例子中,HLS只用了2个时钟周期,这也比传统的CPU少。

本例中的初始绑定阶段,HLS用组合乘法器Mul实现乘法操作,用组合加法/减法器AddSub实现加法操作。

本例中的目标绑定阶段,HLS用一个DSP模块资源实现乘法和第一个加法。许多应用程序使用在专用 DSP 资源中最佳实现的二进制乘法器和累加器。DSP 模块是 FPGA 架构中可用的计算块,可提供高性能和高效实现的理想平衡。

(下图中两个时钟周期之间的灰色方块表示内部寄存器存储了一个变量。)
在这里插入图片描述

2.1.2 例子:提取控制逻辑和实现I/O端口

void foo(int in[3], char a, char b, char c, int out[3]) {
  int x,y;
  for(int i = 0; i < 3; i++) {
    x = in[i]; 
    y = a*x + b + c; 
    out[i] = y;
  }
}

这个例子中用到的算子还是上一小节的那几个,但是多了一个for循环,而且输入输出带数组(array)。HLS自动从C源码中提取控制逻辑,并在RTL设计中创建一个FSM以将操作序列化。在HLS中,缺省地将数组综合成RAM块,也可以做其他映射,比如:FIFO、分布式RAM、独立寄存器等。当顶层函数的参数带数组时,HLS假定数组映射出来的RAM块在顶层函数之外,并自动创建访问这个RAM块的端口,包括:数据端口、地址端口、芯片使能(chip-enable)端口、写使能(write-enable)信号等。

FSM控制着寄存器存储数据的时机和所有I/O控制信号的状态。FSM从状态C0开始,下一个时钟进入状态C1,接着进入C2、C3。FSM两次从C3状态进入C1状态(下图横线上的x3标记有误),然后从C3状态进入C0状态。
注:这非常类似于 C 代码中的for循环的控制结构。状态的完整序列是:C0,{C1, C2, C3}, {C1, C2, C3}, {C1, C2, C3},C0

b+c最终只进行一次,HLS将这个操作移到循环外的状态C0,每次进入状态C3时就使用这个加法的结果。
x=in[i],FSM在状态C1生成第一个元素的地址,并在C1状态维护一个递增变量记录迭代次数。FSM在状态C2从RAM块中取出in的一个数据并存储为变量x。HLS从端口a读入数据a,并计算产生第一个输出值y。

FSM 确保生成正确的地址和控制信号,以在块外存储值。然后,返回状态C1,从数组/RAM块中读取下一个值。此过程一直持续到写出所有输出。然后,返回状态C0以读取下一个b、c值并重新开始该过程。
在这里插入图片描述
注:图中in_addr上方的加号好像有误,还是我没能理解?

2.1.3 例子:评估性能

下图展示上一个例子在每个时钟周期的状态、读操作、计算操作和写操作:
在这里插入图片描述
这个例子中的性能评估指标有:

  • latency: 9个时钟周期,完成所有3个输出的计算;
  • Initiation Interval: 10个时钟周期,表示从当前函数调用开始,到能开始第二次函数调用之间的时间间隔;
  • Loop iteration latency: 每个迭代耗时3个时钟;
  • Loop iteration interval:两个迭代之间间隔3个时钟;
  • Loop latency:循环一共耗时9个时钟;

2.2 示例和教程

Vitis HLS Tiny Tutorials,托管许多小代码示例,用常见应用展示良好的设计实践、编码准则、设计模式,以及能最大限度地提高性能的优化技巧。
Vitis Accel Examples Repository,包含展示Vitis工具和平台各种功能的示例。通过提供小型工程示例,说明与Vitis应用程序加速开发流的主机代码和内核编程相关的具体方案。这些示例中的kernel代码可直接编译到Vitis HLS 中。
Vitis Application Acceleration Development Flow Tutorials,提供许多教程,可以通过这些教程学习有关工具流和应用程序开发的具体概念,包括使用Vitis HLS作为独立应用程序,以及在Vitis自下而上的设计流程中。


注:暂时不打算看其他教程,我相信教程之间想要教授的知识是有交叉的,因此继续。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值