中电网移动|移动中电网|高清图滚动区

FPGA高阶入门指南

在这篇文章里,我们就继续来讨论一下 FPGA 的进阶学习路线。和入门路线不同,我想从入行和职业发展的角度,分析一下专业的 FPGA 开发者需要具备哪些技术能力,以及如何进一步的提升自己这些方面的能力。所以如果你有兴趣从事 FPGA 这个行业、亦或是正在寻找这方面的工作,或者已经入行一段时间,并且希望明确今后今年的发展方向,那么这篇文章应该会对你有所帮助。
 
和初学者相比,专业的 FPGA 工程师需要掌握更多的技能和知识。对此我归纳了四个方面,分别是 FPGA 相关的高级技巧、领域相关的知识、以及职业芯片工程师必须具备的硬实力和软实力。我也会介绍一些书籍和学习资料,希望能对你的学习有所帮助。

RTL 设计的高级开发技巧

掌握基础知识之后,就需要继续学习 FPGA 以及数字电路设计相关的一些高级技巧。这部分的内容有很多,主要包含设计、验证、以及一些 FPGA 约束和优化的技巧和方法。

这里的设计指的是逻辑设计,也就是使用 RTL 语言实现一些相对复杂一点的模块或者系统,以及在这个实现过程中使用到的一些技巧。在本文也暂时不讨论高层次综合(HLS)的内容,也就是使用 C 语言或者 Python 等高级语言对 FPGA 进行编程。关于 HLS 的相关内容,可以看我之前的文章《高层次综合:解锁 FPGA 广阔应用的最后一块拼图》。
 
对于 RTL 设计,一个在面试中非常常见的问题,就是信号的跨时钟域处理。比如在跨时钟域的时候,怎么处理一位信号、怎么处理多位不相关的信号、怎么处理多位的总线信号、怎么处理复位、怎么处理脉冲,从快时钟域到慢时钟域怎么办,反过来怎么办等等一大堆。这类问题的集大成者就是 FIFO 的设计,特别是异步 FIFO 的设计,以及它的一系列变种问题。

https://upload.semidata.info/new.eefocus.com/article/image/2021/01/05/5ff4035ee7b0a-thumb.png
一种异步 FIFO 的架构框图

关于跨时钟域和 FIFO 的问题,推荐读者朋友们仔细研究一下 Clifford Cummings 这位大神的几篇文章,他的文章非常全面的讨论了上面说的所有问题,我也会把其中的代表作分享到知识星球里。

https://upload.semidata.info/new.eefocus.com/article/image/2021/01/05/5ff4035ee7452-thumb.png
Clifford Cummings

事实上,Cummings 作为 Verilog 语言的协议制定参与者,他还写了很多文章,详细探讨了各种和数字电路相关的问题,比如如何写出好的可综合的 RTL 代码、状态机怎么写、UVM 和验证相关的问题、还有很多 SystemVerilog 和 Verilog 的细节讨论。
 
对于进阶的朋友,我觉得这本书也有一定借鉴价值,名叫《FPGA 设计实战演练 – 高级技巧篇》。这里面介绍了一些常见的 FPGA 设计的技巧和方法,比如前面说的时钟域处理、还有如何进行速度和面积的互换和优化等等。

https://upload.semidata.info/new.eefocus.com/article/image/2021/01/05/5ff4035f1480b-thumb.png

值得注意的是,虽然在面试时常问跨时钟域处理这类的问题,但在实际的工程项目中是基本不可能让你从头写一个跨时钟处理模块或者 FIFO 的,这些功能早就被封装成一个个现成的模块了,直接调用就可以。
 
但这并不是所谓的“面试造火箭,工作拧螺丝”,前面介绍的这些高级技巧,更多的是在锻炼我们的思维方式和设计习惯。只有知道这些,才有可能在面对一个实际问题的时候,知道怎么根据需求去分析、设计和实现,并且得到最优化的结果。
 
验证的高级技巧

