FPGA是一堆晶体管,您可以将它们连接起来以制作所需的任何电路。
它就像一个纳米级面包板。
使用FPGA就像将芯片带出来,但是您只需要购买该芯片即可构建不同的设计。
作为交换,您需要付出一些效率代价。
从字面上来讲,这种说法是错误的,因为您无需重新连接FPGA,它实际上是通过路由网络连接的查找表的二维网格,以及一些算术单元和存储器。
FPGA可以模拟任何电路,但实际上它们只是在模仿,就像软件电路模拟器可以模拟电路一样。
使这个答案不合适的原因是,它简化了人们实际使用FPGA的方式。
接下来的两个定义可以更好地描述FPGA。
电路仿真是FPGA的经典主流用例,这也是FPGA首次出现的原因。
FPGA的关键是硬件设计是用HDL编码的,并且可以通过购买一些廉价的硬件来获得与ASIC相同的效果。
当然,您不能在FPGA和实际芯片上使用完全相同的Verilog代码,但至少它们的抽象范围是相同的。
这是与ASIC原型设计不同的用例。
与电路仿真不同,计算加速是FPGA的新兴用例。
这就是Microsoft最近成功加速搜索和深度神经网络的原因。
关键在于,该计算示例不依赖于FPGA与真实ASIC之间的关系:开发人员为基于FPGA的加速编写的Verilog代码不需要与用于流片的Verilog代码有任何相似之处。
在编程,编译器和抽象方面,这两个示例之间存在巨大差异。
我更加关注后者,我将其称为“计算FPGA编程”。
(计算FPGA编程)。
我的观点是,当前用于计算FPGA的编程方法都是从传统的电路仿真编程模型中借用的,这是错误的。
如果要开发ASIC原型,则Verilog和VHDL都是正确的选择。
但是,如果目标是计算,我们可以并且应该重新考虑整个堆栈。
让我们直接说吧。
FPGA是一种非常特殊的硬件,用于有效执行模拟电路描述的特殊软件。
FPGA配置需要一些底层软件-这是为ISA编写的程序。
在这里,您可以将GPU用作类比。
在深度学习和区块链变得流行之前,有一段时间使用GPU来处理图形。
在21世纪初,人们意识到在处理没有图形数据的计算密集型任务时,他们还将GPU用作加速器:GPU设计人员建造了更多的通用机器,而3D渲染只是其中的一种应用。
FPGA的定义与GPU的模拟计算FPGA遵循相同的轨迹。
我们的想法是大量使用这种时髦的硬件,当然不是为了电路仿真,而是使用适合电路执行的计算模式,并以类似的方式看待GPU和FPGA。
为了使GPU成为当今的数据并行加速器,人们必须重新定义GPU输入的概念。
我们曾经认为GPU接受视觉效果的特殊,强大,特定于领域的描述。
我们已经实现了GPU执行程序,从而释放了它们的真正潜力。
这样的实现允许GPU的目标从单个应用程序域发展到整个计算域。
我认为计算FPGA也在经历类似的转变,并且没有简洁地描述FPGA擅长的基本计算模式。
但这与潜在的不规则并行性,数据重用和大多数静态数据流有关。
像GPU一样,FPGA也需要可以反映此计算模型的硬件抽象。
Verilog用于计算FPGA的问题在于,它在低层硬件抽象中不能很好地工作,而在高层编程抽象中则不能很好地工作。
让我们通过矛盾想象一下,如果我们将这些角色替换为RTL(寄存器传输级别)。
即使是RTL专家也可能不会相信Verilog是有效开发主流FPGA的一种方式。
它不会将编程逻辑推向主流。
对于有经验的硬件黑客来说,RTL设计似乎是友好而熟悉的,但是它与软件语言之间的生产力差距是无法估量的。
实际上,对于当前的计算FPGA,Verilog实际上是ISA。
主要的FPGA供应商工具链将使用Verilog作为输入,而高级语言编译器将使用Verilog作为输出。
供应商通常将比特流格式保密,因此Verilog在抽象层次结构中应尽可能低。
将Verilog用作ISA的问题在于,它与硬件之间的距离太远了。
RTL和FPGA硬件之间的抽象差距很大。
从传统的角度来看,它必须至少包括综合,技术