虽说接触和学习 FPGA 有一段时间了,但每次在给人介绍FPGA时,还是不能说得很清楚。因为呢,FPGA还是很有门槛的。所以,针对FPGA的关键知识再学习和整理了一次。供参考,对于FPGA老鸟,直接跳过,如果是初学者,可以看看。
FPGA 做为一个特殊的芯片,为什么存在?原理如何?如何设计和使用FPGA。
1:什么是FPGA?
要理解FPGA,如果连计算机结构都不清楚(比如:冯诺依曼架构,标准指令集),还有数字集成电路设计(组合/时序逻辑,逻辑综合,CMOS电路,时序分析,布局布线,低功耗设计,存储设计,电路测试和验证),这些还是得大致了解一下。

最基础的知识: 乘法是可以通过 加(Add) 和 移位(Shift)来完成,
所以,加法器和移位器是一切运算的基础。这个很重要!!!!!

如上图,是移动运算和加法运算。
那具体我们要运算时,有哪些实现方案呢?这里要注意了,特别是做软件的同学,有两种方案:
一种是硬件方案,一种是软件方案,如何理解?
1.1:运算的软/硬件实现方案
以 4位(二进制)乘以 4位(二进制),我们的实现方案分为软件,硬件实现方案。
对于一个数学运算,我们可以通过软件来实现,比如:CPU

软件的实现方案就是:冯式定理,通过控制器,运算器,内存。控制器确认流程,接受输入,运算时通过内存来缓存中间结果,缓存数据再运算时做数据搬运,最终给出输出。
于是,会有很多搬运的过程。(冯式原理,也就是软件的计算原理,如下)

这种做法,非常符合人的思维习惯,相当于把一个问题拆成多个步骤,按顺序来执行。
另外,软件同学并不熟悉的是:可以通过硬件方式来实现:

上图是四位的乘法。如果我们认为4位的乘法是由多次移位和加法组成的,在软件实现时,可能会把一个乘法变成多次的运算,中间结果用内存来缓存。但是,在上图的硬件实现中,我们直接把运算的过程全部通过硬件一次完成了。当然, 它在往后传递数据,进行运算时,必须要保证同步。而同步实际上是靠其它来保证(这里不细讲了)。但确实,它没有缓存,搬运数据的过程,速度更快。

上图表达了最重要的 组织逻辑,时序逻辑的实现。前者不依赖历史和状态。后者依赖历史和状态有记忆的能力。
硬件可以将运算并行,总是在第一时间拿到结果后,立即进行下一步运算,运算更快。
结论:硬件的实现比软件的能耗比更低。硬件更快,消耗能量更小。
软件有很多高级编程语言来支持,符合人的思考逻辑,开发效率高。
硬件实现较复杂,开发难度大,并且,一旦在硬件上实现,不能修改,生产成本也很高。
1.2:FPGA可以结合软硬件的优势
那如何结合软件和硬件的优势?
FPGA是其中一种可编程的方式(运行快,可编程)Programable circuit

随着FPGA的工艺提升,芯片的产量越大,消耗越高,高于某个特定量,ASIC的成本会低于FPGA。
1.3:FPGA的特点
当然,FPGA的劣势也很明显:
1:编程难度大。
对于软件,只需要学习简单的指令,做一下编译就OK了。属于指令架构。
对于FPGA的编程,除了要学会电路编程语言verilog以外,还需要学会如何 Synthesis,place,rout,逻辑电路还需要映射到当前FPGA的 Primitive Cell。
2:比 ASIC 更贵一些(10x的面积),
3:比 ASIC 更慢一些。(3x的差距)


以上讲了那么多,关键是讲了FPGA是如何产生的,以及它在芯片行业中的定位。
那FPGA的可编程具体是如何实现的呢?大家都知道是LUTS表和Switch,但具体细节呢?我们来仔细看一下。
2:如何实现Field-Programmable

如何要改上面的运算,一是改逻辑 ,一是改连线。
2.1:FPGA实现编程的方式
对于FPGA 的实现方式如下:

通过 内存位(1和0)来控制开关。

逻辑如何实现,可以通过真值表来表达所有逻辑。所以,更改真值表的值,就变更了逻辑。

