【读书笔记】《深度神经网络FPGA设计与实现》(孙其功)第六章 FPGA神经网络计算的RTL级开发

一. 搭建开发环境

FPGA开发首先需要明确开发环境,合适的开发环境不仅可以提高开发效率,在后端布局布线环节还可以提高项目实现的性能和质量。FPGA神经网络算法的RTL级开发需要根据所选的FPGA芯片来确定合适的开发环境。
  如果开发芯片是Xilinx FPGA,则综合布局布线集成工具可以选择ISE(Integrated Software Environment,集成软件环境)或者Vivado。Quartus则是英特尔FPGA需要的开发软件。需要注意的是,无论是Quartus还是Vivado等工具都有众多子版本,开发者需要根据自己所选芯片的具体型号以及不同的开发方式,到官方网站选择合适的版本。

二. RTL级开发的优势与劣势

理解了RTL级开发的层次定位,就很容易理解RTL级开发FPGA的优势:
(1)  RTL级开发可以更清晰准确地描述电路结构,提高设计稳定性;
(2) 实现预定义逻辑功能所需的FPGA芯片内部资源由设计者控制,通常相对于更高层级的开发方式更节省资源;
(3) 设计者可以在RTL级开发过程中,提前考虑芯片内部结构和描述电路的匹配关系,更有利于后端布局布线,提高整体设计性能。
当然,RTL级开发也有劣势,且其劣势也很突出:
(1) 开发难度大,不仅要求开发者自身的技能水平高、开发经验丰富,而且要求开发者深刻理解所开发的FPGA芯片内部资源结构的细节,并做到开发的电路和FPGA芯片资源完美匹配;
(2) 开发效率低、周期长,RTL级项目的开发通常需要数月甚至以年为单位的开发周期;
(3) 修改迭代周期长、成本高,RTL级开发描述的是电路的数据流,修改功能需求就相当于修改电路数据流结构,修改所需投入的时间和人力成本都相对较高。

三. RTL级开发的基本流程

FPGA项目RTL级开发通常都是系统级工程,环节多且过程复杂,从项目需求理解、方案评估、芯片理解、详细方案设计、RTL级代码设计、仿真、综合、布局布线、时序分析与优化、测试,到最后验收,一整套流程环环相扣,相互影响、相互依赖,每一个环节都需要高质量完成才能确保整个项目到目标,如图所示。
在这里插入图片描述

1. 需求理解

在FPGA项目开始之前,必须充分理解项目的详细功能需求以及各功能的性能指标。在项目需求理解阶段,需要根据项目功能需求和性能指标,分析项目所需的FPGA资源数量、设计复杂度、通信带宽、带宽计算等关键技术瓶颈;同时,需要确认项目的时间要求、验收标准、验收环境等,并给出详细的需求理解报告。

2. 方案评估

根据需求理解报告,对需求理解报告中各因素进行权衡,选择合适的器件和设计方案,并给出方案评估报告。通常,FPGA设计方案评估报告包含FPGA芯片选型、FPGA开发环境选择、FPGA整体功能结构、关键技术瓶颈解决方法、FPGA系统数据流、FPGA系统控制流、FPGA时钟系统结构、FPGA复位系统结构等信息。

根据需求理解报告,对需求理解报告中各因素进行权衡,选择合适的器件和设计方案,并给出方案评估报告。通常,FPGA设计方案评估报告包含FPGA芯片选型、FPGA开发环境选择、FPGA整体功能结构、关键技术瓶颈解决方法、FPGA系统数据流、FPGA系统控制流、FPGA时钟系统结构、FPGA复位系统结构等信息。其中,FPGA芯片选型需要考虑设计方案所需的FPGA内部资源数量、FPGA芯片成本、技术熟悉度等诸多因素。FPGA芯片内部资源又包括I/O资源、时钟资源、逻辑资源、RAM资源、DSP资源、高速接口资源、硬核IP等。选型通常需要平衡各种资源需求,并优先考虑关键资源瓶颈。

例如,在神经网络计算加速设计中,通常需要优先考虑DSP数量、BRAM数量以及所支持的外部存储最大带宽(与I/O数量、I/O速度、外部存储控制器IP个数有关)。图6-5为FPGA引脚资源评估示例。

3. 芯片理解

