FPGA之道(18)FPGA设计的编译过程

前言

这里所谓的FPGA设计的实现过程不是说等价于Implementation,而是整个FPGA设计从设计的描述、编译到最终配置文件形成的一整套过程。
下面根据《FPGA之道》的描述来看这个过程。

FPGA设计的实现过程

在FPGA顶层模块的门级仿真环节之前,甚至更早,编译器就介入到了FPGA项目的开发工作之中。前面介绍的所有环节,主要是为了保证HDL代码以及约束文件的正确性、可行性,但是将HDL代码和约束文件转换为FPGA芯片上实际的数字电路,即FPGA设计的实现这一工作,都是由编译器默默来完成。由此可见,FPGA项目的开发其实是人与编译器协同作战的一个过程。人常说,“不怕狼一样的敌人,只怕猪一样的队友”,既然我们和编译器是战友,那么就要好好进行配合,可是不了解战友的特点和脾性该怎么配合呢?之前,我们主要从自身的角度出发,来介绍FPGA项目的基本开发流程,那么现在通过本章节的学习,让我们来好好认识一下我们的这位战友——编译器,从而为今后长期的协同作战打好基础。

编译概述

虽说编译器的主要工作就是将HDL代码和约束文件转换为FPGA芯片上的实际数字电路,但是这种转换可不是一蹴而就的,事实上这是一个非常复杂且繁琐的过程。凭心而论,在一个FPGA项目的开发中,编译器的工作量远比人类要大得多,如果按照编译流程的先后顺序来看,编译器所做的工作大致可以概括为五大方面:综合、翻译融合、映射、布局布线和配置文件生成, 具体的工作内容我们将在接下来的小节中进行较为详细的介绍。
虽然编译器在FPGA设计的开发过程中功不可没,可是编译器归根到底也是软件,而软件都是人编写的,人又总是会犯错的,因此即使经历了N多个版本的升级,“小强”的生命力仍然相当的顽强,因此编译器软件中都多多少少会有一些BUG存在。除此以外,编译器有时也是比较懒惰、比较笨的,有些时候,它做一定次数的尝试后就会放弃,有时候它给出的结果也并不优秀(虽然它在不断地对设计进行优化)。因此,为了能够让编译器发挥更好的作用,我们能做的就是要尽量编写规范的代码,设计合理的结构等等,这就好比你写的代码像刘翔一样出色,那么即使没有一双好的跑鞋,拿到亚洲冠军也易如反掌。总之作为FPGA开发者来说,能做多好就做多好,这样可以尽可能降低编译器的工作难度,如果再适时地给编译器一些恰当的指导和建议(通过约束),就可以打造出优秀的FPGA设计。

编译流程之综合

综合是编译流程中的第一个环节,编译器在这一环节将我们的FPGA设计转换为门级网表。

综合的输入

综合的输入主要包括HDL代码、综合设置、器件型号等,分别介绍如下:

HDL代码

HDL代码基本上就是全部的待转化的FPGA设计,当然FPGA设计也可以包含一些图形化的文件。说“基本上”,是因为对于一些使用了IP核的FPGA设计来说,如果这些IP核是硬核或者固核,那么它们本身就是门级网表或者资源网表,所以是不会也不需要被综合的。而如果这些IP核是软核,那么它们的表现形式可能也是HDL代码,因此也是综合输入的一部分。

综合设置