所以,不管是逻辑还是开关,都是通过 Memory 来完成定制的,所以,我们会发现,在往FPGA上烧录最终的bitstream时,实际上就是一行 1010的数据写入。
对于Memory的实现,有很多种实现方式。但是在实现时,我们会考虑如下几种场景:
* 是否支持多次编程
* 是否非易失。失电后的是否丢失内容
* 是否要采用标准工艺进行生产
* 可扩展性,伸缩性
* 是否可现场编程,不依赖工厂。
2.2:如何选择用于配置的存储
如此,我们一般会选择SRAM的方案:(除了失电会丢失数据,其它都很OK)

SRAM并不是唯一的选择:也有其它选择,可参考下表:

好,基于上面的学习,我们重新再来理解一下FPGA。

好了,如何实现可编程,应该已经讲清楚了。
接下来,就是难点了,硬件是如何实现FPGA的,架构是怎样的?硬件是如何实现的?
3:如何实现FPGA
FPGA内部的逻辑架构如下:
首先看一下 Floorplan:(逻辑单元,输入/输出,DSP,ERAM,

3.1:逻辑单元
针对单个的Logic Block 如下:它由多logic-cell组成,注意,一个logic cell 是由 Luts,carray,register 组成。

做多大的颗粒度,与工艺相关。
3.2:连接方式
看了逻辑单元,再来看连接方式,目标很明确,走通,时序,面积,功耗。

对于连接的架构,有以下几种:

而最常见的连接架构是如下的Mesh方式:横(纵)Routing chanel + Switch Box

对于时钟网络,设计如下:

3.3:FPGA的通常架构
以下的 tile-base 架构是最常见的FPGA架构,如图,就是一种堆积相同逻辑单元的方式。

这是最早的FPGA的一个CLB的结构:

FPGA随着应用场景增加,加入了越来越多的IP,变成了一个平台。

常见的IP如下:

最新,最先进的FPGA是一个非常复杂的SoC。
什么是Scalar Engine,实际上相对于并行/向量运算的普通运算。我们用CPU实现的普通数学运算,我们都可以认为是标量(Scalar,单一数据)运算。相对应的 AI运算一般是并行的向量或者说Tensor运算,会采用DSP或者AIE,
对于FPGA的可适应用性,我们可以理解为它可以在硬件层面重新配置电路,和ARM,DSP,AIE的编程是大不相同的。
这里SoC特别强调了图像处理,神经网络推理这种热门场景,但并不仅限与此。而对于神经网络压缩的在线处理,这个好像很少有人这么使用。

3.4:软件如何建模
软件需要进行建模的元素有:
架构(为了GUI显示,为了Place / Route)
Logic block:CLB(Xilinx的称呼)
interconnects:连接方式的建模
global clocks:全局时钟网络,保证时钟同步。
Floorplan:整体的布局。
PRAM configuration(为了bitstream的生成):这是指的为了加载FPGA的配置的内存。
Timing delays:为了计算STA
Power data :为了做能耗的分析
Primitive:FPGA中原生的基础元件,为了综合时的Map和综合的处理。
我们在建模时,不可能针对每一个Lut进行单独建模,一定是按照 Tile模块的方式,只对单个Tile进行建模,其它都重复的。
3.5 软硬件如何配合
而软硬件有很强的依赖,两者交互点较多,下面的图列出了一部分关键点:

理解一下上面的图:
3.6:数字/模拟的设计过程
对于模拟电路的整个设计过程,有如下的步骤:

- DRC:检查设计是否符合工艺规则,确保制造可行性。
- LVS:验证版图与原理图的一致性,确保电气连接正确。相当于对逻辑图和物理实现进行对比。
- PEX:提取寄生参数,用于评估电路的实际性能影响。
对于数字电路的设计,有以下步骤:


硬件相关的知识大概就了解这么多了,接下来,非常重要的是,芯片生产出来后,如何进行测试?
4:芯片如何测试?
芯片有是就设计,生产,封装测试,三个大步骤。

4.1:MOSFET的架构
下图是一个标准的MOSFET的结构,以及改进的FinFET版本,按FinFET实际生产的一款7nm芯片。

4.2:制造过程
关注一下半导体的制造过程:
1:晶园的准备------先是拉制成硅锭,然后切割成晶园。
2:光刻------这里称为图形转移,就是将电路图转移到晶园上。光刻机使用光源将光通过掩模,将掩膜上的图案通过缩放投影在涂有光刻胶的昌园表面。
3:掺杂------形成源极和漏极。通过注入杂质。形成芯片的基本元件。
4:沉积------形成金属导电层,形成芯片中各个元件之间的导线。形成电路互连结构。
5:蚀刻------把不需要的部分去掉,只保留电路。去除掉不需要的材料。
6:封装------将wafer中的die切出来,切成祼片,加上保护壳,成为集成电路的芯片。经过测试和质量检测,就可以投入市场使用。

4.3:光刻过程
对于光刻过程,有必要重点了解一下:

4.4:芯片的面积约束
芯片不能太大,因为越大,良率越低。如下图。一般最大的面积是 25mm * 25 mm

4.5:芯片的测试
那我们如何判断一颗芯片是OK,可用的?
1:回片测试
是否和设计的要求一致,需要严格的回片测试。
2:功能测试
按需要达成的功能进行测试,比如:乘法是否正常。
3:性能测试
运行时的最高频率。也就是能跑到的最高频率。
4:量产测试
可能需要对测试的芯片划分等级,因为质量可能不同。如:速率,温度......)
4.6:测试的方法
功能测试:主要对开关,导线的联通性做测试。