再来简单说一下验证。之前的文章里提到过,验证是一个非常复杂的领域。比如在下面的这张 Mentor 的图片里就显示,在一个芯片项目里,平均而言至少会有超过一半的时间花在验证上,有的甚至占 60%~70%。以我自己的经验来说,这个比例会更高。

https://upload.semidata.info/new.eefocus.com/article/image/2021/01/05/5ff4035ee9ca7-thumb.png

验证之所以复杂而且耗时,是因为我们必须尽可能多的检查到所有可能的设计功能和状态。验证里有一个“功能覆盖率”的概念,就是用来量化这个过程的。比如对于一个加法电路,a+b=c,我们肯定希望验证到:a 和 b 取所有值的时候,结果 c 的值都正确。如果 a 和 b 都是一位十进制数,也就是从 0 到 9 之间随机选取,那么就有 10x10=100 种可能。但是如果 a 和 b 都是四位十进制数,那么就有 10000x10000=1 亿种可能,当然这还是非常简单的情况。
 
对于更加复杂的设计,比如多个数相加、相乘,或者在一些特定领域的逻辑功能、比如 AI 或者网络应用等等,我们很难通过仿真验证到所有可能的状态,甚至不可能覆盖所有可能的设计状态。
 
为了解决这个问题,就需要科学的制定验证计划,同时使用一些进阶的验证方法学,比如业界常用的随机约束、UVM 或者形式化方法,来帮助我们构建更加高效的验证环境。

https://upload.semidata.info/new.eefocus.com/article/image/2021/01/05/5ff4035edb60f-thumb.png
一个基本的 UVM 验证环境示意图

很多芯片公司其实都有设计工程师和验证工程师的分工,但这并不代表做芯片设计的人不需要知道验证。事实上,那些优秀的芯片设计者同时也是优秀的验证者,他们可能不会用 UVM 或者形式化验证方法,但肯定会熟练掌握随机约束、参考模型建模、自动化测试、还有断言等等常用的验证技术,这也应该是我们应该努力的方向。
 
FPGA 的约束和优化设计

除了设计和验证之外,FPGA 相关的优化和约束也是进阶学习的重要内容。这里主要包括对时序、面积、功耗的约束和优化。比如,存在多个时钟的时候怎么写时序约束,怎么进行时序分析,怎么划分固定的设计区域,怎么预估设计的功耗等等。这个过程可能会贯穿整个 FPGA 项目的开发周期,而且一些常见的 ASIC 约束方法并不一定会适用于 FPGA 设计。

拿 FPGA 低功耗设计举例,门控时钟就不一定适合于 FPGA。这是由于 FPGA 里的时钟网络是固定的,因此只能关闭固定的时钟树或者分支。如果需要做门控时钟,就必须控制某些特定的 clock buffer,且要同时确定这些 clock buffer 可以被逻辑控制。更重要的是,我们还需要确保这个时钟驱动的逻辑都位于这个时钟树的“势力范围”之内,这就需要在布局布线时设置想要的位置约束。由此可见,门控时钟这个在 ASIC 设计里常见的低功耗设计方法,在 FPGA 设计里是困难且繁琐的。

https://upload.semidata.info/new.eefocus.com/article/image/2021/01/05/5ff4035edb28c-thumb.png
FPGA 时钟树示意图

领域相关的知识

进阶学习路线的第二部分内容,就是领域专用的知识,也就是 Domain Specific Knowledge。我们之所以要学习这部分内容,是因为 FPGA 并不是单独存在的,它需要被应用在某些具体的领域和场景里。

比如,FPGA 目前的一个很火的应用领域就是数据中心里的智能网卡。关于智能网卡的内容在之前已经说过很多了,包括微软、阿里、腾讯、京东、字节等等很多互联网公司都在布局这方面的技术。智能网卡的本质,就是使用把一些原本在 CPU 里运行的应用,卸载到 FPGA 里执行,这可以是网络协议栈、一些虚拟化的功能、或者是和 AI 相关的功能等等。