综合设置是编译器综合FPGA设计时的指导信息,这对整个综合过程是必不可少的。编译器通常会采用默认的综合设置来进行综合,但有时候我们需要编译器在综合的时候能考虑一下FPGA设计的特点以及一些现实情况,这时就需要人工的去修改综合设置,下面就介绍几种人工干预综合的方法。

  • 修改编译策略
    一般来说,可选的编译策略包括:speed、area、power optimization、minimum runtime、balance等,我们可以根据项目实际需要来做出选择。各种策略介绍如下:
    speed:速度优先策略。表示在综合的时候优先考虑FPGA设计的速度性能,选择该策略可以保证综合出来的门级网表在最终实现为电路的时候更容易工作在较高的时钟频率下。一般在时序分析环节发现最大时钟频率小于需求的时候,可以通过选择该综合策略进行尝试。
    area:面积优先策略。表示在综合的时候优先考虑用最少的资源办最大的事情,选择该策略可以保证综合出来的门级网表在最终实现为电路的时候更容易占用较少的硬件资源。一般当发现FPGA设计占用的资源已经超出了所选FPGA芯片的资源数量时,可以通过选择该综合策略进行尝试。
    power optimization:功耗最优策略。表示在综合的时候优先考虑减少FPGA芯片的功耗,选择该策略可以保证综合出来的门级网表在最终实现为电路的时候更容易产生较少的热量。一般当发现FPGA芯片在工作中温度过高的时候,可以通过选择该综合策略进行尝试。
    minimum runtime:最短时间策略。表示编译器在综合的时候花费最少的时间。编译流程中的任一环节都是需要消耗时间的,我们可以推测,当选用这一策略时,编译器处于最懒的状态。通常如果你的电脑不是太古董的话,不建议选择这一策略。
    balance:折中综合策略。表示在综合的时候兼顾考虑速度、面积、功耗等等各面因素,这也是编译器通常默认的综合策略,不过按照这个策略综合出来的门级网表在速度、面积、功耗等几方面都只能做到马马虎虎的水平。尤其是面积和速度这一对水火不容的指标,更是“鱼与熊掌不可兼得”.

  • 修改一般综合选项
    一般综合选项有很多,相比于编译策略,这是稍微细节一些的综合设置,这里列举几个有代表性的综合选项供大家参考:
    keep hierarchy:保留层级选项。在编写HDL代码的时候,为了功能强大、思路清晰、便于理解和修改等等原因,我们推荐大家使用层次化、模块化的设计思想来编写HDL,可是FPGA芯片上面的资源并不会按照HDL中的层级结构来进行组织,所以综合后的门级网表也没有必要保留这种层级结构。不过,有些时候,出于一些特殊的目的,我们希望综合出来的网表保留HDL代码中的层级结构,这时候就需要勾选该综合选项。
    read core:读核选项。该选项主要是针对IP核的,如果不选中,则把IP当做黑盒来处理,否则在综合的时候可以提取IP核中的一些时间、资源等信息。
    synthesis constraints file:综合约束文件选项。无论是综合策略还是综合选项,都太过概括,因为它们都针对全局。有些时候我们需要更具体一点、更灵活一点的综合设置,这时候就可以使用综合约束文件,来自行进行综合约束信息编写。需要注意,除了利用综合约束文件之外,我们还可以通过在HDL代码中嵌入综合约束信息来达到约束综合的效果。

  • 修改HDL综合选项
    由于HDL代码是FPGA设计的主要载体,因此专门针对HDL代码的综合就有很多的配置选项。这里选择一些比较有代表性的介绍如下:
    状态机的相关选项:包括状态机中状态的编码方式选择,例如auto、one-hot、gray等等,默认一般是auto;是否实现安全的状态机,即当出现错误状态时是否会自动跳回到正常状态,默认是no,因为这部分功能需要消耗更多的资源;状态的实现方式,RAM或LUT;等等。
    存储器相关选项:包括是否可以通过HDL代码推断并提取出RAM或ROM;用什么资源方式来实现RAM或ROM功能,block或distribute;等等。
    复用器相关选项:包括是否可以通过HDL代码推断并提取出MUX;用什么复用器资源来实现MUX;等等。
    解码器相关选项:包括是否可以通过HDL代码推断并提取出解码器;是否提取优先级解码器;等等。
    寄存器相关选项:包括是否可以通过HDL代码推断并提取出移位寄存器;是否提取逻辑移位寄存器;等等。
    其他选项:是否合并级联异或门;是否允许资源共享;是否允许使用DSP单元;等等。

  • 修改特殊综合选项
    综合过程中,还有一些比较特殊的综合选项。例如:
    是否允许在门级网表中添加I/O Buffer,默认是允许的,因为一般来说所综合的代码就是最终需要在FPGA芯片上实现的设计,所以肯定需要借助I/O Buffer来和外界交互,但是如果仅仅是想将当前设计做成一个类似IP核的网表结构,那么肯定是不希望引入I/O B

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李锐博恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值