FPGA 入门 —— HLS 入门

FPGA 入门 —— HLS

本片文章主要介绍 Xilinx 的 HLS

HLS 简介

Vivado HLS 是 Xilinx 公司 2010 年收购 AutoESL 以后重新打造的高层次综合工具,它可以让用户通过添加适当的 directives(制导语句) 和 constrains(约束), 将其 C/C++/System C 代码直接转换成 FPGA RTL( Verilog, VHDL, System C )代码。让用户可以在算法开发环境而非通常的硬件开发环境中只需专注于算法规格和算法的 C 实现,Vivado HLS 工具会自动考虑 FPGA 微观实现架构,并可生成可综合的 FPGA RTL 代码

在 RTL 里,设计师不需要考虑怎么构造一个寄存器或怎样安置这些寄存器,而只需要考虑这些寄存器在设计中起到怎样的作用。EDA 工具可以先把RTL转化成数电模型,再由模型转换成一个设备上的具体电路实施方案。所谓"方案"其实就是编译出的文件,这些文件可以用于规定某个自定义设备,也可以用于编程一些现有的设备,比如 FPGA

HLS 则是在这基础上更高层的一种方法,设计师们在 HLS 下需要更多的考虑大的架构而非某个单独部件或逐周期运行。设计师在 HLS 下需要注重的是系统的运行模式,HLS 工具会负责产生具体的 RTL 微结构。最早大多数 HLS 工具是基于 Verilog 的,用户需要使用 Verilog 语言进行描述,工具也通过 Verilog 产生 RTL 。现如今很多 HLS 工具开始使用 C/C++ 作为设计师端的语言。当然,选择 HLS 工具最重要的还是看它能否综合我们需要的程序,而不是它使用什么语言

现在 HLS 已经不止限与 Vivado,Altera Quartus 也已经推出了 HLS 功能

Xilinx 的最新版 HLS 设计工具已经从 Vivado HLS 改为了 Vitis HLS

Vitis HLS (High Level Synthesis)是一种高层次综合工具,支持将 C、C++ 和 OpenCL 函数硬连线到器件逻辑互连结构和 RAM/DSP 块上。(即可以用这些方式来设计IP)

Vitis HLS 可在Vitis 应用加速开发流程中实现硬件内核,并使用 C/C++ 语言代码在 Vivado® Design Suite 中为赛灵思器件设计开发 RTL IP

使用这种方式有很多现成的库,开发效率比 RTL 更高

HLS 开发流程

HLS 相关知识概念

HLS 是高层综合(High level Synthesis),是将 C 或者 c++ 语言编译为 FPGA 能够读懂和运行的 RTL 级

HLS 包含下面这些阶段:

  • scheduling:确定每个时钟周期中执行哪些步骤

  • Binding:确定哪些硬件资源会被用到

  • 控制逻辑提取:提取控制逻辑,创建一个有限状态机(FSM:Finite state machine)来进行RTL的设计

HLS 需要对相应的 c 代码进行下面的综合:

  • Area:用到的 LUT,寄存器,BRAM 和 DSP48 的数量

  • 时延:函数算出所有输出用的时钟周期

  • II(Initiation interval):函数可以接受新的输入数据需要的时钟周期

  • 循环迭代时延:运行一次循环需要的时钟周期

  • 循环间隔时延:新运行一次循环需要的时钟周期

  • 循环时延:运行循环需要的所有时钟周期

vivado HLS 需要进行的步骤:

  • 编译、执行(仿真)、调试相应的 c 语言代码

  • 把c算法综合为 RTL 实现,在这个过程中可以使用优化指令

  • 生成综合分析报告并分析设计

  • 验证 RTL 的实现

  • 打包 RTL 进入 IP 块

vivado HLS 软件需要的输入信息:

  • c 函数用 c/c++、SystemC、OpenCL API 或者 C kernel 写成
  • Constrains:资源限制,例如时钟周期、时钟不确定性、与 FPGA 目标板
  • Directives:可选的过程,来实现特定的优化
  • c 测试台(c test bench)与相关文档
  • HLS 用 c 测试台来仿真c代码并且验证相应用 c/RTL 联合仿真得到的 RTL 输出

vivado HLS 软件输出的信息:

  • RTL 实现文件,用 HDL(hardware description language)语言写成,这是最重要的输出,有两种模式,VHDL 语言和 Verilog 语言。这种实现文件会被作为IP块,并且可以被其他 xilinx 的设计工具所使用

  • 报告文档:综合、c/RTL 协同仿真、IP 封装的输出结果

