《FPGA工程师Coding技能资料.docx》由会员分享,可在线阅读,更多相关《FPGA工程师Coding技能资料.docx(10页珍藏版)》请在优知文库上搜索。
1、FPGA工程师Coding技能资料本文是某FPGA技术牛根据自身有关FPGA开发流程、注意事项的个人总结,希望给FPGA初学者带来一定的帮助。众所周知,FPGA是一种可编程的逻辑器件芯片,为此FPGA设计可以分为软件设计和硬件设计两部分。硬件设计包括了对FPGA芯片电路、存储器及输入输出接口电路以及其他设备等外围设计,软件设计则包含了相应的HDL程序编写、以及嵌入式C语言程序。下面给大家详解一下FPGA编程,大家可能会遇到的五个方面的代码设计问题,及相关处理方法:(1)注释好的代码首先必须要有注释,注释至少包括文件注释,端口注释,功能语句注释。文件注释:文件注释就是一个说明文:这通常在文件的头
2、部注释,用于描述代码为那个工程中,由谁写的,日期是多少,功能描述,有哪些子功能,及版本修改的标示。这样不论是谁,一目了然。即使不写文档,也能知道大概。接口描述:module的接口信号中,接口注释描述模块外部接口,例如AHB接口,和SRAM接口等等。这样读代码的人即可能够判断即模块将AHB接口信号线转换成SRAM接口信号。功能语句注释:内部关键逻辑,状态机某状态,读过程、写过程。注释的重要性,毋庸置疑,好的注释,能够提高代码的可读性,可维护性等等。总之,养成注释的好习惯,代价不大,但是收益很大。(2)语句开始写代码是,在FPGA设计中,特别是在可综合的模块实现中,Verilog的语句是很固定的。
3、在FPGA的设计中,不外乎时序逻辑和组合逻辑,除此之外,别无他法。对于开始功能编码来说,只需知道组合逻辑信号即可生效,时序逻辑在时钟的下一拍起效就够了。下面是编码的实例。组合逻辑:两种组合逻辑的描述,其功能是一致的。assignA=B?l:D?2:3;always(*)if(B)A=Ielseif(D)A=2;elseA=3;组合逻辑如果是异步复位的话,描述如下:always(posedgesys_clkornegedgerst_n)if(!rst_n)a=O;elsea=b;也就是说,在verilog的可综合电路的编码中,只需要三种语句,分别是assign,always(*)及时序的alwa
4、ys(CLOCK_EDGEclk)oCLOCK.EDGE可以是上升沿或者下降沿。为什么用always(*)而不是always(敏感信号列表包含所有敏感信号列表,如果在coding过程中,漏掉了某个敏感信号,则会导致仿真不正确,例如本例中,敏感变量列表中,需要BOrC但是如果漏掉一个,仿真就会在B或C有变化时,输出没有变化。导致仿真和功能不一致,但是对于综合工具来说,功能还是能够正常工作的,不会因为敏感变量列表中的值未列全而不综合某条语句。某些情况下,敏感列表的值可能有十几个甚至更多,遗漏是可能发生的事情,但是为了避免这种问题,最好采用always(*)而不用敏感变量列表的方式,来避免仿真结果不
5、一致的情况发生。(3)赋值:老话重提,阻塞与非阻塞很多同志喜欢钻研阻塞赋值和非阻塞赋值,这两种赋值,分别在always块里面用于的阻塞给组合逻辑赋值,非阻塞”=”给时序逻辑赋值。这应该是铁律,应该在编码过程中被严格的遵守下来。“为什么?不这么用程序也能跑二这句话部分是正确的,疑问永远是工程师最好的老师。诚然,某些情况下,不严格的执行也跑,但是在某些情况下,实现二者就不一样。对于下面两个例子来说明,为什么?对于ValUeI的描述方式:其综合后的如下所示:如果从实际的编译结果上看b和bl及C和Cl其使用阻塞赋值和非阻塞赋值最终的结果是一致的,因此,也就是说,某些情况下,二者的编译结果一致。而对于V
6、alUe2的描述方式,其综合后的电路图如下所示。而对于第二中描述方式,阻塞赋值和非阻塞赋值的区别就显现出来了,从综合后的图中可以看到,cl信号是bl信号的寄存,而c信号和b信号为同一信号,都为a信号的寄存。作为FPGA工程师,一项基本的能力,就是要知道代码综合后的电路和时序,不要让其表现和你预想的不一致,“不一致”就意味着失败。即是代码的失败,也是工程的失败。对于阻塞和非阻塞赋值区别和详细说明来说,其能够编写一本书(如有时间也可专题详述),但是对FPGA工程师,对于VeriIog的编码而言,则只需要按照时序逻辑用“二”非阻塞,组合逻辑用阻塞“二”赋值即可。不要挑战那些规律,试图通过语言的特性来
7、生成特殊电路的尝试是不可取的,开个玩笑的话,是没有前途的,要把设计的精力放在通过可用的电路来实现需求上,不要舍本逐末。在数字电路设计中,我们需要的是一个确定的世界,“所见及所得,不要让你所想的和综合编译工具得认识不一致。这也就是不要乱用和混用这两个赋值的原因。(4)一个变量一个“家”不要在两个always语句中同一个变量赋值。(这是必须的)也尽量不要在同一个always语句中,对两个变量赋值。(这是可选的)如果是一组信号,其有共同的控制条件,则在同一always语句中赋值能够减少代码行数,提高可读性,除此之外,最好分开来写。如果几个不太相关的信号在同一里面赋值,其可读性极差,在组合逻辑中,还容
8、易产生IatCh。而前者赋值方式,综合工具肯定会报错,这到不用很担心,因为能够报的错误时是最容易被发现的。俗语说:“咬人的狗不叫”,而对于FPGA设计来说“致命的BUG,从来不报错二(5)锁存FPGA中不要有锁存器的产生。最容易产生的是在always(*)语句中,最后一定是所有分支条件都要描述并赋值,(一定要有最后的else)。状态机中,同样如此,不但需要有default的状态,每个状态的都要有所有的分支都要赋值。锁存器,是FPGA设计的大敌,因为会导致非你想要的错误功能的产生,并且导致时序分析错误,就会产生前述的问题“所见不是所得“,并且综合工具不会报错。如果你设计的电路功能,仿真正确,而实
9、际工作不正常,有一部分的原因是生成了锁存器,如果设计很大,不容易查的话,可以打开综合报告,搜索“LATCH”关键词,查看是否有锁存器的产生,一句话“锁存器,必杀之二时序逻辑会产生锁存器吗?当然不会,时序逻辑综合结果必然是触发器,因此不用检查时序逻辑的分支条件。综上:这是写在coding之前的话,编码的主要功能应该是用可靠的电路来描述FPGA功能和需求,不要试图通过语言的特性来描述功能,设计的主要精力应放在用已知的电路(组合逻辑,时序逻辑)描述未知功能。“高校人才输出不足,工程实践能力不高”,一直以来都是FPGA从业者需要面临的问题。目前,大多数电子信息类人才主要使用C语言、C+或者JAVA等,
10、基于FPGA编程语言的学习教程、师资力量及培训体系还未系统化形成,加之FPGA语言本身存在硬件和语言较为复杂,开发工具更新迭代很快,传统单一的教学方式,让很多想学习FPGA的电子工程师止步不前。学习过程中,无平台、无实战、无项目“三无”制约了大部分学员投身FPGA技术的决心。英特尔FPGA中国创新中心的专家指出:基于FPGA工程师的个人职业发展,主要分为两大方向:一类是偏向于FPGA软件工程师,以软件开发为主,学习课程内容在未来,主要以人工智能、数据分析及机器视觉等新兴领域的加速应用,主要采取OPenCL和HLS技术实现硬件协同开发;第二类是FPGA硬件工程师,以逻辑设计为主,学完后具备FPG
11、A针对某个领域的应用设计,集成电路设计及芯片验证的能力。FPGA学习必备技能能力树(思维导图):92(UARTFSMC9MSJI符”塔34,者三RAMs m iFPGA工程师需要掌握的技能1 .需求核对阶段1)良好的沟通技能:需要与需求方核对需要的功能及性能,态度很重要,谦逊专业的沟通态度才能对需求理解无偏差,理解错误,后面就可能引起构架的修改。对外团队协作能力很大一部分体现在这里。2)行业背景知识:需要把需求翻译成FPGA的功能点以及逻辑上的处理流程(流程及需要的数据结构,用硬件的大白话就是大的PiPeline流水线功能以及每个功能对应的表项及数据结构)。2 .总体设计阶段1)功耗评估:xi
12、linx和altera两家都会提供功耗评估excel,填入使用的1P、逻辑使用量、频率、IO类型、时钟等,可以评估总的功耗大小,以及每一路电源的电流的大小预估,这个很重要,是板子能否做稳定的一个重要因素。2) IO设计:电路连接设计相关,把对外设计的接口特别是牵涉到存储器、transceiver相关的接口、IO电平标准、时钟分布都要例化出来,然后编译通过,软件输出CSV文件,里面包含了IO的电平标准及外围连接,这一步极大提升做板一次成功率。因为每一代FPGA以及每个系列器件的结构总有些不同,特别是共享PLL,transceiver,存储器的共享模块设计都会有些不同,因此安全做法是把要使用的除L
13、UT和RAM以外的资源例化,然后编译通过,保证外围连接不出错。3)软硬件接口设计:制定软件要访问FPGA的方式、以及软硬件如何配合、FPGA如何初始化功能。这块需要有经验,不同的应用场合需要设计不同机制。大体可以分为以下几类:寄存器访问:直接或间接功能表项的配置数据、命令、状态的互传:高性能一般要设计DMA,不同应用DMA要求不同。4)逻辑部分的总体规划:时钟域规划、复位规划、模块划分及模块功能规划、FIFO/RAM使用大小及类型规划、模块间传递接口规划(最好标准化,类似软件API,以后可复用)、编码规则制定。3 .设计及编码1)良好的COding规则:主要是命名,命名至少要区分:同步寄存器、
14、跨时钟域寄存器、连线这些信号命名最好在前缀区分,这个在后期下约束时可以用通配符找信号。2)查找及看懂硬核的使用手册3)领域内常见算法的实现:比如针对网络:共享缓存设计、各种HASH算法实现、LPM查表算法、各种匹配算法实现。加解密领域,需要把串行算法翻译成硬件并行算法的能力。针对目前流行的神经网络,针对各种网络如何设计高效的数据流入方式,如何进行特征的预处理。4 .仿真验证1)仿真平台搭建,看设计大小及是否将来重用,设计大且重用多,考虑UVM这些设计方法及平台搭建。简单的就利用verilog,通过task任务的设计及调用来设计仿真平台。需要掌握testbench设计、仿真工具使用及debug。
15、2)测试规划及项目抽取,这个是目前大部分FPGA工程师容易忽略的地方,设计要稳定,要系统的进行项目抽取,最好是另一拨人根据自己对规格的理解来系统抽取测试项目,这样完整验证后保证功能大体稳定。而性能测试一般要在实机测试中进行。5 .后端物理约束:可以从IO分配的工程中导入。时序约束IP的约束导入其他软件相关的特殊信号的约束(一般通过在代码中用属性表示)掌握看后端的原理图、器件映射图、出问题时可以在后端把一些网络剪短或连接(ISE之前提供,ViVad。不知道是否还有这种工具)6 .调试掌握调试工具:一般厂商都会提供:transceiver调试工具测试回环,无码率等。内部逻辑分析仪使用存储器调试:各种物理层参数的配置及调试各种下载方式掌握。软硬件联调时各种调试命令的设计想成为一名FPGA工程师,对FPGA的结构是必须要掌握的。FPGA芯片主要是:可编程I/O单元、基本可编程逻辑单元、完整的时钟管理、嵌入块式RAM、丰富的布线资源、内嵌的底层功能单元和内嵌专用硬件模块这六部分组成。基本可编辑逻辑单元基本可编辑逻辑单元是FPGA可编程逻辑的主体FPGA-一般是基于SRAM工艺。其基本可编程逻辑单元几乎都是由查找表(LUT)和寄存器组成。FPGA内部的LUT一般为4输入、主