作者:LJgibbs
来源: https://zhuanlan.zhihu.com/p/161301209
注:原文版权归作者所有,本翻译仅为爱好所作,与任职单位无关。
第一部分 引言:可重构计算硬件
PART1 Reconfigurable Computing Hardware
根本上来说,可重构计算可以最好地发挥可重构硬件的潜力。虽然一个完整的系统必须包括编译软件和高性能的应用程序,但了解可重构计算的最佳位置还是在芯片层面,因为芯片的性能以及局限性对系统的所有阶段都有着至关重要的影响。然而,反过来说也一样成立:既然可重构设备设计为针对那些发展迅速的应用程序的开发平台,如果芯片不能有效地支持重要的应用程序,或者芯片无法高效地应用自动设计映射流程,那么可重构计算将无从谈起。
可重构计算目前主要由现场可编程门阵列(FPGA)商用产品的发展推动。对于可重构计算领域而言,FPGA商用产品的发展喜忧参半。一方面,他们代表了目前商用可重构硬件的主要来源之一,可向任何应用提供采用最先进的工艺制造的,便宜且高速的可编程硅片。另一方面,它们并没有针对可重构计算进行优化,原因很简单,绝大多数 FPGA 客户只是将其用作专用集成电路(ASIC)的一种替代品,虽然性能较低,但是相对便宜并且能够缩短上市时间。因此,这些设备永远不是可重构计算用户理想中的硬件,虽然也足够接近了。
第一部分的第 1 章深入介绍了商用FPGA体系结构,概述了几乎所有通用可重构计算系统的底层技术。
由于FPGA并没有针对可重构计算进行优化,因此已经出现了许多尝试,为可重构社区构建更好的可重构器件。第 2 章详细介绍了其中的许多尝试。新体系结构的重点是包含更大的功能块以加速关键的计算、采用与主机处理器的更紧密的接口,便于建立协处理模型、快速的重新配置功能以减少更改配置的时间等等。然而,到目前为止,还没有商业上可行的系统,这主要是因为
- 在对 FPGA 的整体需求中,对可重构计算芯片的需求比例并不大,降低了规模经济效应。
- FPGA 产商可以使用最先进的制造工艺,而可重配置的计算芯片通常落后一到两代工艺。
基于这些原因,可重新配置的计算芯片与商用 FPGA 相比,在成本、性能和功耗方面都存在很大的劣势。因此,可重构计算专用设备的架构优势必须足够巨大,以弥补规模经济效应和制造工艺滞后所带来的问题。看上去最终某家设计可重构计算芯片的公司总归将获得成功;然而,到目前为止,似乎只有失败。
尽管可编程芯片本身的特性很重要,但大多数可重构计算用户所需的往往超过芯片本身。一个真正的系统通常需要:大容量内存、连接数据流的输入/输出(I/O)端口、协调操作的微处理器或微处理器接口,以及配置和重新配置设备的机制。第 3 章讨以完整的系统的角度讨论了可重构计算系统,记录了可重构计算板卡的发展。
第 1 章到第 3 章对大多数可重构系统硬件进行了很好的概述,但有一个主题需要特别考虑:器件内的重构子系统。在 FPGA 中,配置数据被有序而缓慢地加载,基于所设定的运算配置整个芯片。当 FPGA 用作胶水逻辑和 ASIC 替代品时,现有的配置加载速度是足够的,因为 FPGA 只需要在上电后配置一次即可;但是,在可重构计算的许多情况下,FPGA 可能需要更频繁地重配置。在极端情况下,一项运算的电路可能会被分解成多个配置文件,而 FPGA 需要在该电路的正常执行过程中依次加载新的配置,以完成整个运算过程。在这种情况下,重新配置的速度很重要。第 4 章重点讨论了FPGA中的重构子系统,提出实现快速重构的挑战,并阐述了一些能够明显提高重构速度的方法。
第一章:器件架构 Chapter 1 :Device Architecture
Mark L. Chang
Electrical and Computer Engineering
Franklin W. Olin College of Engineering
最好的赛车手知道他们的赛车是如何工作的。最好的建筑师知道木匠、瓦匠和电工是如何干活的。最好的程序员知道他们正在编程的硬件是如何进行计算的。了解硬件设备的底层原理(down to the metal),对于高效利用硬件资源至关重要。
在本章中,我们将对构成一个典型的现场可编程门阵列(FPGA)的基本硬件单元一探到底。我们将讨论 FPGA 器件中的计算是如何进行的,包括真正的计算单元,以及在这些计算单元之间传输数据的互连结构。我们将从 FPGA 架构的角度讨论这些硬件单元是如何组合到一起的。当然,由于可编程性(以及可重编程性)是 FPGA 的关键特性之一,我们也将在花一些篇幅讨论实现可编程特性的硬件结构。最后,我们将在第 1.5 节的“案例研究”中深入了解一些商用 FPGA 的体系架构。
我们不会涉及大学和工业届的许多研究架构,这个会留到以后再说。我们也不会讨论如何高效地编程 FPGA,构成一个计算平台,这也是本书后面的内容。
本章中读者将学到的是一个典型的商用 FPGA 的“底层”(under the hood)结构,这样读者就可以更自如地使用它作为解决问题和执行计算的平台。我们旅程的第一步从如何在FPGA中完成计算这一问题开始。
1.1逻辑——运算结构 logic——the computational fabric
在我们的台式电脑中,在这个机箱里,除去那些与电子不相关的其他东西,有存储和通信设备(硬盘和网卡)、内存,还有就是执行大部分计算的中央处理器(CPU)。FPGA 在可重构计算平台中扮演着类似 CPU 的角色,但我们将对其进行分解,不仅仅讨论执行运算本身。
一般来说,FPGA中只有两种类型的资源:逻辑(logic)单元和互连(interconnect)结构。逻辑是进行算术运算(1+1=2),逻辑函数( if (ready) x=1 else x=0)的硬件单元。互联结构用于组织数据(比如先前一次计算的结果),将数据从一个计算单元传输至另一个单元。这里首先来关注逻辑单元。
1.1.1逻辑单元 Logic Elements
假设读者有数字逻辑和计算机体系结构背景,将知道计算机中的任何计算都可以表示为布尔方程(Boolean equation)(在某些情况下,布尔方程的输入为先前的结果,因为 FPGA 可以实现状态保持,所以不用担心这点)。而任何布尔方程又都可以以真值表(truth table)的形式表示。
基于真值表,我们可以构建复杂的运算逻辑结构,例如加法器和乘法器。也可以实现条件判断语句,例如经典的 if-then-else 分支结构。结合运算逻辑与条件分支结构,我们可以简单地用真值表来描述复杂的算法。
通过上述对数字逻辑本质的简单描述,可以发现真值表是 FPGA 计算核心的实现方式。更具体地说,通过查找表(LUT)这一硬件可以轻松实现真值表。从电路构成上来看,可以简单地由 N:1(N-to-one,N 选 1)多路复用器和 N 位存储器构成一个 LUT。LUT 可以通过枚举的方式实现任意的真值表。因此基于 LUT, FPGA 具有实现任意数字逻辑的通用性。图1.1 显示了一个典型的N输入查找表的结构,这在现代 FPGA 中随处可见。事实上,几乎所有的商用 FPGA 都将 LUT 作为其基本硬件构成。
LUT 可以通过将待实现函数的真值表,编程至 LUT 的 N 个输入,来实现任何函数。其中,每一路输入对应真值表的某一种情况。如图 1.1 所示,如果我们想用 3输入LUT(通常写作 3-LUT)来实现一个 3 输入异或(XOR)函数。可基于查找表为 LUT 内存赋值,以便 LUT 选择信号根据三输入的情况选择正确的 LUT 行得到“答案”。因此除了输出为 “1” 的四种情况,其他“行”将存储 “0” 作为异或的结果。
当然,可以通过整合几个查找表,一起实现更复杂的函数或者拥有更多输入的函数。例如,可以将一个 3-LUT 组织成一个 8×1 rom,如果查找表的值是可重编程的,则转换为一个 8×1 ram。但是基本结构以及查找表,保持不变。
(译注:原文如此,似乎这个 for example 并没有提供整合查找表的例子,这里译注一个例子,基于 3-LUT 实现一个四输入异或逻辑函数)
虽然商用 FPGA 已经或多或少将 LUT 作为最小的逻辑运算单元,但是每个逻辑块(logic block),由 LUT 组成的上层逻辑单元中,查找表输入数量大小需要权衡,并已经被广泛地研究[1]。一方面,较大的查找表将允许在单个逻辑块中实现更复杂的逻辑函数,从而减少块的数量,因此逻辑块之间的布线延迟也被减少了。然而,由于需要位宽更大的多路复用器,因此将导致 LUT 的速度降低。并且如果越大的 LUT,将导致更多的浪费可能,因为函数输入可能小于 LUT 的输入。而较小的查找表可能需要更多逻辑块,从而增加块之间的布线延迟,但 LUT 的速度将更快,从而可以减少每个逻辑块内部的延迟。
目前基于大量基准电路(benchmark circuits)的经验表明,4-LUT 结构在面积和延迟之间取得了最佳的平衡。当然,随着 FPGA 计算包括更多的应用领域,这个研究结果可能需要重新审视。事实上,在撰写本文时,Xilinx 已经发布了 Virtex-5 FPGA,采用 6-LUT 架构
(译注:截止 2020 年,主流 FPGA 均采用 6-LUT,目前国产 FPGA 因为容量较少,多使用 4-LUT 或者 5-LUT 结构)。
每个逻辑块中的 LUT 数量问题也是一个值得权衡的问题,并进行了相关研究[2]。经验证据表明,将多个 4-LUT 组合在单个逻辑块中可以改善面积和延迟。基于该项目研究成果,目前许多商用 FPGA在每个逻辑块中加入了多个 4-LUT。
(译注:在 Xilinx 7 系列架构中,LUT 上层的逻辑块称为 Slice,包括 4 个 6-LUT)
对 LUT 输入大小和每个块中 LUT 数量的研究都是为了解决 FPGA中的计算粒度(granularity)问题。从一个维度来看,结构简单的小位宽查找表(例如 2-LUT)细粒度的计算能力。从另一个维度来看,人们设想更大的计算块来实现粗粒度的计算能力,例如完整的 8 位算术逻辑单元(ALU),更典型的比如一个完整的 CPU。
与查找表输入大小的研究类似,细粒度块可能更擅长位级操作和算术,但需要组合多个细粒度块来实现更大的逻辑块。与至相反的粗粒度块可能更适用于标准“字”位宽大小(8/16/32位)的,面向数据路径的计算,但在实现非常简单的逻辑操作时会浪费多余的资源。当前的业界实践是以一定程度上细粒度的 4-LUT 结构为主,兼顾使用更粗粒度的异构元素(如乘法器)来实现粒度上的平衡,如本章后面的扩展逻辑单元节所述。
目前,逻辑块中已经包括了 LUT 这一硬件单元。此时,我们得考虑一个问题:目前的逻辑块是否足以实现在 FPGA 中所需的所有功能。事实上,并没有。若只有 LUT,FPGA 无法保持任何信号的状态,因此无法实现任何形式的时序逻辑,或者状态保持逻辑。为了解决这种情况,将在基本逻辑块中添加一个简单的单比特存储单元,即一个 D 触发器。
现在的逻辑块结构类似于图 1.2(译注:图中的 SRAM 部分为译者所加)。多路复用器从查找表生成的函数中以及 D 触发器中存储的值中选择一个结果作为输出。实际上,这个逻辑块与某些商用 FPGA 中的逻辑块结构非常相似。
1.1.2 可编程性 Programmability
识别图 1.2 的逻辑块结构中所有可编程点(programmable points)并不困难,这些可编程点包括 4-LUT 各路输入、输出多路复用器的选择信号以及 D 触发器的初始状态。目前大多数商用 FPGA 使用易失性静态 RAM(SRAM)中的数据输出端口连接至配置点,从而通过 SRAM 中的内容来配置FPGA。因此,向每个配置位所连接的 SRAM 写入一个值即可配置整个 FPGA。在我们的逻辑块中,4-LUT 将由 16 个 SRAM bit 组成,每个输出项使用一个;多路复用器使用 1bit SRAM 值;D 触发器初值也使用 1bit SRAM 值。至于 SRAM 中的数值是如何初始化的,将在后面的章节内容中讨论。
推荐阅读
关注此系列,请关注专栏FPGA的逻辑