按照功耗,速度。会对芯片分等级,分箱处理。(用在不同场景,或销售不同价格)

下面是完整的制造测试流程:
1:DFT------基于DFT规则来指导测试的试计
2:Fault Model------定义缺陷模式。
3:测试向量生成------手动生成简单故障,自动生成更复杂的故障模型。
4:形成测试程序------在生产测试中实际运行。
5:测试向量集------需要生成额外向量,处理测试中未检测到的缺陷。
6:客户产品测试------基于客户的应用做测试
7:良率分析------如果存在逃逸,需要分析原因

整个 MFT 框架包含了从测试生成、配置、执行到评估的完整流程。各模块通过数据库和仿真工具的相互配合,确保测试能够覆盖所有潜在故障,验证芯片功能的可靠性。

最终测试完成后确认的芯片,一般的命名规则:

5:FPGA的软件工具
5.1:软件开发流程

和ASIC的区别,会有一个固定的架构(这会影响后续的每一个步骤)
FPGA的EDA软件必须要适配硬件提供的架构,否则,没有用处。
5.2:RTL设计
第一步,仍然是输入RTL设计。

5.3:综合
然后,是将RTL综合成为门级网表。

5.4:Mapping
按照FPGA提供的Primitive,进行Mapping,匹配上FPGA固定的器件。

5.5:Place & Route
然后在FPGA中选择具体的物理元器件,涉及具体的物理位置。


选好位置,开始步线,保证实现原有的逻辑。


5.6:时序分析
布线如果不通,可以重新Place。同时,需要分析时序是否合适。

5.6:功耗分析
另外,需要做功耗分析。

5.7:FPGA设计关键
注意一下,实际上 FPGA 的频率要达到1G,是很难的(因为固定架构,需要更多的走线,时钟本身频率也不高)。但即使这样,运行速度仍然会比CPU要快很多(因为主频并不代表速度,高速更多源于并行运算),并且,频率越高,功耗越大,也是不适合的。
FPGA最大的一个问题:估算连线的时延很难,不是很准确。
我们在设计EDA软件前,一定要明白,在越靠前的地方,出错的成本会越高(这和做任何事情都是一样的)。

6:如何支持客户开发FPGA应用
对于客户,除了芯片,必须用到的是:
* 芯片的参数表
一般会涉及逻辑单元量(LUTS量,FF),Memory,DSP,通讯接口,DDR控制器,封装的引脚......
* 芯片的EDA工具,特别是GUI版本的工具
* 芯片的开发版
6.1:芯片参数表

6.2:EDA工具

客户使用场景最多的就是EDA工具。
在工具中完成仿真,就可以使用开发板,将程序下载到实际芯片,进行测试了。

6.3:如何获得客户
要获得一个FPGA客户,有6个步骤
第一步:做宣传,品牌营销,让客户知道。
第二步:深入介绍产品,让用户了解具体的产品。
第三步:帮助客户做验证,AE介入,评估产品是否适合客户。
第四步:与客户深入互动,解决客户遇到的问题。
第五步:免费试用,指导操作,促成客户购买芯片。
第六步:建立长期合作关系,加深客户的忠诚度。

6.4:如何更好的支持客户

客户可能不会给RTL代码,所以,很可能需要现场进行调试。
6.5:FAE是软件的最重要的客户
对于初创公司,需要尽快的发布产品,获得收入。所以,产品很有可能并不成熟。
所以,FAE可能会面临很多问题。
好了,大概就从这6个方面,重新学习一下FPGA的基础知识。