FPGA设计开发流程
FPGA 的设计流程就是利用 EDA 开发软件和编程工具对 FPGA 芯片进行开发的过程。原理图和HDL(Hardware description language,硬件描述语言)是两种最常用的数字硬件电路描述方法。
开发流程
典型 FPGA 的开发流程一般如下图所示, 其包括功能定义/器件选型、设计输入、功能仿真、综合优化、综合后仿真、实现、布线后仿真、板级仿真以及芯片编程与调试等主要步骤。
1. 功能定义/器件选型
在系统设计之前,首先要进行方案的论证、系统设计和fpga芯片的选择等准备工作。工程师要根据任务要求,比如系统的指标和复杂度,对工作速度和芯片本身的各种资源、成本等方面的权衡,选择合适的设计方案和器件类型。一般都是采用自顶向下的设计方法,先把系统分为若干个基本单元,然后把每个基本单元划分为下一层次的基本单元,这样依次划分后确定好各个模块的功能以及各个模块需要设计的输入输出信号,再通过 EDA 工具进行各个模块的设计。最终要实现的目标是:针对每个输入信号,利用 EDA 工具以及 FPGA 的资源设计出需要的输出信号逻辑。
2. 设计时输入
设计输入是指在 EDA 工具中,通过使用该开发软件设计出所希望得到的系统或电路的一个过程。在日常工作学习中最常使用的方式是通过硬件描述语言( HDL)的方式来描绘设计出最终的数字电路。
以此方式设计电路的过程需要在 EDA 软件上通过文本描述,将实际的电路用硬件语言表述出来。设计好文本后,编译器会将硬件语言进行综合、布局布线,最后转换成一个个的逻辑门、寄存器、数据选择器等实际电路。 设计师接触比较多的 HDL 语言是行为 HDL,其主流语言是 Verilog HDL 和 VHDL,这两种语言都是 IEEE 的标准,虽然两者在语法结构以及设计标准上存在差别,但是都有一个共同的特点:语言与芯片工艺无关。在任一款 FPGA 芯片上,使用任何一种语言都可以设计出想要的数字电路。
第二种设计方式是使用原理图输入的方法进行设计输入。原理图输入方式是一种最直接的描述方式,通过从元件库中调出来需要的器件,画出原理图。使用这种方法具有设计直观且易于仿真的优势,但是设计效率不高,且难以维护改动,对模块的构造和重用的支持度极不友好。当芯片升级后,所有的原理图需要重新进行一定的改动,可移植性很差。
第三种是IP核(实现一定功能的模块叫IP)。IP核的分类:
(1)软核:是用硬件描述语言描述的功能块(即RTL级模块),不涉及电路实现,通常以硬件描述语言HDL源文件的形式以及加密形式呈现。软核只经过功能仿真,需要经过综合以及布局布线后才能使用。优点:灵活性高、可移植性强、允许用户自配置。缺点是对模块的预测性较低,在后续的设计中存在发生错误的可能性。
(2)固核:是指带有布局布线规划的软核,通常以RTL代码核对应具体工艺网表的混合形式提供。将RTL描述结合具体标准单元库进行综合优化设计,形成门级网表,再通过布局布线工具即可使用。核软核相比,固核的设计灵活性较差,但可靠性有较大提高。
(3)硬核:是指布局布线和工艺固定、经过前端和后端验证的设计,通常以网表形式提供,不能修改。硬核复用困难,使用范围较窄,只能用于某些特定应用。
3. 功能仿真
功能仿真也称为综合前仿真,用户设计好数字逻辑后需要检查自己的设计是否符合预期,在不需要综合之前通过仿真软件对电路进行逻辑验证。在功能仿真器件电路可以不用考虑延迟等因素,仅对初步的功能进行检验。通过建立测试平台即 Testbench,利用波形编译器(仿真软件)和硬件描述语言建立好波形文件和激励信号,在仿真软件上会模拟实际电路的波形显示出输出波形信号,并生成报告文件。用户通过观察各个时间点信号的变化情况来验证自己所设计逻辑的正确性。
4. 综合优化
综合就是将高级抽象层次的描述转化成较低层次的描述。综合优化根据目标与要求优化所生成的逻辑连接,使层次设计平面化,供FPGA布局布线软件进行实现。综合优化是指将设计编译成由逻辑门、RAM\触发器等基本逻辑单元组成的逻辑连接网表,而并非真实的门级电路。
5. 综合后仿真
检查综合结果是否与原设计一致,在仿真时,把综合生成的标准延时文件反标注到综合仿真的模型中去,可估计门延时带来的影响,但不能估计线延时。
6. 布局布线
布局布线可理解为利用实现工具把逻辑映射到目标器件结构的资源中从而决定逻辑的最佳布局,选择逻辑与输入输出功能链接的布线通道进行连线,并产生相应文件(如配置文件与相关报告)。 实现是将综合生成的逻辑网表配置到具体的 FPGA 芯片上,布局布线是其中最重要的过程。在完成综合之后,就是相当于有了各种元件, 但如何建立元件之间的连接,就像在 PCB 上把元件放在哪里,元件之间的连接以及相连关系又是怎么样的,这个都是布局布线完成的工作,综合的结果可能每次都一样,但是布局布线的结构基本每次都不会一样。 布局将逻辑网表中的硬件原语和底层单元合理地配置到芯片内部的固有硬件结构上,并且往往需要在速度最优和面积最优之间作出选择。布线根据布局的拓扑结构,利用芯片内部的各种连线资源,合理正确地连接各个元件。
7. 时序仿真
时序仿真,也称为后仿真,是指将布局布线的延时信息反标注到设计网表中来检测有无时序违规(即不满足时序约束条件或器件固有的时序规则,如建立时间、保持时间等)现象。时序仿真使用布局布线后器件给出的模块和连线的延时信息, 在最坏的情况下对电路的行为作出实际地估计。时序仿真使用的仿真器和功能仿真使用的仿真器是相同的,所需的流程和激励也是相同的,唯一的差别是: 时序仿真加载到仿真器的设计包括基于实际布局布线设计的最坏情况的布局布线延时,并且在仿真结果波形图中时序仿真后的信号加载了时延,而功能仿真没有。 由于不同芯片的内部延时不一样,不同的布局布线方案也给延时带来不同的影响。因此在布局布线后,通过对系统和各个模块进行时序仿真,分析其时序关系,估计系统性能,以及检查和消除竞争冒险是非常有必要的。在功能仿真中介绍的软件工具一般都支持综合后仿真。
8. 板级仿真
板级仿真主要应用于高速电路设计中,对高速系统的信号完整性、电磁干扰等特征进行分析,一般都以第三方工具进行仿真和验证,在实际的工作中一般接触较少。
9. 编程与调试
编程是指将 FPGA 开发工具最后产生使用的数据文件(位数据流文件, Bitstream Generation)加载到 FPGA 芯片中。其中,芯片编程需要满足一定的条件,如编程电压、 编程时序和编程算法等,而这些条件一般厂家都会事先完成设计, 设计师直接按照规范操作即可。数据文件下载到 FPGA 芯片中以后还需要进行调试验证,逻辑分析仪(Logic Analyzer, LA)便是 FPGA 设计的主要调试工具。使用 LA 需要引出大量的测试管脚,且 LA 价格昂贵,但是当工程较大、所需要调试观察的信号过多时,仍旧需要 LA 来对芯片内部的信号进行观察验证。