一个FPGA工程师的成长之路
来源:内容来自「知乎」,作者:王yifei,谢谢。
最近逻辑组任务较多,人力不足,因此招了一些新员工。最近一段时间,也面试了很多人,各个行业和公司的都有,形形色色的人面试多了,也有一些感触,另外,年近而立,也需要总结一下。在此记录下来,与君共勉。
关于行业和公司规模
关于行业
面试了几个月,收到了几百份简历,面试的人也有好几十。回想一下,投简历的大概有以下几类:
完全不懂逻辑的,比如,有网吧的网管,也投简历做逻辑验证工程师。应届生做视频、安防相关行业的、做芯片的、通信行业的小公司、通信行业的大公司,甚至超声行业。其中,第1,2两类,肯定是完全不考虑的。
第3类,做视频和安防的,面试过几个,一般这种公司,逻辑的人员规模都比较小,经常有人做个2-3年,就做到逻辑组长了,但是他们一般水平都不高,基本的时序约束都不做,仿真也不做,一般逻辑规模都比较小,直接上板用signaltap调试,对整个逻辑研发的流程也不熟悉。
第4类,asic工程师,这类工程师,一般代码水平和仿真水平都还可以,整个设计流程也比较严谨,但是纯粹的asic工程师,如果没做过fpga,并不适合我们公司,对fpga内部器件不了解,对时序约束的经验也不多,而且asic的工期很长,几年下来,做不了几个项目。一般纯粹做asic的,都难以通过第一面,有一部分做过asic的fpga验证的,或者中途转行,既做过asic,也做过fpga的,水平还可以,其中有几个进入了二面。总体而言,asic工程师并不太适合转作fpga。
第5类,通信行业的小公司,也面试过一些。一般通信行业的小公司,里面都有一些人,之前是在华为、中兴做过的,整个公司的逻辑水平,还比较好,因此,这一类的求职者,水平也还可以,不过主要是看个人,有一些知识较全面,也有一些懂得并不多。
第6类,这一类,一般就是华为、中兴,最近这两家公司离职的人也较多,面试的有一半以上,都有华为、中兴的工作经历。这一类,一般工作年限3年以上的,水平都比较好,知识面比较全,整个流程也比较清楚,而且流程和文档做的比我们公司要好。但是缺点就是很多人做的比较窄,基本上只做一个点,虽然知识面还好,基本都懂一些,但是很多方向都没有自己动手,有一些部门,写代码一拨人,编译工程一拨人,仿真验证一拨人,查bug又一拨人,导致对整个全局把握较少,另外,这些人原本待遇就比较高,尤其是华为,很多人比我工资都高好多。
第7类,超声行业,这一类是比较对口的,但是人很少,只面过几个,对超声有一些了解,但是逻辑水平确实比M公司要差一些。
关于公司规模
好多人在一开始找工作的时候,往往面临一个选择,是去一个大公司,还是去一个小公司。大公司比较正规,可以学到很多知识,小公司机会比较多,说不定过几年就成领导了。
以上两种说法都有道理,但是都不全面。
大公司比较正规,流程等也比较正式、全面,技术积累也比较好,确实可以学到很多,而且都是正规套路,比如华为,有非常正式的流程,从方案到设计文档,每个时间段都有严格规定,等到写代码的时候,基本已经成竹在胸了。比如中兴,新人做一个设计,基本上都有非常全面的文档来告诉你,怎么做,以前出过哪些问题,基本上一个智商正常的人都可以顺利完成。
但是大公司也有一些缺点。首先,分工太细,不仅仅是设计上,也在流程上。比如之前面的一个人,做了5年,一直在做接口,而且是同一个接口,这个地方可能已经做的很好了,甚至可以说水平在国内都是比较高的了,但是知识面太窄,其他的不了解。还有一些人,只做代码,连工程都不需要编译,这样,就对代码的器件实现了解不多,实际工程经验也很少。之前面试过一个中兴的,主做信号处理,做了3年,基本上完全不知道fpga是啥,只懂信号处理的verilog代码实现,连逻辑基本单元由查找表和寄存器组成都不清楚。
另外,大公司一般项目进度都比较严谨,在多年的经验积累中,项目进度一般都定的比较准确,这就意味着你必须每天都在做项目,跟进度,很少能留出时间来自己学习,更不用说拿几个星期出来,改改逻辑架构,做些自己有兴趣的事。不利于个人的提升。
对小公司而言,要自由的多,能够接触到的也要多一些。我面试的一些小公司的人,一般都能从头到尾都接触到,包括方案,代码,仿真,调试,debug。也有一些2-3年就成为逻辑组长的。
不过,小公司的缺点也是很明显的。除非小公司有技术很牛的人,否则,一般都难以有很完善的流程,技术上也很难做到比较精深。很多小公司的,连仿真都不做的,而且只做时钟频率约束,管脚的输出输出时序约束都完全不做。所以,小公司出来的,一般都不那么正规,而且水平也很难做高。
面试过许多人后,再回想一下,应该说,M公司还是提供了一个很好的平台的。
虽然M公司有种种缺点,比如,流程很简陋,对文档的要求比较低,基本上文档就自己写写,然后评审一下,文档写的不正规,而且过一段时间,代码跟文档都对不上。整个逻辑的配置管理也比较乱,很多项目都说不清楚逻辑是复用了哪个的,又改了些啥。
对代码的要求也很低,或者说,有要求,但是没执行。每个人都按照自己的习惯来,以至于我不用看说明,随便从代码中找出一段看看,就知道这段代码出自谁手。
积累和培训做的不好。基本上,我在M公司被培训到的逻辑知识比较少,有过一些培训,但是效果并不好,大部分都是在项目实践当中学到的。基本就没有一个培训体系,全靠自己悟,自己问。
但是M公司还是一个比较好的起点。首先,逻辑规模足够大、足够多样、足够复杂、更改足够多。规模大,就会有机会使用比较大,比较高级的芯片,而且,规模大,对人的掌控能力也有很高的要求。足够多样,知识面就会比较广,当前的逻辑有各种接口,包括transceiver,pcie,spi,uart,i2c,ddr,lvds,ssram,ccir656,rgb等等各种接口。以及相应的各种逻辑。既包括信号处理相关,也包括各种复杂控制,还有视频相关等。足够复杂,对于提高逻辑水平有很大帮助,当前有很多逻辑设计都是比较复杂的,比如数据缓存,pcie上传,xx控制等。更改足够多,就意味着有很多新东西可以做,而且需求的多样性更改,才能催生一系列的设计思想。软件就是因为要处理各种复杂、多变的需求,才衍生出了各种思想,如面向对象、设计模式等。
另外,每个人负责的逻辑设计,流程上可以走完整。包括老项目的维护,在研项目的需求、方案、设计、仿真、调试、debug,以及新项目的预研,都可以全程参与,对逻辑的整个流程会有比较深刻的认识。而且,不仅仅是写代码,包括设计的编译,调试,debug等工作,可以对负责的逻辑设计,有更加深入的认识,对逻辑的可阅读性、可复用性、可调试行等原则有所感触。
另外,得益于逻辑组一定的流动性,可以将逻辑的各个模块都做一遍,而不是只能一年一年的只能做同一个设计。我来公司几年,做过的设计包括 视频、电源管理、按键板、XX、XX管理、newC、pcie上传、XX、数据缓存、信号处理、XX控制,基本上,超声相关的逻辑,除了xx,其它的,或深或浅的都做过,即使xx,我也曾自己花了2个星期的时间企图重构过,对其设计也有一定的理解。这在大公司,是不可能的。
另外,由于我们公司的超声还没到世界领先水平,以及系统组同事无穷无尽的新想法,每个逻辑设计的方案,都在不同的项目之中变来变去,而且不同于通信领域的固定处理方式,我们公司的逻辑基本上是没有参考的,完全由做逻辑的人来确定,有非常大的发挥空间。
另外,由于我们公司还比较低级的项目管理水平,项目进度的安排并不怎么合理,有些项目中,是有时间可以做一些事情的,当然,最近一两年几乎没有了。但是前几年,我曾经有几次,可以抽出几个星期的时间,并行的做一些我感兴趣的事情,比如逻辑重构。
综上所述,在职场的起点,选择一家好的公司,是非常重要的。
一个逻辑工程师的成长之路
面试了很多人,有些水平高,有些水平低,有一些公司有严格的职级,比如华为,完全可以根据其职级来得知其逻辑水平,而且华为的业务职级和技术职级还是分开的。我们公司也有职级,但是,不同的公司之间,或者说,逻辑工程师,没有一个比较普遍、统一的标准来衡量其水平。
我一直比较困惑于这个问题,原因来自于从小受到的教育和长大后经常看的小说。小时候的学习成绩,是非常容易识别和量化的,分高分低,一比就知。成年以后,看过各种小说,武力高低,也是有非常明确的量化的,一个人完全可以非常清楚的知道,自己的级别。比如xxxx,用魂力来表征水平,从1-100,每10个级别为一个大的等级,虽然这不能代表真正实力,但是至少让读者可以看到主角的逐步成长。不过,这也只是小说,现实生活中,是没有这个东西的。
鉴于这些困惑,在本章,按照我自己的简单的经历和粗浅的认识,对逻辑工程师的水平做一下初步的划分。
第一阶段:能用
阶段特点:这个阶段,基本上处于刚刚接触到verilog代码一段时间,知道大概的语法,能够把一个需求用代码实现出来,并且能够调试出来。总体而言,处于一个能用的位置,可以实现,但是并不清楚代码与实际器件实现的关系,对逻辑的硬件思维基本没有。
阶段评价:此时,尚且不算一个逻辑工程师,因为只会写代码,没有逻辑思维
提高途径:如果有审美,有需求,自己有内部推动力,将开始进入到第二阶段(我有见过中兴的3年的算法工程师,做了3年只懂算法实现,完全没有逻辑硬件思维,因此,时间长短跟水平并没有直接关系)
第二阶段:可用
阶段特点:这个阶段,开始关注代码风格,开始把自己的代码写的风格统一,并且开始关注代码的硬件实现,突出标志就是开始关注rtl视图,可能还不怎么关注器件视图。但是基本知道器件的大概结构,知道fpga里面有le,ram,dsp,全局等等。比较能明确的区分可综合语句与仿真语句的区别。
阶段评价:这个阶段,基本可以称为是一个逻辑工程师了。能够完成设计实现,仿真,调试,能够做出逻辑设计说明。
提高途径:此时,一般开始负责一个模块,如果该模块在其他项目上复用,并且略有更改,有的人会直接修改,而有些人开始有更多的考虑,由此进入第三阶段
第三阶段:好用
阶段特点:这个阶段,由于上一个阶段已经可以实现设计,在这个阶段,开始考虑设计的复用,开始考虑模块的划分,注重模块接口,平台化等等。
并且,此时对模块内部的代码书写有了更加深刻的认识,模块内部的写法开始更加统一,基本上,模块内部的代码可以直接生成rtl视图。
并且,此时开始关注器件结构,了解fpga的内部架构,时钟网络,route,对时序约束有了基本的了解。
阶段评价:这个阶段,可以认为是一个基本成熟的逻辑工程师了,逻辑所需要掌握的知识方向,基本都有所了解,而且,不仅能够完成设计,还能在设计之前做出方案,而且做出的设计,模块的划分比较合理了。
提高途径:此时,一般会开始接手一些比较大的前人的设计,有的人会尽量复用,有些人会有更多的考虑,由此进入第四阶段。
第四阶段:易用
阶段特点:这个阶段,会接手一些比较大的设计,开始有架构的考虑,对于模块的划分,模块接口,模块职责,整体方案的实现,开始有更多的考虑,此时,可以做出比较好的,合理的方案,而且对逻辑的各个方向的知识,都有了比较全面而深入的了解,比如仿真,器件结构,时序约束,模块划分等等。
阶段评价:这个阶段,可以认为是一个比较优秀的逻辑工程师了。能够在项目之初给出比较好的逻辑方案,并且能够快速而高效的完成设计,仿真和验证。对应可能发生的时序,等等问题,也有比较好的考虑。
提高途径:此时,如果有机会可以带领一个团队,会进入一个不同的领域,能够接触到更多的东西。
第五阶段:逻辑架构师
阶段特点:这个阶段,会负责一个团队,或者一个项目的逻辑设计。开始对整体的逻辑架构有所考虑,并且开始准确的划分逻辑架构,并分配不同的工作任务,由于需要团队协作,因此要求对逻辑方案,逻辑进度,逻辑技术,有非常深刻的认识。
阶段评价:可以给团队制定逻辑代码规范,逻辑设计流程,
可以轻松的完成逻辑整体方案的设计,并且准确识别风险点
可以准确的划分逻辑架构,模块接口,功能划分,工作职责,
可以准确的预估项目的风险,进度
可以准确的做出逻辑的整体方案,仿真方案,调试方案,对于整体的业务流有全面而深刻的认识
对于逻辑的各个知识方向有非常深刻的认识,
熟知各个厂家的各种逻辑器件的内部结构,基本逻辑单元结构,以及由此带来的代码风格的相应的改变
熟知时序约束,并且能够采取各种手段,解决各种时序问题
对于逻辑的布局,数据流走向有深刻的认识,
对仿真有深刻的认识,熟知仿真器原理,并且开始搭建可重用,复用性好合效率高的仿真平台,或者使用高级仿真
此时,基本有10万代码量。
提高途径:由于本人仍在此阶段挣扎,因此,尚不知如何提升。也许可以关注一下板卡,向硬件系统方向发展,或者补充验证方法学,向数字部门方向发展,或者整合逻辑、软件、系统,向系统方向发展。在此阶段,逻辑本身相关的技术,也许已经到达一个瓶颈了。
由以上各个阶段的发展可知,一个好的逻辑工程师,一是要有好的环境,可以学到东西,二是要有机遇,可以遇到不同的情景。但是最重要的还是,对自己有要求,有追求,自己内部有不断的推动力,可以使自己不断的学习进步
一个逻辑工程师的成长之路-实例篇
上一章的模型,其实就是我自己的经历,大概套一下吧。
第一阶段(2008-2009)
第一阶段:能用
在我刚进公司时,勉强算是第一阶段,严格来讲,我虽然学过数字电路设计,但是当时用的教材很老,并没有讲述跟fpga相关。后来在实验室,买了一块开发板,才慢慢开始学习fpga。
刚进公司的时候,完全没有硬件时钟的概念,没有时序约束的概念,刚刚处于能用verilog代码完成需求的阶段。
不过机会很好,当时就赶上了M1项目,负责了电源管理和视频。比较适合新人的两个设计。
比较顺利的完成了代码和仿真,调试的时候,也还比较顺利,开关机,屏幕显示,都按时完成了。
不过,此时并不太明确verilog代码与fpga器件实现之间的关系,写代码时,不是考虑fpga能否实现,而是考虑是否符合verilog代码的语法。
此时大概是2008年下半年和2009年初。
这个阶段,写的代码其实是比较差的,不管从代码风格,还是从代码设计,模块划分等。不过鉴于本人良好的重构习惯和对代码风格的极致追求,这段时期写的代码,基本上都看不到了。
后来做完M1之后,在做M2(2010)之前,大概有1年的时间,这段时间内,项目进度没有那么紧,有一些时间可以学习,开始进入第二阶段。
第二阶段(2009)
第二阶段:可用
2009年这段时间,做了xx的一块板子,M3的键盘板,svideo,万能按键板等3个项目。
时间比较充足,加之本人的习惯,喜欢对一个事情追根究底,希望可以弄明白,想清楚。
这段时间,学习了很多关于综合,关于器件结构等的知识,在网上也搜了很多资料,自己也研究了altera的cyclone3的器件。还曾经想写一个ppt,把逻辑中常用的代码,对应的综合结构和布局布线结构都搞清楚,后来做的时候才发现,跟理论值不一致,才作罢。这个阶段也看了很多关于时序约束的内容,不过此时对时序约束的理解还不深入,而且随着做的项目的增加,debug经验的丰富,水平开始逐步提高,能算得上是一个合格的逻辑工程师了。
2010年,开始做M2项目和M4项目。涉及到了xx逻辑的重构和svideo视频的重构,开始进入第三阶段。
第三阶段(2010-2011)
第三阶段:好用
2010年主要做了两个设计,一个是M2的发射逻辑,一个是M4的视频逻辑。
发射逻辑是一个比较典型的例子,当时对逻辑设计有了一定的认识,也有了一定的想法。M2的发射逻辑是基于M1的发射逻辑的,但是被我完全重构了,此时开始考虑逻辑的模块划分,接口时序。
而且由于发射逻辑扇出较多,开始考虑代码的布局布线与时序收敛。
同时,对代码的书写开始有要求,这个阶段的代码,应该说开始有了自己的风格,而且写的比较好。这部分的代码,后来未再修改,还可以在svn上看到。
M2的发射逻辑是做的比较顺利的,在板卡回来之前1个月,基本上设计和仿真就全部完成了,也有一些时间来学习,后来调试也非常顺利,发射几乎没出bug。
下半年做视频逻辑。
由于在M1做了视频逻辑,M2的视频由其他人负责,在做M4的视频逻辑时,水平有了一定的提高,而且时间也比较充足,兴趣也比较强烈。在M4的视频逻辑上,做了很多重构的工作。
其中,lpc总线模块,就重构过2次,对于状态机的写法进行了深入研究,svn上可以看到M4的lpc代码和M1的代码是不一样的。
svideo部分的代码,起初是09年xx写的,后来我接手后,曾经重构过一次,把代码全部整理了一遍,并彻底搞懂。由于M4的视频需求更改,由一路svideo变成两路:svideo和dvr,所以又将这部分代码再次做了颠覆性的重构。
这个阶段,可以说对逻辑的架构,已经有了初步的认识和一定的经验。而且视频大多跟外设打交道,此时对时序约束已经比较清楚了,有些时序上的问题,已经可以比较容易的解决了。
此时写的代码,不管是代码风格,模块划分,接口,逻辑架构,都已经比较好了。
不过,此时多是在折腾自己的代码,比较熟悉的代码。(svideo算是一个中小的,别人写的代码)。真正考验逻辑架构能力的,是对别人留下的一个中等的、复杂的、功能正常的逻辑做重构,变成一个架构合理、简单易用的逻辑,而且整个过程还要尽量少出bug。
等待的时间不算太久,10年底到11年初,还做了一个M4的newc,完全是一个全新的逻辑,也算是初步了解了信号处理,而且全部从新的设计,也增加了架构经验。11年中,做了任意波的方案,虽然只做了方案,没做具体设计,但是此时对于逻辑方案,架构,已经有驾轻就熟的感觉了。
很快,机会就来到了。
2011年下半年,开始做M5的pcie上传逻辑。
这个设计,完全满足一个架构能力进阶的要求。
第四阶段(2011-2012)
第四阶段:易用
从2011年下半年的M5,到2012年的M6,是属于第四阶段的。
上传逻辑是一个别人留下的一个中等的、复杂的、功能正常的逻辑,对此做重构,挑战还是非常大的。之前对此完全没有了解。不过svideo的重构也为此打好了一定的基础。
这段时间是进公司以来积极性比较高的阶段,不停的在学习,几乎将整本《PCIE系统体系结构标准教材》全部翻完。而且每天都在消化,修改代码。由于这段时间白天很多杂事,经常晚上工作到半夜。
上传逻辑的重构,应该说是做的比较好的,短时间内将一个复杂的设计重构,而且设计上仅出了1个bug。后来该设计复用到后续所有的项目,M6,M7,M8,M9。
M5的联调,也仅用了2个星期,非常顺利。然后各种模式的联调,也都非常顺利的出了。
上传相关的总结,已经放在《pcie协议介绍,ip介绍,上传逻辑介绍,上传设计经验分享.ppt》
2012年.开始做M6项目。
这个项目,是将全部的超声逻辑,都放入到了一片fpga当中,所接触到的、所能修改的架构,变得更大。也是一个非常好的可以提高水平的设计。
对于其中的xx、xx、数据缓存、pcie上传都做了修改。
不过,之前的重构之路一直很顺利,终于在M6上栽了跟头。重构失败,最终又退回到老版本。
其中种种,已经放在《xx项目总结-逻辑方向.ppt》
经过两个项目的洗礼,对于逻辑设计,器件,时序,架构等等的认识,更加深入了。
此时,对于xx控制逻辑的重构,也有浓厚的兴趣。M5做完,M6开始之前,还曾花了3周看xx代码,只是当时已近年关,效率较低,年后即投入M6,xx重构未在进行下去。不过xx控制的重构后来倒是做了。
此时,应该算是一个比较优秀的逻辑工程师了。
对于器件和时序的认识,比较深刻。例如给出了《FPGA的管脚分配指南-时序相关.doc》
2012年中,成为逻辑leader,不过由于M6事物繁忙,直到大概9,10月份,才开始着手管理团队。
第五阶段(2013-)
第五阶段:逻辑架构师
之所以认为,要进入第五阶段,必须要成为逻辑相关管理人员,是因为此时需要操作的代码和设计是非常多和复杂的,所以需要一个团队来共同完成。而且,开始更多的从整体开始考虑。
这个阶段,主要主导完成了M7项目和M8项目。
开始对整体的逻辑架构有所考虑,并分配不同的工作任务。
对于整个项目的逻辑设计开始负责,完成整体方案,识别风险点,保证时间节点,并且熟悉整个业务流。
由于这2个项目换用了全新的fpga,因此再次加深了对器件和时序的认识。例如M8的管脚时序约束的风险解决。
并且开始搭建可重用,复用性好合效率高的仿真平台。
M7项目7周出图,但是基本相同的工作量和参与人员,M8只用了2周出图。对于项目整体的把握,有了提高。
此时,已经写过11万代码
目前,仍处于本阶段之中。
逻辑工程师水平的V模型
第3章讲述了一个逻辑工程师是如何发展的,并且给出了各个阶段的特征,但是,仍然没给出清晰的量化,本章,尝试对这个问题给出一个解决方案。
逻辑工程师应该掌握的各种能力
大概设置了5种能力,每种能力在不同的阶段有不同的要求。其中,设计完成能力是最基本的要求。
设计完成能力
第一阶段:可以完成设计,基本知道verilog的语法,能够把一个需求用代码实现出来,并且能够调试出来,经常会上网搜索现成的模块,对逻辑的硬件思维基本没有
第二阶段:开始关注代码风格,开始把自己的代码写的风格统一,并且开始关注代码的硬件实现,突出标志就是开始关注