本博客为​​跟Xilinx SAE 学HLS系列视频讲座-高亚军​​的学习笔记。

软件工程师怎么了解FPGA架构

Vivado HLS是将基于C/C++描述的算法转化成相应的RTL代码,最终在FPGA上实现。这就要求软件工程师对FPGA的内部架构有一些基本的认识,目的在于保证生成的RTL代码在性能和资源上能够达到很好的平衡。实际上,C语言与FPGA是有一些对应关系的。比如:

C语言中的数组可对应于FPGA中的寄存器、分布式RAM、Block RAM或者UltraRAM

C语言中的乘加运算可对应于FPGA中的乘加运算单元(DSP48)

但不同于硬件工程师,对于FPGA内部其他资源比如高速收发器等,软件工程师可不必了解。

本讲从软件工程师的视角重点介绍FPGA内部常规逻辑单元,包括查找表(LUT)、乘加运算单元(DSP48)、存储单元(Block RAM)。这三类资源在算法开发中或多或少都会用到,在Vivado HLS的综合报告中也有所体现。

FPGA属于硬件可编程器件,Xilinx的FPGA分为两类:传统的FPGA和SOC

HLS学习笔记——vivado HLS的Design Flow概念_HLS


HLS学习笔记——vivado HLS的Design Flow概念_HLS_02

对于软件工程师,我们更关注的是逻辑单元、内存单元和算术逻辑单元。

HLS学习笔记——vivado HLS的Design Flow概念_状态机_03


逻辑单元包括查找表、多路选择器和超前进位链

HLS学习笔记——vivado HLS的Design Flow概念_数组_04


算术运算单元指代的是DSP48,可以实现乘法、乘加法、乘累加、加法、累加和逻辑运算。

HLS学习笔记——vivado HLS的Design Flow概念_数组_05


内存单元包括Block RAM和分布式RAM(LUT in SLICEM)。在7系列的FPGA中,36kb的BlockRAM可以配置成36kb的FIFO、18Kb的FIFO和18kb的BlockRAM、BlockRAM和BlockRAM。

HLS学习笔记——vivado HLS的Design Flow概念_状态机_06


HLS学习笔记——vivado HLS的Design Flow概念_HLS_07


HLS学习笔记——vivado HLS的Design Flow概念_软件工程师_08

HLS工作机制

有一本书叫做”FSM based Digital Design UsingVerilog HDL”,通过这本书你可以对状态机有进一步的认识。之所以提到状态机,是因为就控制逻辑而言,采用它很方便(当然未必最为高效)。

对软件工程师而言,比如完成两个数组相乘(这里指的是数组中的元素对应相乘),可分为如下几个步骤:

  1. 分别从两个数组中取数
  2. 对两个数执行乘法操作
  3. 将结果写入目标数组
    实际上,这三个步骤就对应了三个状态。Vivado HLS的一个重要工作机制就是提取控制逻辑,这些控制逻辑最终以状态机的形式体现出来。

本讲通过一个简单的具体实例(数组的乘加运算),介绍Vivado HLS的工作原理,包括Scheduling、Binding、Control logic extraction等概念,使得无论是软件工程师还是硬件工程师都可以放心、高效使用Vivado HLS。

HLS学习笔记——vivado HLS的Design Flow概念_HLS_09


在ESL阶段有两种典型方式对整个系统行为进行建模:使用高层次语言-Vivado HLS和基于模型的设计工具-System Generator

HLS学习笔记——vivado HLS的Design Flow概念_软件工程师_10


HLS综合的三个阶段:Scheduling、Control Logic Extraction和Binding。

HLS学习笔记——vivado HLS的Design Flow概念_数组_11


Scheduling抽取每个时钟周期内需要执行的动作,Binding将执行的操作映射到FPGA物理资源上,Control Logic Extraction提取操作之间的关系形成控制逻辑,通常是状态机。

HLS学习笔记——vivado HLS的Design Flow概念_HLS_12


HLS学习笔记——vivado HLS的Design Flow概念_软件工程师_13


HLS学习笔记——vivado HLS的Design Flow概念_数组_14


HLS学习笔记——vivado HLS的Design Flow概念_软件工程师_15

HLS设计流程

传统的RTL设计流程包括设计输入、功能仿真、设计综合、布局布线和系统调试这样的几个步骤,而且这个过程往往需要反复迭代,毕竟通常很难保证功能仿真一次通过或者系统调试没有任何bug。HLS设计流程是基于C的设计流程,因此要在C这个层面完成设计输入和功能验证,同时还要保证生成的RTL代码的功能与对应的C代码的功能完全一致,这就多了一个C/RTL协同仿真(C/RTL Co-simulation)。这样,整个设计流程就包括采用C描述的设计输入、算法功能验证、C综合(生成RTL代码)、C/RTL协同仿真,后续就可以将生成的RTL代码融入的设计中完成RTL的综合与布局布线了。从这个流程中可以看到,HLS设计流程有两个显著特征:在C层面描述算法;在C层面验证算法。这是其相比于RTL更为快捷的一个重要原因。

HLS学习笔记——vivado HLS的Design Flow概念_数组_16


HLS学习笔记——vivado HLS的Design Flow概念_状态机_17


HLS学习笔记——vivado HLS的Design Flow概念_状态机_18


HLS学习笔记——vivado HLS的Design Flow概念_数组_19


第一步做C的仿真 第二步做C的综合 第三步做C和RTL的协同仿真 第四步做导出RTL

可以通过相应按钮综合报告和RTL仿真波形

HLS学习笔记——vivado HLS的Design Flow概念_数组_20


HLS学习笔记——vivado HLS的Design Flow概念_状态机_21


HLS学习笔记——vivado HLS的Design Flow概念_数组_22


HLS学习笔记——vivado HLS的Design Flow概念_软件工程师_23


HLS学习笔记——vivado HLS的Design Flow概念_状态机_24


HLS学习笔记——vivado HLS的Design Flow概念_软件工程师_25

Xilinx相关文档:
ug574: UltraScale Architecture ConfigurableLogic Block
ug573: UltraScale Architecture MemoryResources
ug579: UltraScale Architecture DSP Slice UserGuide

ug902 (v2018.1) High-Level Synthesis : page 6 - page 11

ug902(v2018.1) High-Level Synthesis page 22 - page 63
ug871(v2018.1) High-level Synthesis Tutorial Ch3: C Validation Lab 1, Lab 2, Lab 3
ug871(v2018.1) High-level Synthesis Tutorial Ch8: RTL Verification Lab 1, Lab 2, Lab3