## FPGA实现的过程 本文翻译自[[https://www.fpgatutorial.com/fpga-build-process/|Introduction to the FPGA Build Process]] 在这篇文章中,我们将讨论FPGA的实现过程。这个过程包括采用现有的基于HDL的设计,并为我们的目标FPGA创建一个编程文件。在这篇文章中,我们介绍了这个过程中涉及的三个主要步骤——合成、放置和路由以及最后的编程文件生成。 在本系列的前一篇文章中,我们讨论了创建FPGA设计的过程。 一旦我们证明了我们的设计工作,然后我们将功能HDL代码转换到实际的FPGA中。 我们通常在三个独立的阶段进行这一过程——合成、放置和路由以及生成编程文件。 我们将在接下来的文章中详细讨论每一个步骤。 ### 1. 综合 构建FPGA的第一个阶段称为综合。这个过程将功能RTL设计转换为一组门级宏。这就产生了一个实现RTL设计的扁平层次电路图的效果。 在此上下文中,宏实际上是内部FPGA单元的模型。这可以是FPGA中的任何数字元素,如触发器、[[https://computer.howstuffworks.com/ram.htm|RAM]]或查找表[[https://www.allaboutcircuits.com/technical-articles/getting-started-with-fpgas-look-up-tables-and-flip-flops/|LUT]]。 #### 1.1 综合工具 我们可以使用许多不同的工具来运行合成过程。两家主要的FPGA供应商(Xilnix和Intel)都提供了适用于大多数项目的免费合成工具。 除此之外,我们还可以使用许多开源的合成工具。这些工具中最流行的是[[http://www.clifford.at/yosys/|yosys]],它经常与[[https://www.latticesemi.com/fpga|Lattice fpga]]一起使用。 我们也可以使用付费工具来实现这一目标。这些工具中最著名的是Synopsys公司的Synplify Pro和Mentor Graphics公司的Leonardo Spectrum。 付费工具通常能够提供比免费工具更优化的网络列表。我们通常只需要大型或高速设计的付费工具。 合成过程至少需要两个输入。 - 第一个是我们设计的源代码。 - 我们还需要一个脚本或项目文件来定义合成工具的配置。该脚本通常告诉工具要以哪个FPGA为目标、设计的pinout以及在运行综合时使用哪个策略。 除此之外,创建一个定义设计时间限制的文件也是一种很好的做法。 {{ :fpgabuildprocess.png?800 |}} 我们使用时间限制来定义关于FPGA的细节,这些细节不能在源代码中指定。 这包括时钟频率、时钟域的数量和外部接口的时间等信息。 这些细节决定了合成器在FPGA内优化时间方面所付出的努力。 #### 1.2 逻辑利用率 我们还可以将设计作为合成过程的一部分进行分析。然而,在经过地点和路由处理后,这些信息通常更可靠。 第一个分析是设计的逻辑运用。该分析详细说明了我们的设计使用了多少种不同类型的FPGA单元。 设备中的单个单元因芯片而异,也因厂商而异。 几乎所有现代芯片都将包括RAM、某种形式的LUT和触发器。 高端芯片还可以包括专用DSP核心、时钟管理模块(如锁相环)以及其他外围接口(如[[https://learn.sparkfun.com/tutorials/analog-to-digital-conversion/all|ADC]]或专用高速接口)。 在完成合成过程后,我们可以生成一份报告,告诉我们在我们的设计中使用了多少细胞,包括绝对数量和设备中所有可用细胞的百分比。 在运行合成过程后,我们经常会发现我们的设计对于我们的设备来说太大了。当这种情况发生时,我们有很多选择。 通常可以通过改变合成工具的配置来降低利用率。这方面的例子可以是改变[[https://www.allaboutcircuits.com/technical-articles/encoding-the-states-of-a-finite-state-machine-vhdl/|有限状态机FSM编码]]或选择不同的合成算法。 如果我们的设计只比所选的FPGA稍大一点,那么这种缩减就足够了。 如果这不能充分降低利用率,那么我们必须选择一个新的FPGA或使我们的原始代码更有效。 #### 1.3 时序分析 我们还可以分析我们的FPGA的时序后,我们已经运行了综合。 我们使用这种分析来确定FPGA是否能够以所需的频率运行我们的设计。 当我们的设计不能在期望的频率运行时,我们不能确定将不会有计时违规的内部触发器。因此,我们不能保证我们的设备能按预期运行。 我们通常根据地点和路线的过程来更详细地分析设计的时间。由于时序依赖于FPGA中单元的位置,因此遵循此过程得到的结果更准确。 #### 1.4 综合后仿真 在合成过程中,我们可以要求该工具在VHDL或verilog中生成一个网表。 这个过程还会产生一组时序延迟,以模拟信号通过FPGA的传播。 然后,我们可以使用这些信息来运行我们的综合网表的模拟。 因为这些模拟也模拟了我们的设计时间,所以它们提供了我们最终设备行为的更准确模型。 我们通常使用verilog生成合成后的仿真模型,而不管我们在设计中使用的语言是什么。 这样做的原因是基于verilog的模型比等效的VHDL模型更容易模拟。这对于合成后的模拟尤其重要,因为它们通常有很长的执行时间。 运行合成后的模拟有两个主要优点。 首先,这些模拟有助于确保生成的网络列表与原始RTL模型的行为相匹配。 其次,可以更仔细地考虑芯片的时序。这有助于我们找到可能与计时错误相关的bug,如竞争条件或计时违规。 尽管运行后合成模拟有一些优势,但我们通常不会将其作为设计流程的一部分。 原因之一是这些模拟需要很长时间运行。合成后的模拟需要几天时间来运行一组完整的测试,这种情况并不少见。 另一个原因是,我们还可以在由位置和路由工具生成的网络列表上运行模拟。 由于这些网表更能代表最终的硅解决方案,所以最好使用这个网表来执行任何计时模拟。 ### 2. 布局和布线 在完成综合之后,我们需要将网络列表映射到FPGA中的实际资源。这个过程被称为地点和路线,它实际上由几个不同的步骤组成。 通常,这个过程的第一阶段涉及优化网络列表。我们使用这个过程来删除或替换网络列表中任何冗余或重复的元素。 然后将优化后的网络列表映射到FPGA中的物理单元,这通常称为放置。 在完成放置过程之后,我们将运行一个称为路由的过程。 我们使用构建过程的这一部分来定义所选FPGA中不同单元之间的互连。 为了满足设计的时间要求,我们经常会执行这个过程的几次运行。然而,地点和路线工具负责根据我们的配置安排这些多次运行。 当我们的设计难以满足时间要求时,通常会增加允许工具运行的次数和类型。 #### 2.1 布局和布线工具 对于Xilinx或英特尔部件,没有第三方的定位和路由工具,这意味着我们必须使用特定于供应商的工具。这些都可以免费下载,不过也有付费版本。 也有这些工具的付费版本,虽然它们通常只需要针对高端fpga的设计。 对于Lattice fpga来说,开源nextnr软件是一个流行的位置和路由工具。 根据我们设计的大小,地点和路线的过程可能需要几个小时才能完成。 与合成过程一样,位置和路线工具需要大量输入才能正确运行。 我们使用综合工具生成的网络表是最重要的输入。这个网络列表通常是一个.edf文件,尽管不同的工具会有所不同。 我们通常还使用一个项目文件或脚本来确定位置和路由工具的配置。 我们用它来定义重要的信息,如FPGA部件号和包。除此之外,我们还使用这个脚本来定义位置和路由工具的配置。 我们还需要为工具提供一个约束文件,该文件定义了我们的设计的时间特征。这通常与我们在合成过程中使用的文件相同,该文件定义了有关时钟频率和域的信息。 我们还使用一个约束文件来定义我们的设计的物理特征,这是我们在HDL代码中无法描述的。至少,这将包括输入和输出到设备物理引脚的映射。 {{ :fpgaplacerouteprocess.png?800 |}} #### 2.2 时序和利用率 与合成过程一样,我们可以在地点和路线完成后生成许多报告。这允许我们进一步分析我们的设计,以确保它正确工作。 我们通常在完成地点和路由过程后运行使用报告。 该报告详细说明了我们使用FPGA实现我们的设计的不同单元的数量。 这个报告和我们在合成过程中生成的报告一模一样。然而,当我们在完成地点和路由过程后生成该报告时,它会更准确。 在完成地点和路由过程后,我们通常执行的另一个分析是静态时序分析(STA)。 在我们的设计中,我们使用这个过程来计算通过所有逻辑链的延迟时间。通过计算这些信息,位置和路由工具可以确定芯片是否能够在指定的时钟频率下运行。 地点和路线工具可以在最坏和最好的情况下进行分析。然而,在硅的最坏情况下,更常见的是出现时间问题。 我们通常将STA报告作为设计验证的关键部分。 如果我们的设计失败了STA,那么我们不能保证FPGA将可靠地工作。当这种情况发生时,我们要么必须使用不同的设置再次运行实现流程,要么必须更改设计。 ### 3. 编程文件生成 FPGA设计实现的最后阶段是编程文件的生成。 我们通常使用位置和路由工具来生成我们的编程文件。 但是,我们通常将其作为一个单独的进程运行。 只有在位置和路由流程生成了它的输出后,该流程才能运行。我们只需要告诉工具我们需要哪个文件类型来生成这个输出。 一旦这个过程完成,我们就可以使用生成的文件来编程我们的FPGA。