Synthesis,optimization,analysis:

  • 创建工程,初始 solution

  • 验证相应的 c 没有错误

  • 运行 synthesis 获得一系列结果

  • 分析结果

在HLS中有下面这些优化方法

  • pipeline,在上个进程运行结束前开始下个进程

  • 给函数、循环、区域指定时延

  • 针对具体的操作指令同时运行

  • 选择相应的 I/O 协议确保硬件可以与其他的设施相连接

开发流程

image

总体可以将HLS开发流程概括为4个步骤:

C/C++ 仿真: 添加一个顶层函数,这个函数将来就会映射成RTL电路,之后用一个 C testbench 对这个函数功能进行验证,在算法层面,检验我们的函数是否能够正常工作

C 综合: 综合实际是把 C/C++ 源码综合成 RTL 实现,产生对应的电路,综合阶段会对各种接口的约束(Directive)十分关心,不同的约束会导致在生成电路时的不同实现

C/RTL 协同仿真: 目的是为了确认 C 的逻辑和 RTL 的逻辑是否一致,所以这一步会将 RTL 仿真的生成结果跟第一步的 C 仿真结果进行对比

导出 IP: 最后一步就是 export 导出 IP 了

开发技巧

总体来说,HLS 可以自动完成以下曾经需要手动完成的工作:

  • HLS 可以自动完成以下曾经需要手动完成的工作:

  • HLS 自动分析并利用一个算法中潜在的并发性

  • HLS 自动在需要的路径上插入寄存器,并自动选择最理想的时钟

  • HLS 自动产生控制数据在一个路径上出入方向的逻辑

  • HLS 自动完成设计的部分与系统中其他部分的接口

  • HLS 自动映射数据到储存单位以平衡资源使用与带宽

  • HLS 自动将程序中计算的部分对应到逻辑单位,在实现等效计算的前提下自动选取最有效的实施方式

大多数 HLS 工具需要用户提供功能的规范,交互的描述,一个对接的计算设备,和目标优化方向。而对于 Vivado HLS来说,用户需要:

  • 一个用C/C++/System C编写的函数

  • 一个测试平台用于验证结果(C testbench)

  • 一个FPGA开发版

  • 期望的时钟周期

  • 一个简单的实施指导

根据 Vivado HLS 的使用指南,我们将对我们的输入程序作出以下规范:

  • 不使用动态内存分配(不使用malloc(),free(),new和delete())

  • 减少使用指针对指针的操作

  • 不使用系统调用(例如abort(),exit(),printf()),我们可以在其他代码例如测试平台上使用这些指令,但是综合的时候这些指令会被无视(或直接删掉)

  • 减少使用其他标准库里的内容(支持math.h里常用的内容,但还是有一些不兼容)

  • 减少使用C++中的函数指针和虚拟函数

  • 不使用递归方程

  • 精准的表达我们的交互接口

当 RTL 级的设计可用时,大多数 HLS 工具会进行标准 RTL 设计流。而在赛灵思 Xilinx Vivado 设计套装里进行的是逻辑综合,将 RTL 级设计转换成一个 FPGA 逻辑部件的连线表,这份连线表不仅包含需要的逻辑部件还包含他们的连接方式。Vivado 之后将连线表和目标设备中的可用资源相关联,这个过程被称作布局及布(PAR)。产出的 FPGA 配置被附在比特流(bitstream)上,用户可以将比特流上传到 FPGA 以实现想要的功能。比特流实质上是用二进制表示 FPGA 上每一个可用资源的配置,包括逻辑部件的使用,连线的方式,和片上的内存。大型 FPGA 例如赛灵思 UltraScale FPGA 拥有超过十亿个可配置比特,较小的 FPGA 上也至少有几亿个可配置比特

HLS 对比 Verilog

相比于 Verilog,HLS 能实现的优化十分有限,但是传统的 FPGA 开发,首先写 HDL 代码,然后做行为仿真,最后做综合、时序分析等,最后生成可执行文件下载到 FPGA 使用,开发周期比较漫长,使用 HLS,用高级语言开发可以提高效率

image

理想的方法是将 HLS 代码用于计算密集型部分与手工制作的用于逻辑控制和存储器管理的 HDL 实现相结合。但是,当内存管理和控制逻辑是应用程序实现过程中最复杂,最耗时的部分时(如本文所说),与纯 HDL 设计相比,混合方法可能不会增加太多价值。此外,在这种方法中,HDL 模块将被视为 HLS 设计中的黑匣子,从而阻碍了该工具重新使用 HDL 模块消耗的资源的努力

