作者:Duoqiang Liu,文章来源: FPGA算法工程师微信公众号
在前面的文章《FPGA工程师的核心竞争力-学习篇(一)》中,提到要做一名合格的FPGA工程师,需要从底层做起,模块编写、工程搭建、系统开发、平台架构设计,到系统级的软硬件全栈能力。对于FPGA工程师而言,概括起来,日常工作主要集中于算法逻辑设计和接口驱动设计。然而,从初级工程师到高级工程师,直至技术专家,不能永远停留在底层设计,有了成熟的逻辑开发经验后,需要往更高层次转变,做系统级设计,达到系统架构师或总师的级别,这时候需要的是全局观。
有没有好的设计方法,可以让工程师们走得更顺利、更远呢?全球数十万FPGA工程师正致力于让系统设计更简单、更高效,具体怎样开展呢?Xilinx隆重推出了UltraFast设计方法论。
关于UltraFast设计方法论
Xilinx推出的UltraFast设计方法论是一整套旨在帮助简化当今器件设计进程的最佳实践。这些设计的规模与复杂性需要执行特定的步骤与设计任务,从而确保设计每个阶段的成功开展。当您遵循这些步骤和最佳实践进行操作,将有助于您尽可能最快且最高效的方式实现期望的设计目标。
具体设计方法论是什么呢?这里提供设计指南:
(1)《UltraFast设计方法指南》(UG949),该指南中描述了各种设计任务、分析与报告功能,以及用于设计创建和收敛的最佳实践。
(2)《UltraFast 设计方法快捷参考指南》(UG1231) 中采用易于使用的双面卡格式着重讲解了主要设计方法论步骤。
(3)《UltraFast 设计方法时序收敛快捷参考指南》(UG1292) 提供了有关时序收敛的建议,包括运行初始设计检查、设定设计基线和解决时序违例。
(4)《UltraFast 设计方法检查表》(XTP301) 可从赛灵思 Documentation Navigator 获取,也可作为独立电子数据表获取。您可使用此检查表来识别整个设计进程中的常见错误和决策点。
(5)《UltraFast 设计方法论系统级设计流程》图展示了 赛灵思 Documentation Navigator 中提供的整个 Vivado®Design Suite 设计流程。您可单击图中的设计步骤以打开相关文档、宣传材料以及常见问题及解答以帮助您入门。
另外建议:除上述资源外,赛灵思建议,处理嵌入式设计时请参阅《UltraFast 嵌入式设计方法指南》(UG1046),使用含基于 C 的 IP 的 Vivado IP integrator 开发复杂系统时请参阅《UltraFast Vivado HLS 方法指南》(UG1197)。
本文主要参考UG949,进行重点阐述。在最新的UG949(2020版)中,共240页,内容主要分为6章,分别为:
•引言
•开发板和器件规划
•利用RTL创建设计
•设计约束
•设计实现
•设计收敛
指点迷津:做任何事情,只讲勤奋努力是不够的,最重要的是找到好的方法可以高效完成任务,这条真理,放之四海而皆准。
引言
介绍UltraFast设计方法论,如何使用该指南,使用UltraFast设计方法检查表,使用UltraFast设计方法论DRC,使用UltraFast设计方法系统级设计流程,以及了解UltraFast设计方法概念。
其中,使用UltraFast设计方法论进行DRC,即设计规则检查,个人觉得很重要,可以为后面节省不少时间。能在综合和实现前搞定的东西,就别留在调试中去,不然累死了还找不到问题原因。
Vivado Design Suite 包含一组方法论相关 DRC,可使用 report_methodology Tcl 命令来运行。此命令针对以下每个设计阶段都具有相应的规则:
• 在综合前,在细化 RTL 设计中用于验证 RTL 结构
• 在综合后,用于验证网表和约束
• 在实现后,用于验证约束和时序相关问题。
建议:为了最大限度发挥作用,请在每个设计阶段运行方法论DRC,并解决其中所有问题,然后再继续执行下一个阶段。
TCL命令其实功能很强大,能完成所有界面引导操作,还能完成在界面引导不能胜任的操作。TCL的用户指南为《Vivado Design Suite Tcl 命令参考指南》(UG835)。
对于UltraFast设计方法系统级设计流程,用一张图来表示最直观:
在UltraFast 设计方法概念中,最重要的思想就是,从设计之初即采用正确方法并尽早关注设计目标(包括 RTL、时钟、管脚和 PCB 管脚分配)至关重要。在每个设计阶段中正确定义和验证设计有助于减少后续实现阶段的时序收敛、布线收敛和功耗问题。
在开发周期早期,需要注意时序设计目标。设计流程的早期阶段(C、C++ 和 RTL 综合)对于设计性能、密度和功耗的影响远超后期实现阶段的影响。因此,如果设计不满足时序目标,建议重新评估综合阶段(包括 HDL 和约束),而不是仅在实现阶段通过迭代来寻找解决方案。图2中关于HLS,高层次综合,主要面对从事软件开发人员,但是他想利用FPGA进行工程设计,说不定他不懂RTL,不懂HDL,因此采用高级语言C或C++来设计。
UltraFast设计方法强调对设计预算(例如,面积、功耗、时延和时序)进行监控以及尽早采取如下措施更正设计的重要性:
• 利用赛灵思模板创建最佳 RTL 结构,并在执行细化后进行综合前采用方法 DRC 来验证 RTL。由于 Vivado 工具从始至终使用时序驱动的算法,设计必须从设计流程开始就得到正确的约束。
• 在综合后开展时序分析。要指定正确的时序,您必须分析设计中每个主时钟及有关生成时钟之间的关系。在 Vivado 工具中,每次时钟交互都必须满足时序要求,除非显式声明为异步时钟交互或伪路径 (false path)。
• 在继续执行下一个设计阶段前采用正确的约束满足时序要求。可遵循如下建议并使用 Vivado Design Suite 的交互式分析环境来加速总体时序与实现收敛。
如能够通过正时序裕度 (positive margin) 或相对较小的负时序裕度 (negative timing margin) 满足设计目标,那么综合即可视为完成。例如,如果综合后未能满足时序要求,那么布局布线结果也不太可能满足时序要求。
时序违例对电路运行会产生较大影响,很可能跑飞,导致逻辑混乱。关于时序约束,在UG949中会讲到。另外,在UG612、UG625、UG903等也有讲到进行时序收敛和约束的方法。
开发板和器件规划
正确规划开发板上的器件朝向并向特定管脚分配信号可以显著提升总体系统性能、降低功耗、提升散热性能并缩短设计周期。将器件与印刷电路板 (PCB) 进行物理或逻辑交互的方式以直观方式展现出来,即可精简通过器件的数据流。
未正确规划 I/O 配置则可能导致系统性能下降和设计收敛时间延长。赛灵思强烈建议在考虑 I/O 管脚分配的同时进行开发板级规划。
当然,对于从事逻辑算法开发的人员,不太关注器件规划,硬件工程师一张原理图和器件表扔过去就可以开始干活了。
这一章就不详细说明了,去官网下载没有兴趣慢慢看吧。
利用RTL创建设计
完成器件 I/O 管脚分配、PCB 布局规划并决定 Vivado® Design Suite 的使用模型后,即可开始创建设计。设计创建包括:
• 规划设计的层级
• 识别要在设计中使用和定制的 IP 核
• 对于没有合适的 IP 可用的互连逻辑和功能,请创建定制 RTL
• 创建时序约束、功耗约束和物理约束
• 指定综合与实现阶段所使用的其它约束、属性及其它元件
创建设计时,主要的考虑要素包括:
• 实现所需的功能
• 按期望的频率运行
• 按期望的可靠程度运行
• 符合硅片资源和功耗预算要求
在此阶段做出的决策将影响最终产品。在这一阶段的错误决策会导致后续阶段问题层出不穷,进而造成整个设计周期中不断返工。在此过程中尽早花时间详细规划设计有助于达成设计目标并最大限度缩短实验室中的调试时间。
特别是开始一个新的项目时,这一步实在是太重要了。我们讲究逻辑,没有逻辑的世界是飘渺的,会导致矛盾重重,做事效率低,漏洞百出。
1.定义理想的设计层级
设计创建的第一步是决定如何对设计进行逻辑分区。定义层级时主要考虑的是如何对含特定功能的设计部分进行分区。
这样便于特定设计人员单独设计 IP,以及隔离一段代码以供复用。
说白一点,就是功能模块划分。一个完整的功能系统,总是由若干个功能单元构成,就好比一个人,眼、耳、口、鼻、四肢、内脏、肌肉,各司其职,同时又协同工作。
但仅根据功能来确定层级会导致对时序收敛、运行时间和调试的最优化方法考虑不周。在层级规划过程考虑如下因素也有助于时序收敛。
1.1 在顶层附近添加 I/O 组件
尽可能在顶层附近添加 I/O 组件,以保障设计可读性。推断组件时,请提供要完成功能的描述。然后,综合工具会对HDL 代码进行解释,以确定使用哪些硬件组件来执行该功能。可推断的组件为简单的单端 I/O(IBUF、OBUF、OBUFT 和 IOBUF)以及 I/O 中的单数据速率寄存器。
1.2 在顶层附近插入时钟元件
朝顶层方向插入时钟元件便于模块间的时钟共享。时钟共享可以减少时钟资源占用,从而提高资源利用率,提升性能,并降低功耗。除了在其中创建时钟的模块之外,时钟路径只能向下驱动进入模块。任何先自上而下而后又自下而上贯穿的路径都会在VHDL 仿真中造成 delta cycle 问题,此类问题的调试既艰难又费时。
1.3 在逻辑边界处寄存数据路径
对层级边界输出进行寄存可将关键路径包含在单一模块或边界内。输入同样可以寄存在层级边界处。相比于遍布多个模块的路径,模块内部的时序路径始终更便于分析和修复。未在层级边界处寄存的任何路径都应采用层级重构来加以综合或者扁平化以便实现跨层级最优化。在逻辑边界处寄存数据路径有助于保留整个设计进程中的可追溯性(用于调试),因为这样可以最大限度避免跨层级最优化,并且逻辑不会跨模块迁移。
模块之间有交互,当一个模块的输出信号送入下一个模块时,最好通过寄存再输出。同样,很多时候为了避免跨时钟处理以及模块复用,会对输入信号进行打拍处理。
1.4 针对功能和时序调试最优化层级
把关键路径限定在同一层级边界内有助于时序的调试和满足时序要求。同样,出于功能调试(及修改)目的,相关信号应限定在同一层级上。这样即可使相关信号的探测和修改变得相对简单,因为当信号限定在单个层级中时,更易于跟踪通过综合对信号名称进行的最优化。
2.IP 的使用
使用预先验证的 IP 核能够大幅减少设计和验证工作量,从而加速产品上市进程。如需了解有关使用 IP 的更多信息,请参阅以下资源:
• 《Vivado Design Suite 用户指南:采用 IP 进行设计》(UG896)
• 《Vivado Design Suite 用户指南:采用 IP integrator 设计 IP 子系统》(UG994)
• Vivado Design Suite QuickTake 视频:在 Vivado 中配置和管理可复用 IP
当然,有时候我们对第三方IP不放心,自己进行IP开发和封装,方便移植和复用。
2.1 规划IP要求
根据所需功能以及其它设计目标,评估赛灵思或其它第三方合作伙伴提供的 IP 选项。
考虑需要使用的接口,例如,存储器接口、网络接口和外设接口。
2.2 AMBA AXI
AXI4 专为高性能、高时钟频率系统设计制定,适用于高速互连。
AXI4-Lite 是 AXI4 的精简版,主要用于访问控制寄存器和状态寄存器。
AXI4-Stream 用于从主接口到从接口的单向数据流。典型应用包括 DSP、视频和通信。
用的最多的算是AXI4-Stream,接口和时序简单,比较方便使用。
关于如何使用IP,就不赘述了,本文的长度已经可以预感,会比较长。
3 RTL 编码指南
可创建定制 RTL 来实现胶合逻辑功能以及不含适合 IP 的功能。
创建 RTL 或例化赛灵思原语时使用 Vivado Design Suite 语言模板。这些语言模板包含建议的编码结构,用于正确推断赛灵思器件架构。使用语言模板可以简化设计进程,并改进结果。要从 Vivado IDE 打开“语言模板”,请选择“Flow Navigator”中的“Language Templates”选项,然后选择所需模板。
在工程开发中,我本人其实没有这样做,习惯于自己创建文件,定义接口,然后进行逻辑设计。当然,好的方法我们要虚心学习借鉴。关注FPGA器件映射的本质,也许会有助于进行RTL设计。
3.1 控制信号和控制集
控制集是控制信号(置位/复位信号、时钟使能信号和时钟信号)的组合,用于驱动任意给定 SRL、LUTRAM 或寄存器。对于控制信号的任意独特组合,都会组成 1 个独立控制集。由于 7 系列 slice 中的寄存器全部共享公用控制信号,导致只能将含公用控制集的寄存器封装到相同 slice 中,因此该功能十分重要。例如,如果具有给定控制集的寄存器仅具有 1 个寄存器作为负载,那么其占据的 slice 中的另 7 个寄存器将变为不可用。
复位
复位是需要在设计中考虑并加以限制的较为常见且重要的控制信号之一。复位会对设计的性能、面积和功耗产生显著影响。
多路复用器的输入输出中所描述的异步复位可能导致将寄存器放置到 slice 中而不是放置到 DSP 块中。在此类情况下,将使用额外逻辑资源,从而对功耗和设计性能产生负面影响。
使用复位的时间和位置
赛灵思器件具有专用的全局置位/复位信号 (GSR)。在器件配置结束时,此信号会设置硬件中所有时序单元的初始值。
谨慎判断何时设计需要复位以及何时不需要复位。大多数情况下,在控制路径逻辑上可能需要复位以确保正常运行。然而在数据路径逻辑上通常不需要复位。复位的使用限制如下:
• 限制复位信号线的总体扇出。
• 减少复位布线所需的互连数量。
• 简化复位路径的时序。
• 在大多数情况下,这样即可整体改进性能、面积和功耗。
同步复位对比异步复位
如需复位,赛灵思建议使用同步复位。同步复位相比于异步复位具有诸多优势。详细说明,参考UG949。
3.2 掌握推断的结果
代码最终必须映射到器件中存在的资源上。请尽力理清所处理的关键架构中的关键算法、存储和逻辑元件。这样在对设计功能进行编码时,即可预测代码将映射到的硬件资源。
3.3 有助于提升性能的编码方式
关键路径上的高扇出
高扇出信号线在设计进程早期阶段更便于处理。性能要求和路径的结构往往会导致高扇出问题。
流水线设置注意事项
另一种提升性能的方法是对具有多个逻辑层次的长数据路径进行重构并将其分布在多个时钟周期中。此方法可加速时钟周期并增加数据吞吐量,但代价是时延和流水线开销逻辑管理工作增加。
自动流水线设置注意事项
可以选择在布局期间插入额外的流水线寄存器,以解决特定总线和接口上的时序收敛难题。
3.4 提升功耗的编码方式
•时钟或数据路径门控
•最大限度增加门控元件数量
•使用专用时钟缓存的时钟使能管脚
•无需优先级编码器时使用 Case 块
由于篇幅较长,先到此为止,下篇我们将针对设计约束、设计实现和设计收敛进行学习分析。
参考文献
[1]Xiinx ,《UltraFast设计方法指南》(UG949)。