从目前的高速信号处理、无线通信和图像等应用市场看,FPGA依然是小批量快速交付产品的首选。本文以Xilinx 的Vavado开发套件为例,描述FPGA设计流程和开发方法。所述内容基于此前做的一份PPT的部分内容,若有不当之处,欢迎留言指正。
本文内容主要分为以下四个部分:
FPGA开发流程 Xilinx Vivado开发套件 Xilinx IP库 FPGA仿真 BIT流生成 调试debug
1.FPGA开发流程
在整个项目或者产品研发过程中,FPGA开发一般是在整个项目准备落地的阶段,经过前期的市场、技术合同签订,完成需求分解和系统方案设计,算法链路仿真后,再启动FPGA开发。
FPGA工程师获取任务需求,并根据算法链路进行逻辑开发,仿真验证,再进行综合、布局布线,生成bit流文件,随后与软件、平台等进行联调,协同配合完成系统调试,最后固化版本,完成产品交付和生产。在具体的FPGA开发过程中,要完成某部分功能,可使用IP,没有合适的IP则进行逻辑开发,或者从已有代码库中获取进行移植修改。
随着FPGA器件规模越来越大,单颗芯片可能包含FPGA、ARM、CPU、DSP等构成超大规模的SoC。Xilinx推荐采用UltraFast设计方法学,可以更好地完成整个工程设计。FPGA负责完成底层逻辑设计,软件完成上层应用设计,嵌入式平台完成驱动开发,OM负责人机交互开发。
2.Xilinx Vivado开发套件
FPGA的开发软件通常取决于FPGA厂商,Xilinx公司FPGA主要采用Vivado,早期的ISE已停止更新。Altera(英特尔收购)采用Quartus开发。近年来,国产FPGA厂商也纷纷推出自己的开发环境,构建自己的生态链。
当前Vivado版本已更新到2024.1,安装包大小达到了惊人的107G,网页版虽然不占存储空间,但并不适合企业项目开发。如果纯FPGA开发,建议选择2020版本及以下,如果涉及Versal器件及AI引擎,则选择高版本。
Vivado2018.3是应用较多也比较稳定的一个版本,且可适配复旦微FPGA,对于采用国产FPGA的项目来说,可以减少学习新开发环境的时间。
在Vivado开发环境中,我们通常通过创建.v文件进行逻辑代码开发,如果用ZYNQ器件,还将涉及Block Design。对于一些常用的AXI接口,也可采用Block Design的方式,快速完成接口转换。如果对Vivado开发工具不熟悉,可以在xilinx 官网下载UG910手册,并查阅相关的手册。大部分的开发工具都类似,互相“借鉴”。
3.Xilinx IP库
无论是数字芯片设计,还是FPGA开发,IP都是重要的组成部分。IP经过了大量的验证,虽然也可能存在bug或缺陷,经过反复迭代后,通常来讲是可靠的。
Vivado IP目录中,提供了常用的IP,以及专用IP。不同的Vivado版本,可能包含的IP不同。经过迭代升级或者技术标准更新,IP目录和特性也将可能不同。在FPGA开发时,选用成熟的IP可以节省开发周期,但也存在部分IP需要授权购买,价格不菲。
除了调用IP外,通常会自研开发。部分IP由于太贵,且不自主,需要自研。或者IP由于为了兼容多种场景而消耗资源太多,对于只使用部分功能时,不方便进行修改或裁剪。更多的场景是没有IP可用,需要亲自编写RTL代码并验证。
接口类、通信类、视频图像类和存储类IP,大概分列如下,也是在众多项目中经常使用的IP。
4.FPGA仿真
FPGA开发完成后,需要进行仿真验证,除非是过于简单的模块不需要仿真。任何一个大系统,都是由一个个模块组成,其中任何一个模块存在问题,都会导致整个系统出现异常。仿真虽然不能覆盖所有场景,但能够把前期的设计缺陷尽可能解决。
在仿真时,我们首先需要编写TestBench,并尽可能将激励随机化,覆盖边界条件。仿真工具推荐Modulsim,对于较大的工程,可以更快完成仿真,并查看覆盖情况,且对于修改的v文件,可以方便地重新编译和仿真。仿真可在综合前开始,也可以在综合化开始。通常情况下,我们只做功能仿真,综合或实现后仿真,虽然更精准,但十分耗时。
对于刚接触FPGA的工程师或者学生而言,在仿真阶段,最重要的是TestBench测试平台的编写。在IC行业,验证工程师将专门负责验证DUT设计是否合理,并建立在UVM验证方法学之上。FPGA的仿真验证虽然不像IC验证那样复杂,但需要把bug尽可能先排除掉,以减少后期调试的难度。仿真验证很难做到全部遍历,Cover所有场景,包括异常场景,这就需要搭建起自动化验证平台,让机器去24小时执行测试用例。单个module的仿真最简单,仿真时间短,可以较快发现设计中存在的问题。到了链路级或者子系统级,仿真数据量太大,仿真耗时数小时。因此,能在module中解决的bug,就不要留在系统级再去解决。
5.Bit流生成
FPGA烧录文件是.bit或者.bin文件,这就需要将RTL代码映射成网表,再布局布线生成可执行文件,编程到FPGA中。
在综合、实现和生成bit流过程中,我们需要关注时序和管脚约束,综合和实现策略,以及相应的报告。
时序伪例是最为关注的一个点,需要通盘考虑约束文件、资源消耗和代码设计。不合理或者不正确的约束,必然导致时序不收敛。资源占用率过高、设计不合理,同样会导致时序不收敛。
芯片类型决定了其资源和最高运行的时钟频率,需要在有限的资源下,实现所设计的功能,考验的是工程师的资源评估和选型是否合理。在不可更换芯片的情况下,则考验工程师的设计能力。
要求时序收敛是为了保障逻辑电路运行稳定,满足建立时间裕量和保持时间裕量。在工程bit生成后,我们要关注时序报告,通常情况下,需要确保WNS非负。
做好时序约束是实现时序收敛的必要条件,对主时钟、生成时钟、异步时钟组及IO进行必要的约束,并通过时序分析后,对虚假路径进行剔除。
除了时序问题,我们有时候还必须考虑功耗问题。低功耗设计不止存在于芯片设计,FPGA设计中同样值得考虑,功耗与散热问题关乎产品的使用体验,甚至关乎产品的稳定。
5.调试debug
调试阶段是产品研发过程中最重要的阶段之一,调试完成即宣告研发成功,但过程则相对耗时费力。
FPGA作为硬件,其调试难度远高于软件的调试难度,所以做好系统维测方案将十分必要。通常在FPGA调试阶段,我们会通过加入VIO、ILA等手段,用JTAG调试器对FPGA内部待测信号进行观察或者抓数分析。
VIO提供虚拟的输入输出接口,可将内部关键参数、关键节点计数器等实时显示,同时可以输出某些使能信号用于产生触发条件。
在线逻辑分析仪(ILA)是Vivado中常见的调试IP,可以实时捕获FPGA内部待测信号,观察实时运行状态,并可将捕获的波形数据导出进一步分析。
此外, ILA由于需要消耗BRM及LUT,在FPGA资源有限时,ILA则不可多加。这时候,我们需要考虑将关键维测信息通过某些接口上传到软件平台辅助显示,或者存为类似日志的形式,以便于问题定位分析。
本文所述属于入门级内容,但也贯穿整个FPGA开发流程,其中的每一步都需要细致执行完成一个产品的研发,是整个团队合力的结果。经过每一个项目的洗礼,将积累总结出的经验,再运用到下一个项目中。