我有一个关于在FPGA设计环境中编译HDL程序的问题。
1)为什么编译过程需要这么长时间?这真的是编译过程需要很长时间,还是需要花费很长时间才能编写单独的逻辑门?
2)为什么编译后的文件通常被称为' bitfiles'?这些位文件的格式是什么?我想象一个门的二维矩阵,它将根据位文件中的位打开或关闭。
感谢您的帮助!
答案 0 :(得分:10)
1)为什么编译过程需要这么长时间?这真的是编译过程需要很长时间,还是需要花费很长时间才能编写单独的逻辑门?
首先,如果您想查看FPGA工具的所有辛劳和辛勤工作,只需打开详细模式/详细报告,然后浏览/阅读它们。
我会用Xilinx的观点回答,因为那是我所知道的。虽然这些流程可能有不同的名称/分组/排序,但各个供应商的想法是相同的。
HDL->字节码过程与编译Java的过程略有不同。它不仅仅是将每一行转换为某个字节码,而是将整个设计转换为硬件实现的相关过程。您并未将程序转换为硬件,而是将硬件描述为硬件。当你在模拟器中运行测试平台时,你只需要调用一堆Verilog或VHDL程序。
请记住,时序约束是一个问题,因此优化逻辑的时序/深度是首要任务。
实际上,综合包括将行为Verilog / VHDL转换为RTL表示,包括FSM合成,布尔函数的提取,优化,解码器/编码器,多路复用器,ROM等。此外,合成步骤将复制寄存器,其值为需要在FPGA上的多个区域中,以便最大限度地减少这些区域的路由延迟。一些合成工具,如XST,将在此阶段提供对时序和设备利用率的粗略估计。
此外,请记住,综合涉及一定程度的推断。匹配某些图案/图案的HDL代码将被转换为硬件宏或某些图元的实例。如果我编写基于地址(可能是写入启用)同步访问大reg[7:0] foo [2047:0]
的代码,那么合成工具将要检测并将块RAM放置到位。它还将尝试优化不需要的逻辑,并可以在该优化中进行相当深入的逻辑分析。
翻译/映射也涉及大量的硬件逻辑错综复杂 - 在这个阶段,软件将尝试以最佳方式将逻辑函数填充到查找表中,将它们与它们可能驱动的触发器一起放入切片中,并再次优化。在此步骤中,可以删除优化遗留下来的冗余或多余组件。
在某些设计中,放置和布线是迄今为止最密集的步骤之一。现在,映射为大量的查找表和寄存器连接了大量的线路,它们都需要使用有限的互连资源进行放置。限制包括行/列中的行数,在某些距离处可以连接到其他位的位,以及时钟分布。再次记住,存在时序约束。 PAR可以快速放置设计,但是花费很长时间来尝试调整放置以适应这些约束。 放置和布线不是一个易于解决的问题,并且涉及大量基于成本表的暴力,随机放置以及其他独特方法。不用说,这可能需要很长时间。
想象一下,尝试组织下面显示的电路,每条线路的交叉点不超过两个,时序关键路径中的线路不超过25厘米,只是在FPGA的规模上:
2)为什么编译后的文件通常被称为' bitfiles'?这些位文件的格式是什么?我想象一个门的二维矩阵,它将根据位文件中的位打开或关闭。
你非常接近,但并非完全如此。比特流配置以下参数:
路由。什么信号去哪里,通过什么电线。这通常设置多路复用器和交叉连接。你所提到的相当不错,尽管它们确实不是连接门(尽管完全缓冲以避免电容效应)
切片。每个切片包含一些用于函数发生器的查找表,以及更多的多路复用器等。比特流还指定了查找表的内容,它们是否应被旁路或链接,输出是否应该直接路由到触发器,触发器是否应该具有异步复位,是否应该是posedge或negedge , 等等。对于分布式存储器片,配置与在外部控制下写入/移位LUT有关。
其他功能块:如何配置DSP /乘法器块,时钟处理电路的参数/连接性,如DCM / PLL / MMCM /等,宽度/通过/块RAM的初始内容,参数变性人,等等。
元数据。如果不应该复制,可能会阻止通过配置端口/ JTAG读回比特流。
答案 1 :(得分:2)
编译需要找到布局中与编码逻辑匹配的设置门。这是一个难以解决的优化问题 - 我认为它可以被视为边缘交叉问题。
Bitfiles是" fuses"将设置为在片上配置门网络。在没有查看特定芯片的情况下,我猜测一个保险丝由一个具有芯片定义顺序的位表示。