在方案评估完成并通过审核后,通常并不推荐直接进行FPGA的详细方案设计。在此之前,我们建议设计者对方案评估报告中所选择的FPGA芯片进行充分的学习和理解,这一环节很容易被忽略,然而这一环节却极其重要。一个好的FPGA设计一定是建立在对FPGA充分理解的基础上的,只有对FPGA内部每个资源有了充分的理解,才能正确地使用FPGA,才能使设计的电路完美地和FPGA芯片相匹配,也才能发挥FPGA最佳的性能和工作状态。在此环节,需要详细了解FPGA内部的基本逻辑单元、I/O资源、时钟资源、DSP资源、RAM资源、硬核IP等各种资源的详细内部结构和它们的使用方法,如图所示。
在这里插入图片描述

首先需要了解所选FPGA内部的基本逻辑单元结构,了解芯片内部有多少个ALM,它们可以工作在哪几种模式下,每个ALM内有几个输入查找表、几个触发器、多少加法器、多少进位链和布线资源,以及布线资源可以走的路径有哪些。图为Intel Arria 10 FPGA内一个基本逻辑单元结构。
在这里插入图片描述

下图为Intel Arria 10 FPGA芯片内的一个IOE(In-Out Element,输入/输出单元)内部结构,其中既有输入/输出和三态控制用寄存器,又有I/O延迟电路,同时还有三态门控制器和上下拉电路,以及大量的布线资源。该电路可以在不同的设计场景下选择不同的资源满足项目的设计需求。
在这里插入图片描述

下图为Intel Arria10 FPGA芯片内的一个DSP内部结构,其中含有2个乘法器、4个加法器、四组寄存器以及相应的布线资源,在不同的设计场景下可以选择不同的资源满足项目的设计需求。
在这里插入图片描述

4. 详细方案设计

(1) 整体功能结构设计是设计方案的概览,是自顶向下设计中的顶层设计。
下图为某项目的整体功能结构图,从图中可以看出,该项目整体结构包含一个EDK(Embedded Development Kit,嵌入式开发套件)软核、DDR3(一种计算机内存规格)控制器、VbyOne(专门面向图像传输开发的数字接口标准)接口控制器、HDMI(High Definition Multimedia Interface,高密度多芯片互连接口)控制器等模块,同时整体结构图也描述了视频数据流和控制流。 
在这里插入图片描述

(2) RTL阶层设计是模块化分层设计的思想体现。下图是某项目RTL阶层设计图,其中FPGA_TOP为该项目的顶层设计,其他模块为项目各功能子模块设计以及它们之间的阶层归属关系。

在这里插入图片描述
(3) 时钟系统设计是FPGA方案设计的重要环节。
下图为某项目的时钟系统设计图,该项目中各功能模块设计所需的时钟不同,不同的用户时钟分别接到了各自驱动的模块端口上。
在这里插入图片描述
(4) 复位系统设计与时钟系统设计同等重要,它需要将FPGA芯片内的所有复位信号规划清楚,并明确每个复位的输入源、生成复位信号的拓扑结构以及每个复位信号所驱动的模块。FPGA复位系统的好坏关系到FPGA设计的稳定性、适应性和逻辑自恢复能力等重要指标。

下图为某项目的复位系统设计图,该项目中各功能模块设计所需复位时间和解除的复位时间不同,不同的复位信号分别接到了各自控制的模块端口上。

在这里插入图片描述
(5) 接口定义及时序设计。详细方案设计需要将各模块之间的接口定义清楚,为下面的RTL输入阶段提供标准,也为不同的设计者协同工作提供支撑。
(6) 各子模块设计。详细方案设计需要将子模块内部的功能实现电路描述清楚,为下面的RTL输入阶段提供标准,也为不同的设计者协同工作提供支撑。
(7) 寄存器系统设计。下图是某项目的寄存器地址映射图,分为系统寄存器、SPI控制寄存器、数据上传管理寄存器、数据下载管理寄存器,并详细列出了各寄存器名及其地址信息。
在这里插入图片描述
下图是某项目的控制寄存器详细说明图,其中包含寄存器的地址(0x0100)、寄存器功能(DMA控制寄存器)、寄存器每比特的含义以及寄存器的初始值(0x00000000)。
在这里插入图片描述
(8) FPGA与软件交互流程设计。
下图是某项目软件系统启动PCIE DMA的软件和FPGA交互流程图。从图中可以看出,计算机若要通过DMA将数据写到FPGA,软件需要先配置FPGA寄存器、FPGA命令缓存和数据缓存,然后配置FPGA发起DMA传输,DMA结束后主动发出中断告知上位机动作结束。
在这里插入图片描述

