在之前的文章里,我介绍了入门FPGA需要学习的四个主要内容,分别是:RTL编程语言、数字电路相关的基础知识、FPGA开发工具,实验和实践的方法。 入门阶段学习的主要目的,主要是对这个领域有一个初步的了解,并且为之后的进阶打下一个坚实的基础。但是,如果我们想去寻找和FPGA开发、或者和数字电路设计相关的工作,仅仅靠入门阶段的这些内容是肯定不够的。 在这篇文章里,我们就继续来讨论一下FPGA的进阶学习路线。和入门路线不同,我想从入行和职业发展的角度,分析一下专业的FPGA开发者需要具备哪些技术能力,以及如何进一步的提升自己这些方面的能力。所以如果你有兴趣从事FPGA这个行业、亦或是正在寻找这方面的工作,或者已经入行一段时间,并且希望明确今后今年的发展方向,那么这篇文章应该会对你有所帮助。 和初学者相比,专业的FPGA工程师需要掌握更多的技能和知识。对此我归纳了四个方面,分别是FPGA相关的高级技巧、领域相关的知识、以及职业芯片工程师必须具备的硬实力和软实力。我也会介绍一些书籍和学习资料,希望能对你的学习有所帮助。 为了帮助大家理解,我总结了一个思维导图,涵盖了这期内容的全部知识点。请在公众号老石谈芯后台回复“FPGA进阶”获取。也可以在文末扫码进入知识星球,查看思维导图的高清pdf版本。希望精进FPGA的朋友,也欢迎在知识星球里和我一对一交流。 RTL设计的高级开发技巧 掌握基础知识之后,就需要继续学习FPGA以及数字电路设计相关的一些高级技巧。这部分的内容有很多,主要包含设计、验证、以及一些FPGA约束和优化的技巧和方法。 这里的设计指的是逻辑设计,也就是使用RTL语言实现一些相对复杂一点的模块或者系统,以及在这个实现过程中使用到的一些技巧。在本文也暂时不讨论高层次综合(HLS)的内容,也就是使用C语言或者Python等高级语言对FPGA进行编程。关于HLS的相关内容,可以看我之前的文章《高层次综合:解锁FPGA广阔应用的最后一块拼图》。 对于RTL设计,一个在面试中非常常见的问题,就是信号的跨时钟域处理。比如在跨时钟域的时候,怎么处理一位信号、怎么处理多位不相关的信号、怎么处理多位的总线信号、怎么处理复位、怎么处理脉冲,从快时钟域到慢时钟域怎么办,反过来怎么办等等一大堆。这类问题的集大成者就是FIFO的设计,特别是异步FIFO的设计,以及它的一系列变种问题。 一种异步FIFO的架构框图 关于跨时钟域和FIFO的问题,推荐读者朋友们仔细研究一下Clifford Cummings这位大神的几篇文章,他的文章非常全面的讨论了上面说的所有问题,我也会把其中的代表作分享到知识星球里。 Clifford Cummings 事实上,Cummings作为Verilog语言的协议制定参与者,他还写了很多文章,详细探讨了各种和数字电路相关的问题,比如如何写出好的可综合的RTL代码、状态机怎么写、UVM和验证相关的问题、还有很多SystemVerilog和Verilog的细节讨论。 对于进阶的朋友,我觉得这本书也有一定借鉴价值,名叫《FPGA设计实战演练 – 高级技巧篇》。这里面介绍了一些常见的FPGA设计的技巧和方法,比如前面说的时钟域处理、还有如何进行速度和面积的互换和优化等等。 值得注意的是,虽然在面试时常问跨时钟域处理这类的问题,但在实际的工程项目中是基本不可能让你从头写一个跨时钟处理模块或者FIFO的,这些功能早就被封装成一个个现成的模块了,直接调用就可以。 但这并不是所谓的“面试造火箭,工作拧螺丝”,前面介绍的这些高级技巧,更多的是在锻炼我们的思维方式和设计习惯。只有知道这些,才有可能在面对一个实际问题的时候,知道怎么根据需求去分析、设计和实现,并且得到最优化的结果。 验证的高级技巧 再来简单说一下验证。之前的文章里提到过,验证是一个非常复杂的领域。比如在下面的这张Mentor的图片里就显示,在一个芯片项目里,平均而言至少会有超过一半的时间花在验证上,有的甚至占60%~70%。以我自己的经验来说,这个比例会更高。 验证之所以复杂而且耗时,是因为我们必须尽可能多的检查到所有可能的设计功能和状态。验证里有一个“功能覆盖率”的概念,就是用来量化这个过程的。比如对于一个加法电路,a+b=c,我们肯定希望验证到:a和b取所有值的时候,结果c的值都正确。如果a和b都是一位十进制数,也就是从0到9之间随机选取,那么就有10x10=100种可能。但是如果a和b都是四位十进制数,那么就有10000x10000=1亿种可能,当然这还是非常简单的情况。 对于更加复杂的设计,比如多个数相加、相乘,或者在一些特定领域的逻辑功能、比如AI或者网络应用等等,我们很难通过仿真验证到所有可能的状态,甚至不可能覆盖所有可能的设计状态。 为了解决这个问题,就需要科学的制定验证计划,同时使用一些进阶的验证方法学,比如业界常用的随机约束、UVM或者形式化方法,来帮助我们构建更加高效的验证环境。关于形式化方法的详细介绍,可以参考之前的文章《形式化芯片验证:救世主还是乌托邦》和《形式化验证的阿喀琉斯之踵》。 一个基本的UVM验证环境示意图 很多芯片公司其实都有设计工程师和验证工程师的分工,但这并不代表做芯片设计的人不需要知道验证。事实上,那些优秀的芯片设计者同时也是优秀的验证者,他们可能不会用UVM或者形式化验证方法,但肯定会熟练掌握随机约束、参考模型建模、自动化测试、还有断言等等常用的验证技术,这也应该是我们应该努力的方向。 FPGA的约束和优化设计 除了设计和验证之外,FPGA相关的优化和约束也是进阶学习的重要内容。这里主要包括对时序、面积、功耗的约束和优化。比如,存在多个时钟的时候怎么写时序约束,怎么进行时序分析,怎么划分固定的设计区域,怎么预估设计的功耗等等。这个过程可能会贯穿整个FPGA项目的开发周期,而且一些常见的ASIC约束方法并不一定会适用于FPGA设计。 拿FPGA低功耗设计举例,门控时钟就不一定适合于FPGA。这是由于FPGA里的时钟网络是固定的,因此只能关闭固定的时钟树或者分支。如果需要做门控时钟,就必须控制某些特定的clock buffer,且要同时确定这些clock buffer可以被逻辑控制。更重要的是,我们还需要确保这个时钟驱动的逻辑都位于这个时钟树的“势力范围”之内,这就需要在布局布线时设置想要的位置约束。由此可见,门控时钟这个在ASIC设计里常见的低功耗设计方法,在FPGA设计里是困难且繁琐的。 FPGA时钟树示意图 领域相关的知识 进阶学习路线的第二部分内容,就是领域专用的知识,也就是Domain Specific Knowledge。我们之所以要学习这部分内容,是因为FPGA并不是单独存在的,它需要被应用在某些具体的领域和场景里。 比如,FPGA目前的一个很火的应用领域就是数据中心里的智能网卡。关于智能网卡的内容在之前已经说过很多了,包括微软、阿里、腾讯、京东、字节等等很多互联网公司都在布局这方面的技术。智能网卡的本质,就是使用把一些原本在CPU里运行的应用,卸载到FPGA里执行,这可以是网络协议栈、一些虚拟化的功能、或者是和AI相关的功能等等。 英特尔的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相关的高级开发技巧、各种领域专用的知识、还有芯片工程师必备的硬实力和软实力。针对每部分内容,我们也都深入的了解了如何去学习和提升自己的这些能力。 事实上,这里提到的各种专业内容只是我们日常工作中的一部分,它们可能会随着技术的发展而不断变化,甚至被各种新技术所取代。所以最重要的是,培养自己不断学习的能力,不断尝试新技术、新工具,努力跳出自己的舒适圈,只有这样才能一直保持自己的竞争力,从而实现更好的人生价值。 |
|