无论哪种方式,HLS 都会带来自己的挑战,因为它将开发人员的注意力和精力从设计和测试转移到考虑该工具的意外行为,推测该工具为什么分配了这么多资源或产生了那么多延迟。因此,建议开发人员相应地设定他们的期望,并在项目规划中花费大量时间进行优化

HLS 接口管理

HLS 设计的顶层函数的所有实参都需要综合到端口和接口内,在 RTL 设计中,同样这些输入和输出操作必须通过设计接口中的端口来执行,并且通常使用特定 I/O(输入/输出)协议来进行操作

对顶层函数进行综合时,函数的实参(或参数)将综合到 RTL 端口中,此流程称为接口综合(interface synthesis)

看一个简单的例子:

#include "sum_io.h"
dout_t sum_io(din_t in1, din_t in2, dio_t *sum) {
	dout_t temp;
	*sum = in1 + in2 + *sum;
	temp = in1 + in2;
	return temp
}

以上示例包括:

2个输入:in1、in2,这两个输入是按值传递(pass-by-value)

可以进行读取和写入的指针 sum

返回 temp

经过默认接口综合,综合到 RTL 中,得到结果:

image

其中 HLS 会在 RTL 设计上创建 3 种类型的端口:

  • 时钟和复位端口(clock and reset interface)这种我们一般是改不了,暂时先不用关心

  • 块级接口协议(block level interface): ap_start、ap_done、ap_ready、ap_idle

  • 端口级接口协议(port level interface):针对顶层函数和返回值的每个实参而创建的,包括in1、in2、sum_i、sum_o、sum_o_ap_vld、ap_return

块级 I/O 协议

Vivado HLS 使用接口类型 ap_ctrl_none、ap_ctrl_hs 和 ap_ctrl_chain 来指定是否使用块级握手信号实现 RTL

块级握手信号的作用:

  • 表明设计何时开始执行操作

  • 表明设计操作何时终止

  • 表明设计何时处于空闲状态,并且何时准备好处理新输入

其中块级 I/O 协议有 ap_start、ap_ready、ap_idle、ap_done 端口,这些端口的作用如下:

  • ap_start:用于控制块开始处理数据的时间

  • ap_ready:用于指示是否已经准备好开始接受输入

  • ap_idle:用于指示设计是否是处于空闲状态

  • ap_done:是否已完成操作

以 ap_ctrl_hs 的接口类型为例,来讲解:

image

复位后,该IP将会执行以下操作逻辑:

  1. 首先会等待 ap_start 信号变为高,然后才开始操作

  2. 当 ap_start 变为高时,ap_idle 立即变为低,表明设计此时不再处于空闲状态

  3. ap_start 信号保持高电平状态,直至 ap_ready 变为高,当 ap_ready 达到高电平后:如果 ap_start 为高,则开始下一次的输入传输,如果 ap_start 为低,则完成当前的传输,然后停止操作

  4. 读取输入端口上的数据

  5. 将数据写出到输出端口

  6. 当设计操作完成后,ap_done 输出会变为高电平

端口级 I/O 协议

创建的端口 I/O 取决于顶层函数的参数类型以及默认值,端口级 I/O 协议用于对进出块的数据进行排序

根据前面的例子,得出一些结论:

  1. 默认的输入情况下:如果是按值传递(pass-by-value)的实参和指针,都使用简单线性端口来实现,无关联的握手信号,例如前面例子中的 in1和 in2

  2. 默认的输出情况下:如果是用指针来实现的输出,需要指示输出数据何时有效,因此有一个关联的输出有效端口 (sum_o_ap_vld)

  3. 同时支持读取和写入的实参:例如前面例子中的 sum,就需要将其拆分成独立的输入端口和输出端口

  4. 如果函数具有返回值,实现输出端口 ap_return 来提供返回值

端口级 I/O 协议包括了:

  • AXI4接口

  • 无I/O协议

  • 有线握手

  • 内存接口

HLS 关键技术问题于关键技术问题

HLS 协议的小切片方式会生成大量的文件,存储或处理这些文件会造成大量资源浪费。如果要实现数天的时移,索引量将会是个巨额数字,并明显影响请求速度。因此,HLS 协议对存储 I/O 要求相当苛刻

HLS 技术无法直接用于布局布线之后的综合,高级语言仍然需要转换成硬件描述语言。并且一般的C语言学习不会涉及到地址映射、Avalon 总线等,开发起来具有一定难度

猜你喜欢

转载自blog.csdn.net/m0_59161987/article/details/130665101
今日推荐