四. RTL级HDL设计输入

RTL级设计输入是将详细方案书中所设计的系统或电路以RTL级描述形式表示出来,并输入给EDA工具的过程,通常使用VHDL或Verilog语言来描述所设计的电路。需要注意的是,RTL级描述的目标对象是可综合、可映射为电路的结构,并且可直接用综合工具生成网表文件的电路,并且必须可以直接映射布局布线到FPGA芯片内。RTL设计者在描述电路的过程中需要时刻思考两件事,一是描述的电路是否符合详细设计方案书的功能要求,是否是最佳电路结构;二是描述的电路在FPGA芯片内部用什么资源实现,是否是最佳实现方式。

以下为加速云某项目中寄存器写控制模块的部分代码示例。
在这里插入图片描述
在这里插入图片描述

五. 功能仿真

功能仿真也称为前仿真,是在编译之前对用户所设计的电路进行逻辑功能验证,此时的仿真没有延迟信息,仅对初步的功能进行检测。

FPGA的仿真通常分为如下五步来完成:
(1) 分析、理解FPGA项目需求和FPGA设计方案。
(2) 设计FPGA仿真方案书。通常,FPGA仿真方案书包含仿真环境选择、仿真Case设计和仿真系统结构设计(激励生成系统、结果校验系统、报告生成系统等)。
(3) 编写仿真系统结构代码和仿真Case代码。
(4) 按仿真Case清单逐条仿真(大规模设计中,此步骤通常用批处理自动完成)。
(5) 提交仿真报告书(含仿真Case正确性报告和仿真覆盖率报告)。

下图为加速云自动化仿真系统的仿真平台环境和仿真界面,其仿真过程通常通过批处理的形式自动进行,并通过log文件报告仿真结果。如果仿真发现设计错误,log中会详细报告错误代码、错误类型、错误详细波形文件,供设计者查阅参考。
在这里插入图片描述

六. 综合优化

综合就是将较高级抽象层次的描述转化成较低层次的描述。综合优化根据目标与要求优化所生成的逻辑连接,使层次设计平面化,供FPGA布局布线软件进行实现。就目前的层次来看,综合优化(Synthesis)是将输入编译成由与门、或门、非门、RAM、触发器等基本逻辑单元组成的逻辑连接网表,并非真实的门级电路。真实、具体的门级电路需要利用FPGA制造商的布局布线功能,根据综合后生成的标准门级结构网表来产生。

七. 布局布线与实现

布局布线可理解为利用实现工具把逻辑映射到目标器件结构的资源中,同时决定逻辑的最佳布局,选择逻辑与输入/输出功能链接的布线通道进行连线,并产生相应的文件(如配置文件与相关报告);实现是将综合生成的逻辑网表配置到具体的FPGA芯片上,而布局布线是其中最重要的过程。布局将逻辑网表中的硬件原语和底层单元合理地配置到芯片内部的固有硬件结构上,并且在速度最优和面积最优之间做出选择;布线根据布局的拓扑结构,利用芯片内部的各种连线资源,合理正确地连接各个元件。

八. 静态时序分析与优化

静态时序分析是指将布局布线的电路在不模拟的条件下,通过计算电路的延时来检测有无时序违规(即不满足时序约束条件或器件固有的时序规则,如建立时间、保持时间等)。
时序优化是指通过合理约束、修改设计(插入寄存器、并行结构、逻辑展开、寄存器平衡、路径重组)、手工修改布局布线等方式反复优化综合布局布线,使得时序逐渐收敛,从而满足设计要求的过程。

九. RTL级神经网络加速设计流程

在确认了用FPGA加速的算法结构、计算精度和加速效果后,就可以按FPGA设计开发流程进行加速设计了。FPGA的设计流程通常包括设计需求理解、方案评估、芯片理解、详细方案设计、RTL设计输入、仿真、综合、布局布线、时序优化、芯片编程与调试。其中,详细方案设计最为重要,关系到整体FPGA加速方案的设计质量和开发效率。

FPGA神经网络加速方案的设计除了要考虑时钟系统、复位系统、数据流、控制流以外,以下几点需要重点考虑:
(1) 如何设计RTL层级结构?
(2) 如何调度这些计算因子以组成不同的单层计算?
(3) 如何平衡设计中不同层级、不同计算因子之间对计算带宽和存储带宽的不同需求?

十. RTL级神经网络加速仿真

