为 FPGA 编译 HDL 程序的一般过程是什么?

What's the general procedure for compiling an HDL Program for an FPGA?

我有一个关于在 FPGA 设计环境中编译 HDL 程序的问题。

1) 为什么编译过程这么长?真的是编译过程耗时长,还是个别逻辑门的编写耗时长?

2) 为什么编译后的文件一般都是'bitfiles'?这些位文件的格式是什么?我正在描绘一个二维门矩阵,该矩阵将根据位文件中的位打开或关闭。

感谢您的帮助!

1) Why does the compilation process take so long? Is it really the compilation process that takes a long time, or is it the writing of individual logic gates that take a long time?

首先,如果您想了解您的 FPGA 工具所做的所有辛勤工作,只需打开详细的 mode/detailed 报告,然后 skim/read 它们。

我将以 Xilinx 的观点来回答,因为这就是我所知道的。尽管流程可能不同 names/groupings/ordering,但不同供应商的想法是相同的。

HDL->字节码过程与编译方式略有不同,比如说,Java。这不仅仅是将每一行转换为一些字节码,而是将整个设计转换为硬件实现的复杂过程。您不是将程序转换为硬件,而是将硬件描述转换为硬件。当它是 运行 模拟器中的测试台时,您只能将一堆 Verilog 或 VHDL 称为程序。

请记住,时序约束是一回事,因此优化 timing/depth 逻辑是重中之重。

实际上,综合包括将行为 Verilog/VHDL 转换为 RTL 表示,包括 FSM 综合、布尔函数提取、优化、decoders/encoders、多路复用器、ROM 等。此外,合成步骤将复制 FPGA 上多个区域需要其值的寄存器,以便将到这些区域的路由延迟降至最低。一些合成器工具,例如 XST,将在此阶段提供对时序和设备利用率的粗略估计。

此外,请记住综合涉及某种程度的推理。匹配某些 motifs/patterns 的 HDL 代码将被转换为硬件宏或某些原语的实例化。如果我编写的代码基于一个地址(可能还有一个写使能)同步访问一个大的 reg[7:0] foo [2047:0],那么合成器工具将想要检测到它并放置一个块 RAM。它还将尝试优化不需要的逻辑,并可能在该优化中进行相当深入的逻辑分析。

Translation/mapping 还涉及大量复杂的硬件逻辑——在这个阶段,软件将尝试以最佳方式将您的逻辑函数填充到查找表中,将它们与它们可能驱动的触发器一起放入切片中,再次优化。在此步骤中,可能会删除优化遗留下来的冗余或多余组件。

到目前为止,布局和布线是某些设计中较为密集的步骤之一。现在映射提供了大量的查找表和通过大量电线连接的寄存器,它们都需要使用有限的互连资源来放置。限制包括 row/column 中的线路数量、哪些位可以在特定距离内连接到其他位,以及时钟分配。再次记住,时序约束是存在的。 PAR 可能能够快速放置设计,但要花费很长时间来尝试调整放置以适应这些限制。 布局和布线不是一个容易解决的问题,涉及大量的暴力、基于成本表的随机布局和其他独特的方法。不用说,这可能需要很长时间。

想象一下,尝试组织下图所示的电路,每条线不超过两个交叉点,时序关键路径中的线不超过 25 厘米,只是在 FPGA 的规模上:

source

2) Why are the compiled files generally referred to as 'bitfiles'? What are the format of these bitfiles? I'm picturing a 2 dimensional matrix of gates that will either be opened or closed depending on the bits in the bitfile.

你很接近,虽然不完全是。比特流配置以下参数:

  • 路由。什么信号去哪里,通过什么电线。这通常会设置多路复用器和交叉连接。你提到的非常准确,虽然它们实际上不是门而不是连接(尽管完全缓冲以避免电容效应)

  • 切片。每个切片包含一些用于函数发生器的查找表,以及更多的多路复用器等。比特流还指定了查找表的内容,它们是否应该被旁路或链接,输出是否应该直接进入路由或触发器,触发器是否应该有一个异步复位,它应该是 posedge 还是 negedge , 等等。对于分布式内存片,配置与writing/shifting外控LUT相关

  • 其他功能块:DSP/multiplier tile 应该如何配置,parameters/connectivity 用于时钟处理电路,例如 DCMs/PLLs/MMCMs/etc,widths/fallthrough/initial 的内容块 RAM,收发器的参数,等等

  • 元数据。如果不应复制,可能会阻止通过配置 port/JTAG 回读比特流。

编译需要找到一组在布局上与编码逻辑匹配的门。这是一个很难解决的优化问题 - 我认为它可以被视为一个边缘交叉问题。

位文件是 "fuses" 的数组,将被设置为配置片上门的网络。在不查看特定芯片的情况下,我猜想一个保险丝由具有芯片定义顺序的一位表示。