第一块商用FPGA是1985年Xilinx推出的XC2064,如今FPGA因其自身的可重复编程和并行性等特征已经是人们在克服冯诺依曼架构缺陷的一个重要方向。在日常的使用中,一直想深入了解下FPGA的内部构成,而每次看到LUT、CLB等都是云里雾里的。这次幸运地在"Data Processing in FPGAs"这本书里找到了我想要的答案,其介绍很好地契合了我想了解的level,感兴趣的推荐直接去阅读原文。
另补充一篇Xilinx逻辑单元-ug474笔记
下面先从图1所示设计流程内容进行阐述,分为Logical和Physical两个层级。
Logical
- FPGA自身开发难度大,学习成本相对较高,因此有工作就致力于实现high-level synthesis,以从京生老师的研究组为代表,其成立的公司后来被xilinx收购。High-level synthesis的目的是让开发人员直接编程高级语言(如C语言,学习曲线较合理),之后由软件自动将其转化成HDL或电路实现,但以目前的效果来看,离直接上手写HDL还是有不小的距离。
- RTL synthesis将RTL转换成未优化的布尔逻辑表达式。
- logic optimization在上述基础上进行优化,如去掉冗余逻辑。
- technology mapping主要功能是将抽象的设计表达映射到the cell of a technology library(cell library)。由设备制造商提供,种类涵盖standard cell(即基本逻辑门)、复杂点的megacell(如DMA controller)。在进行映射的过程中,结合预先设定的面积、功耗和时序等约束,可以在不同的候选cell中进行取舍。
Physical
- 通过前述工作得到的即网表(netlist),包含instance(对应前一步骤中的cell)和net(即不同instance之间的连线)。为了将逻辑真正地在硬件上固化下来,接下来需要进行布局和布线的工作。
- 布局:通过floorplanning识别出空间位置需要尽可能接近的结构,之后进行初步布局,在此基础上,加入clock tree并且重新评估改变布局。
- 布线:在布局完成的基础之上,结合cell的具体几何尺寸,进行布线。
Look-Up Tables
在ASIC中,组合逻辑是通过将不同的逻辑门按特定形式连接起来实现的,逻辑门内部实现可以再追溯到NMOS和PMOS层级;而在FPGA中,逻辑门由LUT模拟实现。
一个n输入的LUT需要2^n个SRAM用以保存真值表,reprogramming也就体现在SRAM中的数据可以依据具体不同实现而被更新。如下图左侧所示,一个4输入的组合逻辑,如果写出真值表,一共16行,每行代表一种输入组合形式,LUT实现的方式便是将输入信号作为mux的选择信号,将最终想要的输出从对应SRAM中取出来。
L