RTL级神经网络设计的仿真通常难度较大且仿真时间较长。神经网络结构通常由卷积、池化、全连接以及各种非线性函数组成,网络层数多且结构复杂,并且每一层网络的参数规格和大小都可能不一样,这就产生了两个问题,一个是单Case仿真数据量较大、时间较长;另一个是神经网络设计各层各环节所组合的仿真Case数量极其庞大。

为了提高神经网络设计仿真的效率,通常先将神经网络按两个维度进行拆解来单独仿真,然后进行功能性系统仿真。拆解的两个维度分别是计算因子维度和层级维度,计算因子维度是指对神经网络中所包含的卷积、池化、全连接以及各种非线性函数等进行单独仿真;层级维度是指对神经网络各层级进行单独仿真。在计算因子维度和层级维度仿真的基础上,再进一步进行系统级功能仿真。需要特别注意的是,由于神经网络结构中可能存在大量的卷积、池化、全连接等计算,且各层的卷积大小、个数以及步幅等都不尽相同,因此需要对FPGA设计中各种边界问题,包括计算边界和存储边界进行严格的覆盖性仿真。

使用FPGA进行神经网络计算加速设计,通常都需要做大量的时序优化工作。一方面,神经网络加速设计本身对时序的要求比较高,时序越好,FPGA工作的时钟频率就越高,加速效果就越好;另一方面,神经网络设计中存在的复杂网络层级关系以及各层可能存在的不同的卷积、池化、全连接、非线性函数的计算使得FPGA设计中存在大量的运算组合逻辑和数据流路径选择逻辑,并使得FPGA设计中存在极其复杂的布线结构,直接导致了使用FPGA进行神经网络加速设计的时序很难有较高的频率。

面对RTL级神经网络加速设计的时序优化,我们首先需要理解的是,优秀的时序是设计出来的,而不是优化出来的,所有的后端优化工作都只能起到锦上添花的作用。优秀的时序表现需要在前期方案评估阶段、芯片理解阶段、详细方案设计阶段以及RTL输入阶段都做出相应的有关优秀时序的思考。

首先,在方案评估阶段需要对神经网络各层级架构以及各层计算所需的FPGA资源(特别是存储资源、计算资源、布线资源、IO资源等)做充分的理解和计算,并选出合适的FPGA芯片;其次,在芯片理解阶段,需要详细地了解所选FPGA内部关键资源数量、资源内部硬件结构、使用方法以及其在FPGA内部的位置,在后面的详细方案设计和RTL描述设计过程中应熟练应用芯片各种资源特性,做到设计和芯片完美匹配,并充分利用每一个FPGA内部资源且充分发挥每一个FPGA内部资源的特性,至少做到不浪费资源,且不改变综合布局布线总体形状,因为能真正理解设计思想和设计意图的永远是设计者而不是工具。

在优秀的时序设计的基础上,必要的时序优化工作可以起到画龙点睛的效果。时序优化工作往往需要反复地优化综合布局布线,使得时序逐渐收敛,从而满足设计要求。时序优化有很多种方式,面对不同的设计有不同的优化方式,因此选择正确的优化方式至关重要。首先,在时序优化之前,需要让设计工具“明白”设计者的真正意图,从而让设计工具以最优的方式达成设计者的目标。

让设计工具“明白”设计者的意图,最重要的是进行正确的时序约束,包含时钟约束、偏移约束、建立分组、多周期约束、假(FALSE)路径约束等,必要的时候配合指定资源位置、指定资源区域、指定资源路径等约束方式,其目的只有一个,让设计工具把主要的贡献和最优的路径交给最难达成的时序资源和最需要关注的时序路径。其次,选择合适的综合布局布线配置,如综合布局布线的努力程度,速度优先还是面积优先,是否允许工具增加寄存器降低扇出,是否允许删除重复逻辑等。如果以上两项实施后依然无法达成时序目标,就需要用人工的方式优化时序。

首先通过时序分析报告找出时序不满足的关键路径,对时序不满足的路径进行逻辑分析和布局布线分析,找出时序不满足的真正原因;如果是因为工具不够智能,未能“明白”设计者的意图或是没有选择合适的路径,设计者可以通过手工布线的方式调整关键路径;而如果是因为组合逻辑太大,或者是因为扇出太多,又或者是布线确实无法缩短路径,就需要设计者修改RTL代码,可通过拆分组合逻辑、增加寄存器层级、复制逻辑等方法来解决。

🚀 获取工程代码及更多详细资料可点击链接进群领取,谢谢支持!👇

点击免费领取更多资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值