FPGA工程师的核心竞争力是什么?
4赞作者:Evan172
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
调板子debug的能力。
FPGA工程师大致分两类:FPGA作为产品的工程师和IC原型验证工程师
先说前者,不管是RTL design还是做simulation的、上板测试的都算FPGA工程师,并且往往一个工程师者随着项目进度会从头做到尾,项目的输出就是FPGA bitfile作为产品的一部分正常工作,所以导向就是最终上板的结果。从项目时间来看,前面coding和simulation占据一部分时间,很多代码还是复用之前项目的,而debug就分单独模块验证、整块FPGA验证、软硬件跨部门验证、整体系统验证等,调试占用的比重越来越大。
而FPGA的特点决定了调试不太容易,相比simulation来说困难多了,出现一个issue先定位是软件的问题、硬件的问题,还是FPGA的问题?如果是FPGA的问题,容易复现不?如何判断是哪一部分模块的问题?大致的问题在哪里?如何设置debug点,使用identify/chipscope/逻辑分析仪去抓?出一个版本往往按小时算,一次设置trigger信号可能还找不到想找的点,需要多次去抓信号和出版本。这过程中,没经验的工程师是赶急赶忙地去出调试版本,或不知从何下手,忙很久却劳而无功;有经验的先分析推测问题可能出现的地方,分步骤去验证问题的原因,能较快地定位在issue所在。这就是核心竞争力!
IC原型验证工程师,如另一答案所说,有的公司就是工程师兼一下把活干了就行,有的则是正规的team专门做原型验证,尤其是涉及到多块大容量FPGA分割方案的。这里FPGA与simulation相比优点就是在真实的物理环境中运行、运行速度快、能run大量的case进行回归测试,缺点也很明显,介入时间晚,移植到FPGA平台花的时间很长、需要处理大量的硬件相关问题如时钟外围器件管脚连接、debug困难等。随着芯片规模扩大,二者各自的优缺点越来越明显,越来越多公司开始使用Emulator,Emulator更偏向simulator的硬件化,离simulator更近,离FPGA远多了(本人现在emulator AE)。
同样,做原型验证的工程师有什么核心价值?别人搞不定的问题你能搞定,这就是价值所在,比如需要实际接硬件作为激励源发某个特殊case才能复现的issue,重要性还很高,simulation搞不定,你在FPGA上搞定了,谁敢小瞧你?要是仅仅跑个流程,能用就行,随便找个人都能玩通的活,公司又不是傻子给你那么多钱干啥?
综上,你的工资是公司付给你不可替代性的成本,你越不可替代,你的价码越高,如果太低你就会跳槽走掉,太高公司也会找机会把你换掉。这其中有普遍性分工的因素(比如普遍性而言design给的钱比原型要高些),也有具体个人的因素(你牛就该拿高价),不宜过分强调哪个极端。
---------------------------------------------
如何提高debug的能力,来个可执行性高的方法:给上司和相关人员发邮件汇报工作,整理思路并记录过程,同时展示你的工作成果。
比如在系统联调中出了个bug,先给上司口头汇报下这个情况,然后去定位,到一个阶段或下班前发邮件,先描述下环境配置和现象,让别人知道是怎么回事(有些人开头就说具体过程,听的人不知所云),然后你定位到确实这个现象发生了,稍微描写下发生的问题;
接下来分析可能性,出现这个问题可能的原因,怎样去确认是哪个环节发生的事情,并且你因此做了哪些操作去确认来进一步缩小范围;
如果是哪个小范围的问题,可以做哪些操作去进一步确认问题,比如打印中间变量结果、出测试版本加chipscope信号去抓取数据、bypass某些旁路等;如果一次性没找到问题的根源,那之前的操作排除了哪些可能,接下来还有哪些操作可以去做去确认,需要做的工作和工作量、时间评估、需要的资源支持评估等;
如果通过debug找到了issue所在,分析下产生的原因在哪里,是低级错误、test case没覆盖掉、健壮性不够、软硬件配合、还是架构上有问题?如果是简单地修改该怎么做,要多少工作量,影响有多少?如果是完全解决这个issue,涉及的范围有多广,收益和风险在哪里,该不该做?提出建议,让上司等决定。
如果问题一直找不到,那可以采用什么样的手段规避掉,收益和风险又在哪里?
如果问题不复现了,可能产生的风险有多大?需要记录下来,下一次可能又会出现。
如果把一次次的邮件内容同时整理下来,放在word文档里,适当编辑下格式,加上日期、环境配置等信息加在邮件附件里,更往上点,有专门的issue track平台在上面记录,那就更好了。
秦冕的观点:
看了几位回答者的答案,结合自己接触FPGA一段时间的理解讲一下自己的看法。
首先想说一下对于楼主的问题FPGA工程师的核心竞争力,其实FPGA工程师在真正工业界还是有细分的,大致可以分为两部分,做IC原型验证的(包括design和verification),用FPGA开发产品的,做IC原型验证大多不需要了解算法,只是根据设计人员的设计框图实现逻辑(大公司);做产品开发的可能离具体的应用和算法更近一些,相当于将特定应用和算法做硬件实现。
我这里答案更加侧重的是做FPGA实现这类的工程师(包括IC原型验证的design和产品设计的design)。我将更细致的给出一些我认为重要的能力。
1,RTL设计实现能力。前面几个答案大多提到了算法实现能力,我将这归结为RTL设计实现能力的一部分,RTL实现是FPGA工程师或者说HDL开发人员的入门首先接触到的东西,我将其总结为如下几点:
a,硬件的实现思路,HDL设计实现和软件实现的思路不同,HDL作为一种描述语言,侧重的是对硬件的映射和连接关系的描述,当然也有逻辑、处理的实现,但归根揭底所有的逻辑都是在硬件上实现的,最终都会映射为加法器,乘法器,状态机,计数器,编码器(优先),解码器等等一些列硬件资源,对于逻辑拆解和抽象能力将直接关系到最终编码的效率。简单的来说,好的HDL编码人员编写的代码更容易被编译器综合,对于初学者来讲,编译器的综合(包括后续Map布局布线)时间以及warning数量以及最后综合出来资源和你预先设计的吻合程度可以组为考量HDL代码好坏的一种方式。
b,资源和时序的优化能力,资源和时序的优化能力是作为FPGA(ASIC)开发人员进阶的能力,这里就需要大量的经验和反复的迭代,不断对硬件(FPGA底层结构)深入理解才能够达到。对于FPGA来讲和ASIC设计有所不同,ASIC的硬件实现很多是由综合器决定的(比如用什么样的乘法器),但是对于FPGA来讲,资源全部是固定的,FPGA资源可以分为三块,运算逻辑(LUT DSP carry chain等),存储单元(REG SRL BRAM DRAM),IO(各种高速低速接口),相同的算法应用可以用不同的资源,不同资源的组合方式来实现,那么如何用更少的资源,更快的主频实现某一算法,这就需要有很强的资源和时序优化能力,通常这种优化是经过多次迭代的,当然通常顶层的设计人员会对系统层次的资源和时序有着较为准确的把握,也会给出各个模块的设计指标和边界,但是不同开发人员水平和能力最终设计的结果是不一样的,好的资源和时序优化能力是FPGA工程师的重要竞争力。
在反过头来说软件开发,其实从优化上来讲和RTL设计或者说HDL开发没什么不同,好的软件设计人员更了解计算机底层,对于资源(时间,空间)的使用,对于算法的效率的分析也更加深刻,因此也能写出更好的软件代码,我觉得在这一层面上无论软件还是硬件开发都是对于逻辑的抽象能力(当然术有所不同)。
2,硬件调试能力。调试能力也是前面答案基本都提到的,我向这也是作为FPGA开发人员和所有从事硬件开发人员都一直认可的能力或者说核心竞争力。举个例子,在找工作的时候如果你能向别人展示出你无与伦比的调试能力,别人没有理由不要你。
调试能力需要大量的现场经验作为积累,同时也需要人的逻辑分析能力,当然还需要耐心,细致等等人的高尚品质 ,这里我也做一个小小的总结。
a,FPGA本身调试工具的使用,我想这里又可以分为两个阶段,仿真和上板调试,仿真我想作为FPGA工程师都不陌生,大型的开发,通常有多个不同层次的模型,基本算法原理的模型,硬件仿真模型(通过C或matlab做定点仿真),然后再试HDL仿真模型(通过modelsim仿真最后的实现),仿真是一门很大的学问,现在都有专门的verification人员做,但是对于普通FPGA开发人员来京,如何利用仿真这个工具来高效率的调试是一个值得思考的问题,一些异步的输入情况如何用仿真来排除问题,上板调试发现问题,根据问题输入情况仿真排除问题,这些都是利用FPGA仿真工具来调试的手段。
对于上板调试,主要就是利用chipsocpe添加调试信号,这里又涉及到如何利用有限资源(chipsocpe信号数量和深度)来排除问题,通常在上板调试发现问题后,仿真又无法定位解决(仿真是有和硬件不一致的情况的,比如一些RAM冲突的问题),经过分析加入合适的调试信号,设置合适的触发条件,然后定位排除问题。这些说起来容易,实际还是需要大量的上板经验,特别是大型系统的调试经历不断磨练提升。
此外还有一些应用需要配合外部仪器来获取更多信息帮助定位问题,包括示波器,谱分析仪,网络分析仪等常用实验室仪器。
b,问题定位分析能力,上面讲的是都是利用工具来进行调试,但是硬件比软件难得地方就在于其调试的复杂性,很多时候无法利用工具进行问题的定位,比如现象无法复现,输入条件随机或者过于复杂,涉及模块逻辑很多等等情况,这时候去定位问题大多靠想,就是逻辑分析来排出问题。我认为这是FPGA工程师真正的核心竞争力,因为这不仅仅需要经验的积累,同时还需要很好的逻辑思维和分析能力。
c,系统调试能力,系统调试能力是更加难得一项能力,通常做到系统层次的人员不会再具体的写代码或者上手调了,当然对于小团队小公司还是得自己上手。系统层面的调试能力一方面是对FPGA顶层的调试能力,各个模块构成的片上系统的问题分析定位能力,通常各个模块在系统联调之前都是经过验证的,但是在联调的时候还是会出现各种各样的问题,这时候的问题反馈的信息更加少,设计的逻辑模块更加多,如何一步步抽丝拨茧定位到问题所在,并且采用什么样的方式去解决(这时候通常不是单独解决一个内部模块就行的),都需要很深厚的功力。
另外一方面是整个硬件软件系统层次的调试能力,要看得懂原理图PCB,懂硬件,了解软件接口,现在FPGA越来越讲究Hardware Software Co-design,软件硬件这个系统层次的调试能力对人的要求更加高,当然这通常已经远离了通常FPGA工程师的职责,但是我认为这是作为FPGA工程师上升通道中的重要能力。
3,更加高层次的,写了很多感觉其实都是其他答案讲到过的,只是可能更加细节一些。更加高层次的东西,我个人的理解,还是系统层次的东西。算法和架构,怎样将一系列数学公式,转换为算算法,在最终形成系统硬件的实现;整个系统采用什么样的架构,纯FPGA,arm+FPGA,DSP+FPGA,zynq;FPGA顶层采用什么架构,通用总线还是自定义总线,如何考虑通用性和可扩展性等等,在大至什么养的应用适合用FPGA实现,什么样的问题适合软件实现,怎样的组合能更加低成本高效率的解决问题,这一些列问题涉及的东西就很多了,我讲的都是以FPGA为核心做开发要面临的问题,其实其他平台的硬件、软件产品都是类似,系统层面的问题都是复杂的问题,同时我也认为,从系统层面去优化,解决问题才是最高效率的方式。
自己水平也有限,路还漫漫,希望自己、题主都能一直进步。