2.2.1 FPGA的一般设计流程
FPGA是一种特殊的集成电路,这意味着它首先是一种集成电路。现在的集成电路绝大多数都是晶体管集成电路,大家日常接触最多的是CMOS晶体管集成电路。晶体管集成电路是什么?通俗一点来说,就是用金属导线把许许多多由晶体管构成的逻辑门、存储单元连接成一个电路,该电路具备一定的逻辑功能。不过,这并不意味着我们在设计数字逻辑电路时需要亲手用导线去连接晶体管。通常使用HDL语言(比如Verilog)编写代码,然后运行综合软件(比如Vivado),完成电路设计。这一流程其实与现在工业界常见的ASIC设计流程很相似。FPGA的设计流程一般有如下5个步骤。
1)电路设计。
2)代码编写。
3)功能仿真。
4)综合实现。
5)上板调试。
2.2.1.1 电路设计
首先,需要根据需求规格制定电路设计方案。例如,需求是设计一个LoongArch CPU,我们要把这个需求一步步分解、细化,得到一个能够满足需求的电路设计方案。我们要决定分成几个流水级,这里放几个触发器,那里放几个运算器,它们之间怎么连接,整个电路的状态转换行为是怎样的,等等。通常,我们将电路设计细化到RT L级就可以了,无须精确到逻辑门级别或是晶体管级别。
2.2.1.2 代码编写
代码编写阶段的工作是把第1步中完成的电路设计方案用HDL语言表述出来,让EDA工具能够看得懂。本书中我们使用Verilog语言。
2.2.1.3 功能仿真
功能仿真阶段的工作是对第2步中用HDL语言描述出来的设计进行功能仿真验证。所谓功能仿真验证,就是通过软件仿真模拟的方式查看电路的逻辑功能行为是否符合最初的设计需求。通常我们给电路输入指定的激励,观察电路输出是否符合预期,如果不符合则表明电路逻辑功能有错误。这种错误要么是因为第1步的电路设计有错误,要么是第2步编写的代码不符合电路设计。发现功能错误后需要返回前面相应的步骤进行修正,然后再按照流程一步步推进。如此不断迭代,直到不再发现错误,就可以进入下一阶段了。
需要指出的是,由于我们是在RT L级进行电路建模的,因此功能仿真阶段不考虑电路的延迟。
2.2.1.4 综合实现
综合实现阶段完成从HDL代码到真实芯片电路的转换过程。这个过程类似于编译器把高级编程语言代码转换成目标机器的二进制代码的过程。这个阶段分为综合和实现两个子阶段。综合阶段将HDL描述的设计编译为由基本逻辑单元连接而成的逻辑网表,不过此时的网表还不是最终的门级电路网表。实现阶段才会将综合出的逻辑网表映射为FPGA中的具体电路,即将逻辑网表中的基本逻辑单元映射到FPGA芯片内部固有的硬件逻辑模块上(称为“布局”)。随后,基于布局的拓扑,利用FPGA芯片内部的连线资源,将各个映射后的逻辑模块连接起来(称为“布线”)。
如果整个综合实现过程没有发生异常,EDA工具将生成一个二进制码流文件。通俗来说,这个二进制码流文件描述了最终的电路实现,只不过这个文件是让FPGA芯片来看的。
2.2.1.5 上板调试
俗话说,“是骡子是马拉出来遛遛”。不管功能仿真得多正确,最终还是要看实际电路能否正常工作。在上板调试阶段,首先要将综合实现阶段生成的二进制码流文件下载到FPGA芯片中,随后运行电路观察其工作是否正常,如果发生问题就要调试,并定位出错的原因。
以上简要介绍了FPGA一般设计流程的主要步骤,以便读者先建立一个正确的整体概念。FPGA设计流程中还包含很多细节,我们会在后续章节中陆续介绍这些细节,以免读者一时间难以全部消化吸收。实际上,FPGA设计流程中还有一些步骤,因为在本书实践任务中不涉及,所以没有列举出来,读者在今后的学习、工作中可以根据实际需要再行学习。