用之有道—如何用尽FPGA芯片的所有资源
0赞在我的上一份工作中,我进行FPGA设计的目标一直是以尽可能少的资源占用率实现系统能达到的最高性能。因为产品本身对成本十分敏感,对代码中每一 个时序进程的使用都要倍加小心,毕竟多使用一个32位的寄存器就会多占用FPGA芯片中近0.5%的逻辑资源;相反,由于FPGA几个外部接口的带宽都不 高,性能上的要求(重视延迟、轻视吞吐率)总没能接近所用FPGA芯片的极限,性能上的顾虑少了很多。所以编码上总是以在不违背同步设计的原则下使用最少 的LE为目标。
在当前的设计中,FPGA的可用资源大了一个数量级,系统的复杂程度也有了质的提升。与上一份工作不同的是,资源上LE的使用可以不那么吝惜了,但 是在性能上一定要达标。编码上放松了对时序进程使用量的约束,取而代之的是大量移位寄存器的例化,目标是以流水线结构尽量保证系统的高性能(轻视延迟、重 视吞吐率)。最近的几次编译为了实现既定的时序目标,总要来来回回地费上几番周折。虽然屡屡能够达到时序收敛,但是心中总难免有一种侥幸成功后的不安:下 一次的编译会不会失控。
对同一款FPGA芯片来说,其逻辑资源是固定不变的,而其性能是一个相对模糊和易变的指标。不同的设计,甚至是同一款设计基于不同源代码版本或者不 同配置选项的两次编译,在时序性能上都会表现出较大的差异。相比之下,上一份工作针对逻辑资源的约束目标比当前工作针对时序性能的约束目标容易实现得多, 挑战性也相应地小了很多。
由于上面的原因,最近一段时间以来,我一直在探寻各种实现系统时序收敛的方法,目标是找到一条实现FPGA时序收敛的可控之道。苦思冥想多日,查阅 了多方资料,仍然是问题多于答案。自己对FPGA的底层结构了解不够,对EDA工具操作流程的目的意义和每一步流程的输入输出所知甚少,对EDA工具的算 法更是一无所知。囫囵吞枣多年,仍然是门外汉一个!(归根结底,还是项目做得少)
今天在闲读《编程之美》这本书的过程中突发奇想:软件开发工作者可以通过一段程序实现对CPU占用率的精确控制,那么FPGA硬件工程师能不能通过 一段代码实现对FPGA逻辑资源占用率的精确控制呢?
对于这一问题,我还没有答案。需要考虑的因素很多:
1. 时序逻辑资源的控制相对简单。
2. 组合逻辑资源的控制需要考虑逻辑化简的影响。
3. 在一个LE之中除了基本的时序和组合逻辑资源,还有进位链、异步控制信号这样的逻辑资源。如何实现这些资源使用率的精确控制?
4. 同一个LE中的寄存器(时序逻辑资源)和查找表资源(组合逻辑资源)是可以独立使用的。跨LE的组合逻辑化简对组合逻辑资源的占用有何影响?
5. FPGA中占用面积最大也最重要的资源并不是LE,而是布线资源。如何实现对LE簇内部和LE簇之间的两类布线资源占用率的精确控制?
6. 全局布线资源(比如全局时钟和全局复位)的精确控制?
7. 存储器和DSP资源的精确控制?
8. EDA工具的优化配置选项对此有何影响?Area? Speed? 还是Balanced?
9. 布局布线工具的布通率对此有何影响?
10. I/O资源如何用尽,引脚分配约束对此有何影响?
随着对这一问题的思考,对于提出和思考这一问题的意义,我却越发地明朗起来:
1. 作为促进自己探索FPGA底层结构和摸索EDA工具脾气的练习项目。由于目标是以尽量简单的代码实现尽可能高的资源利用率,没有了实际项目中复杂功能结构 的干扰和限制,思路就会更加清晰,规律就更容易总结。
2. 作为探索芯片性能的一种极限手段。当各种逻辑资源的占用率趋于极限时,由于EDA工具可自由调配的资源极度匮乏,对FPGA芯片极限性能的评估就少了许多 变数,评估过程的可控性就得到了提高。
3. 模仿微软的做法,可以把这一理想实验作为面试题。一来考察应试者的思路和对FPGA开发的认识,二来可以从应试者的回答中得到意外的启发。