https://upload.semidata.info/new.eefocus.com/article/image/2021/01/05/5ff4035ee186f-thumb.png
英特尔的 FPGA 智能网卡 C5020X(图片来自英特尔)

这里面就涉及到了很多领域专用的知识,比如计算机网络、网络功能虚拟化 NFV、软件定义网络 SDN,还有一些其他的虚拟化技术比如 Virtio、OVS 等。
 
此外,领域相关的知识还包括各种高速接口协议和总线相关的内容。比如 PCIe、DDR、HBM、以太网、收发器等,还有各种各样的总线协议。这些和 FPGA 也有非常密切的关系,在实际的求职应聘时也是重要的加分项。
 
在学习这些内容的时候,我个人建议还是结合目标职位或者项目的需求来,有目的的去学习,而不是想着一上来就一口吃个胖子。比如我就对使用 FPGA 进行高清视频处理相关的内容不太了解,因为我并不做这个方向,但我大概知道怎么构建知识图谱,并由此去一步步学习,这样其实就可以了。
 
职业技能相关的能力

FPGA 进阶学习路线的第三点,就是职业工程师需要具备的一些硬实力。比如,企业里几乎全部的开发环境都是在 Linux 系统里完成的,而且大部分时候没有图形界面。所以除了常用的那些 EDA 工具之外,还特别需要我们熟练掌握 Linux 的一些基本命令。此外还应该掌握至少一种脚本语言,比如 Tcl、Perl、Makefile、Python 等等。这能极大的提升我们的工作效率,这也是芯片工程师必备的技能。

此外,作为 FPGA 工程师,硬件调试的能力也是不可或缺的。一个在职业工程师日常工作中非常常见的场景,就是使用和调试各种各样的 FPGA 板卡,比如拿来一个全新的板卡,从头开始用它进行开发。
 
这就要求我们会看板卡的原理图、知道怎么写各种约束,怎么使用板子上的各种资源等等。此外,当设计出错时,怎么去进行硬件调试,还有怎么设计一些有用的逻辑功能来方便硬件测试,比如各种状态寄存器等等。那么对于某些专业领域,比如在网络领域,可能还需要知道怎么进行流量测试,比如 DPDK 的使用、配置,还有一些测试仪器的使用、一些常见的网络分析工具(如 wireshark)的使用等等。
 
总体来说,这些职业工程师需要具备的硬实力,可能在上学期间不一定都能接触到。这就需要我们在工作中不断实践和总结,才能把这些技能一点一点积累起来。
 
职业人士的软实力

除了硬实力之外,软实力的培养也至关重要,这包括沟通、时间管理、团队协作、领导力,还有不断学习的能力等等。

不管是芯片还是其他工程领域,绝大部分项目都是由很多团队一起协作完成的,因此如何与不同团队的成员沟通项目内容,如何制定项目规划、把握项目进度,以及遇到难题应该如何着手去解决,都是职业工程师几乎天天遇到的问题。
 
事实上,不管你从事或者打算从事什么职业,我们都应该从现在开始培养自己的各种软实力。比如多与人沟通,积极参加各种活动,或者像我在之前的文章《分享是程序员的必备素质》里提到的,不断分享自己学习和工作中的各种心得体会。这些肯定都会对我们今后的职业生涯大有帮助。
 
小结

在今天的文章里,我们梳理了一下作为一个职业的 FPGA 工程师需要具备哪些能力,一共有四个部分,分别是和 FPGA 相关的高级开发技巧、各种领域专用的知识、还有芯片工程师必备的硬实力和软实力。针对每部分内容,我们也都深入的了解了如何去学习和提升自己的这些能力。

事实上,这里提到的各种专业内容只是我们日常工作中的一部分,它们可能会随着技术的发展而不断变化,甚至被各种新技术所取代。所以最重要的是,培养自己不断学习的能力,不断尝试新技术、新工具,努力跳出自己的舒适圈,只有这样才能一直保持自己的竞争力,从而实现更好的人生价值。

猜你喜欢
中电网移动|移动中电网|频道导航区