DSP

FPGA基础知识(二)HLS相关知识

2019-07-13 18:11发布

本文档是我在实践将简单的神经网络LeNet-5实现到Xilinx 的zynq的FPGA上遇到的问题和解决方法。 本文档为实现相应操作所需掌握的背景知识,有了这些基础之后才能进行后面相应的软件操作。需要反复阅读相关概念,这样在运行相应软件时才能明白每个步骤的意义。 FPGA基础知识参阅我之前的文章:

FPGA入门教程:赛灵思文档解析UG998 FPGA设计与vivado高层次综合介绍(一)

  完成LeNet-5的FPGA实现可能需要用到和查阅的文档有: UG902:Vivado Design Suite User Guide: High-Level Synthesis: 该文档主要涉及vivado HLS的理解,vivado HLS软件的初步使用,以及相应的HLS相关的c语言库等,我们主要关注该文档的第一章:用vivado HLS软件实现HLS(高层综合High-level Synthesis) UG871:Vivado Desigh Suite Tutoril:High-level Synthesis: 该文档主要涉及vivado HLS软件的具体操作过程,包括HLS的介绍、c的验证、管脚综合、任意精度数、设计分析、优化分析、RTL验证、用HLS生成集成IP、在Zynq的AP Soc设计中用HLS生成的IP、这个文档是操作的重点。  

HLS相关概念(UG902 v2016.4第一章中的内容)

我们需要明白在HLS过程中发生了什么,HLS是高层综合(High level Synthesis),是将C或者c++语言编译为FPGA能够读懂和运行的RTL级别的语言。通过HLS这个过程可以显著加快FPGA的设计进程,而不用从底层的FPGA语言编起。 HLS包含下面这些阶段
  • scheduling:确定每个时钟周期中执行哪些步骤
  • Binding:确定哪些硬件资源会被用到
  • 控制逻辑提取:提取控制逻辑,创建一个有限状态机(FSM:Finite state machine)来进行RTL的设计。
HLS需要对相应的c代码进行下面的综合:
  • 函数层面的c语言参数综合为相应的RTL 的输入输出管脚
  • c函数综合为RTL块架构
  • c中的循环初始状态下还是循环执行:通过优化方案可以将循环展开
  • c中的数组会被综合为FPGA中的块RAM或者UltraRAM
HLS创建一个优化的方案,评价标准有下面这些:
  • Area:用到的LUT,寄存器,BRAM和DSP48的数量
  • 时延:函数算出所有输出用的时钟周期
  • II(Initiation interval):函数可以接受新的输入数据需要的时钟周期
  • 循环迭代时延:运行一次循环需要的时钟周期
  • 循环间隔时延:新运行一次循环需要的时钟周期
  • 循环时延:运行循环需要的所有时钟周期
UG902文档v2016.4中9-13页具体举了两个具体的例子来了帮助理解HLS的schedule、binding和控制逻辑提取工作,这里我们跳过暂不讨论,如果以后用到可以回来看加深理解。 vivado HLS需要进行的步骤:
  1. 编译、执行(仿真)、调试相应的c语言代码
  2. 把c算法综合为RTL实现,在这个过程中可以使用优化指令
  3. 生成综合分析报告并分析设计
  4. 验证RTL的实现
  5. 打包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封装的输出结果。
  下图1-4为vivado HLS所需要的输入输出。   Synthesis,optimization,analysis
  1. 创建工程,初始solution
  2. 验证相应的c没有错误
  3. 运行synthesis获得一系列结果
  4. 分析结果
在HLS中有下面这些优化方法
  • pipeline,在上个进程运行结束前开始下个进程
  • 给函数、循环、区域指定时延
  • 针对具体的操作指令同时运行
  • 选择相应的I/O协议确保硬件可以与其他的设施相连接
  了解这些知识之后,我们就可以开始运用vivado HLS进行相应的IP生成了。