为什么 FPGA 项目总是花费相同的时间来编译?

电器工程 FPGA 石英 自由人
2022-01-14 06:33:19

使用软件,当我们第一次编译项目时,可能需要一段时间,但之后不再需要这么长时间。如果我们更改项目中的单个文件,则无需再次编译所有内容。

这似乎不适用于编译 FPGA 设计。

现在我已经使用了带有 MAX 10 和 Cyclone IV & V 的 Intel Quartus Prime Standard,以及带有 IGLOO2 和 SmartFusion2 的 Microsemi Libero SoC。对于我提到的程序和所有 FPGA,编译项目总是需要相同的时间。我想知道,为什么?难道我做错了什么?第一次之后编译应该花费更少的时间,不是吗?这应该如何解决?

4个回答

使用软件...如果我们更改项目中的单个文件,则无需再次编译所有内容。

仅当您的编译创建中间文件以避免重新编译未更改的文件时。

FPGAs ...第一次编译后应该花费更少的时间,不是吗?

在 FPGA 编译中,除非您使用增量编译(这是一项复杂的工作),否则它将不得不一直重新综合所有内容。

请记住,FPGA 设计不是软件。您正在描述一个物理电路。由于综合工具的优化方式,对该电路任何部分的任何更改都可能对电路的其他部分产生连锁反应。此外,这些工具不会而且在大多数情况下也不能孤立地“编译”每个文件,因为这些文件通常是对整个电路的小部分的描述。

当设计适合 FPGA 时,除非您锁定其中的某些部分(适配后网表和增量编译),否则适配人员每次都会从头开始尝试找到适配设计的最佳方式。通常编译时间会受到时序约束的严重影响,因为装配人员会尽量减少布线延迟以满足您所需的时钟频率。

这是因为 FPGA 工具链的工作原理。有几个主要步骤:综合、映射、布局和布线。合成是唯一类似于编译的。合成也是唯一最容易并行化的步骤(每个模块可以独立于其他模块进行合成),因此它通常只是运行工具所需总时间的一小部分。当这些任务在整个设计中起作用时,您可以将映射、布局和布线与链接进行某种程度的比较。然而,链接基本上是一个微不足道的操作,主要涉及从编译器读取所有目标代码,修复一些地址,并写出可执行文件。每次重新运行软件工具时,可能只需要重新编译几个文件,但需要重新链接整个输出文件。但这很快,因为链接器没有做任何特别复杂的事情。

另一方面,映射、布局和布线是高度计算密集型的,不容易并行化,而且它们也非常不容易以增量方式进行。映射从综合(与门、或门、多路复用器、触发器、加法器等)中获取“高级”网表,并将其转换为设备原语(LUT、触发器、进位链等)。布局然后决定将每个原语放置在设备上的哪个位置,路由确定如何使用互连网络路由所有连接。所有这些都是时序驱动的——这些工具试图映射、布局和布线所有逻辑,以便满足所有时序约束。这是一个比简单地将一堆 C 转换成一堆程序集复杂得多的问题。

逐步执行此操作意味着跟踪您在 HDL 级别上的更改在最终布线设计中的结果。这是非常重要的事情,而且几乎不可能做好。这些工具基本上需要将旧的综合网表与新的网表进行比较,向下传播更改,并希望事情最终能够解决,并且能够满足时序约束。

我有一些关于增量构建出错的个人经验。最近,我不得不删除并重新创建一个英特尔 FPGA 项目,因为它在更改一些时序约束后拒绝重新放置特定寄存器,因为增量构建认为由于生成该寄存器的逻辑没有改变,所以寄存器没有必须移动。这是在我浪费了几个小时尝试各种晦涩的指令组合以试图让工具合作之后,我才意识到问题的真正所在。

因为在软件中,有一个链接阶段。链接器获取所有对象文件(由每个源文件的编译产生),并且只更改函数调用,以便一切都可以一起工作。链接器的工作相当简单,不必经历从源代码生成代码和优化所有内容的过程(这非常耗费资源)。因为编译器已经为每个源文件独立完成了这项工作。

所以,如果你改变了一个源文件,你只需要重新编译这个特定的源文件并重做整个链接,但不需要编译其他源文件。

对于硬件综合,没有链接阶段。整个设计必须作为一个整体进行优化。如果不这样做,设计将非常不理想。编译器需要充分了解所有模块,以便在可用 LUT 中有效组织设计并满足时序要求。您是否注意到,有时,如果您只更改 HDL 中的几行代码,最终的设计就会完全不同?一切都会影响一切。如果一个 LUT 被移动,时间可能会改变,它必须通过移动其他东西来补偿,有时在看起来完全不相关的区域。因此,即使您的设计组织在多个源文件中,综合工具每次都必须检查所有内容。

在软件中,编译单元可以变得更加独立,并且工具链更容易避免重新编译不受源代码更改影响的部分。

注意(在其他答案中没有明确说明):FPGA 构建工具和软件构建工具都必须将最终产品安装到空间中。对于软件来说,它是一个逻辑地址空间,一个子程序与另一个子程序的空间关系与它们如何交互完全无关。但是,对于 FPGA,它是一个物理空间。设计的不同组成部分之间的空间关系非常重要。