FPGA开发,自然离不开提供的工具链(有业内行家讲:FPGA芯片研发本身的难点也在于其配套的EDA工具,难度高于硬件设计)。
提供FPGA芯片的厂商,都会提供相应的开发工具,工具有好有坏,但哪些功能是最基本的,最应该关注的呢?我今天站在一个初学者的角度,来罗列一下,并给出功能描述。
对于FPGA的开发工具,主要是通过高效的布局/布线工具,从时序,拥塞,线长,利用率,功耗等多维度来加速设计的实现,如何加速呢?就是提供每个阶段分析和优化,这样,可以保证用户在更早阶段,通过工具的调整,缩短设计的迭代过程。当然,对于工具,也会从顶层设计上考虑面向所有的FPGA系列的产品,因为FPGA可能不但容量越来越大,还有采取堆叠技术,提供高速SerDes,模拟ADC,甚至可能内嵌处理器,这些对EDA工具有更大的挑战,我在这里不针对这些特殊场景的开发做说明,只谈最基础的工具链。
对于EDA工具,用户关注的重点是利用率和FMax。对于小器件,会更关注资源占用率,FMax要求会放宽。中高端的器件会对FMax要求高,并且需要高的带宽。
【IDE】
首先,开发工具一定是有一个IDE的,我们先看一下源码编辑器,国内大多数开发还是使用Verilog 或者 SystemVerilog,对于VHDL的使用用户不多,但一般这三种语言都是需要支持的。Verilog是最早的电路设计语言标准,VHDL的语法更严谨,但学习起来更困难,SystemVerilog是从Verilog发展而来的,因为有一些验证语法,所以比较适合于验证时使用。
除了原始的设计输入,一般还需要支持综合后的网表输入,网表指的是RTL代码综合之后与FPGA物理元件相关的逻辑线路图(包括各种Premitive 单元,Net连接线),这非常关键,有点像纯软件领域要支持二进制动态库的导入方式。可以用于保护IP,可以保证并行协同开发,可以保证不会因为综合工具不同效果发生变化。
对于代码编辑器,一般还会提供一些帮助模板,方便用户快速生成一些固定的模板代码。
对于标准开发,我们会习惯使用GUI界面,而对于一些大规模的验证场景,我们可能会使用TCL模式。TCL 是命令行的模式,它可以让你批处理任务,并且提供了更细节的调试手段。
其它一些IDE的通用功能,这里就不关注了。
【Project】
Project基本上是编程工具必不可少的管理/组织方式,对于FPGA的Project,最主要的文件是:设计代码,IP,约束文件(其它略)。FPGA的开发很大一部分工作是在调试。所以,会不断重复执行flow,对于FPGA开发过程中每个flow的状态,尽量要保存,提供检查点,这些检查点需要能够保存中间态和中间运算数据,这样,工作可以持续执行,一些中间数据文件(实际上就是dump了内存的数据和状态)。
Project 还有一个重要的概念,OOC(out-of-context),可以针对某个模块设置为OOC模式,这样该模块会被当做黑盒(black box)对待(在OOC模式下,会单独综合,有单独的网表文件)。其实,对于IP 经常会如此来使用。但注意,如果想使用OOC,是不可以在执行期实例化时进行参数传递的。如果模块中已经包含了IP,该IP也不能是OOC的。
相对于Project,一般还会存在 Non-Project的场景,也就是比较小的设计,不需要做项目管理,轻量级的设计时可以采用,并且这种模式更适合于在批处理的自动化任务中执行。
【Flow】
FPGA开发中,最重要的就是Flow的管理了。Flow大家都清楚,分为综合和实现,下载三大步骤。每个大步骤中还可以细分成一些小的步骤。Flow本身是有严格顺序的,不可以跳跃执行,但是可以同时运行多个flow流水线,并行执行。如果电脑配置允许,可以这样来节约时间。如果你对设计的变化造成flow某些步骤的结果失效,会自动退到失效节点前,或者提示你现在的结果已经和设计不匹配。
Flow 中除了综合,实现是很重要的环节,有不同的调优都是针对实现的步骤,每个步骤又有不同的参数。不同的执行步骤和参数组合达成的效果也会不同。一般会提供一些大的策略供用户选择,
如:针对性能,针对资源,针对功耗,针对运行时间,针对布线拥塞。不同策略采用的步骤和参数大不相同。
对于实现阶段有一个关键特性是增量实现,也就是可以基于某个checkpoint(供参考),做增量的布局/布线,而不是重新布局布线,这样可以节省运行时间,有助于时序收敛。
另外,整体 Flow 的执行也可以从中间开始,比如:基于网表导入来直接进入实现阶段,跳过综合。基于bitstream 直接进行下载,跳过实现。
每个Flow如果存在的crash,会需要有详细的log,提供分析。
【验证】
对于行为级的验证/仿真,实际上和FPGA的关系不大,主要是针对Verilog/VHDL的设计逻辑是否正常的验证。可以使用标准的仿真工具。
对于实现后的时序验证,就和FPGA强相关了,实现后的设计提供了精准的布局布线信息,可用于时序仿真,主要为了验证时序行为和时钟特性。仿真工具本身没有什么差别,只是提供了更多的时延信息。
【调试】
FPGA如何在运行时直接调试,主要依赖于在线的逻辑分析仪。你可以理解在FPGA加了一个埋点程序。设计时可以将想要看的数据通过埋点函数来存储到固定的FPGA内存中(如:block ram),然后,在运行时实时的取回数据,在计算机上进行显示分析。数据的取回依赖于JTAG来实时取数。做法就是埋点(也叫插入探针),将Debug程序编入芯片,运行时通过电脑工具的呈现,实时分析数据。对于数据探针的接入方式,一般可以在HDL中指明,或者在综合后的网表中指定。除了埋点的方式,还有一种是直接监视FPGA内部信号和控制寄存器的方式,也叫做virtual IO,这样可以直接监测某个信号或者动态改变流程。上面2种方式其实都是通过软IP来实现。
在VIVADO中有一种快捷的监视信号的方式,就是使用tcl命令add_prob,但实际上它的底层原理还是使用了一个逻辑分析仪类似的软核IP。
【ECO】
这是一种重要的后期调试工具,可以快速响应设计中小的变更,因为只针对特定逻辑做小的修改。可以直接修改网表,结合约束的设定,保证不对实现做大的修改。这样达到快速完成设计的效果。具体比较复杂,这里不详细描述。
【IP 管理】
IP一般会提供一个IP Catelog,管理所有的IP,这样方便在Project中任意导入IP。
IP的使用一般是很简单的,就是配置一些参数,进行例化。
如果你要生成自已的IP,一般需要使用工业标准 IP-XACT,还需要支持加密,保护设计者的成果。这样可以和其它工具的IP兼容。
对于参数需要的界面,一般是通过配置自动生成的GUI。
IP 也需要提供升级和兼容性的支持,前面讲到,它还可以支持OOC模式。
【设备管理】
这个主要是独立于设计的单独工具,配合下载器和Demo板,完成程序的下载,将flow生成的bitstream通过JTAG或其它方式下载到Demo板的FPGA上。
同时也集成上面提到的调试功能,完成一些在线调试的输出/显示。
【远程调试】
一般FPGA工具还支持远程调试,主要是将EDA工具输出的bitstream通过网络服务,直接下载到远程的开发板上,这样可以提供远程的技术支持,又保护了源码不会流到外端(外端只接收到bitstream)。
【TCL】
一般还会提供 Tcl 环境,重要的操作都需要提供tcl command,并且可以写成批处理文件,进行批量处理。这也是必须的。对于tcl的使用,有几种,一种是纯粹的tcl shell环境,在这种情况下,只会有命令行,没有GUI,还有一种是在GUI存在的情况下,与tcl配合使用。而tcl命令主要是有几种:project,flow(synthesis,map,placement,route),sta,device,ip,netlist,constraints,configuration,debug……)。
【报告输出】
过程中的报告非常重要,支持FPGA 实现各阶段的结果:
如:routing后的布线资源的利用,拥塞情况,时序信息。sync/map输出报告,device model各类资源的总数,Bitgen输出的位流大小,Placement的输出,Timing report.
STA报告summary和detail,有总体数据,也有细节。依赖于 逻辑单元间的连接,逻辑单元内的连接的延迟计算。
【约束】
我们提到约束,主要指是物理约束和时序约束,物理约束主要是 I/O管脚(也还有一些其它指定物理逻辑使用的约束)。时序约束是时序分析的基础。一般FPGA工具会提供PackageView来辅助管理约束的生成,对于时序约束也会有向导编辑器。
约束的话题太大,还需要进一步学习,然后单开主题来分析。这里不再多讲。
【工具】
SchematicView:这个主要是针对逻辑设计的表达(表达逻辑门,寄存器,多路复用器之间的连接关系)。当然,技术映射后,元器件会发生变化,可能也需要重新输出。如果在p&r阶段,调整了逻辑电路,也可能导致视图的变化。对于逻辑电路的呈现,一种是打平的显示,一种是层级的钻入。这看实际需求。
ChipView:这个主要展现芯片的静态结构,以及设计电路电路实现后在芯片上的布局布线。这对于高级开发比较重要。
FloorPlan View:这主要是显示芯片整体视图,以及逻辑的连线关系。
Package View:这个是针对I/O的视图,和IO的物理约束紧密相关。
【系统支持】
大的系统自然是需要支持windows和linux,一般很少需要支持macos的,而对于windows的小版本支持,视需求而异(一般是win10,win11)。而linux的支持,一般是centos,RedHat,而经常有可能需要SUSE的支持(这是德国很早存在的一个在企业界非常有名的操作系统,使用很广)。
【license】
软件要提供license分发功能,并且对于route,placement,sta需要有license的check,对于synthsis,simulation如果是集成三方,还需要有第三方license的集成。
和其它EDA工具的license控制类似,会有IP控制和并发量的控制,一般会有时限。当然,对于芯片厂商,只要购买了芯片,license都是会给的。
以上是胡乱列出的FPGA工具链提供的功能,可能不是很完全。还缺少一些基于Soc或者一些外设(如:Serdes,PCIe)的开发工具,后面有机会再列。