华为FPGA设计流程指南详介
FPGAA设计流流程指南南前言 本部门门所承担担的FPPGA设设计任务务主要是是两方面面的作用用:系统统的原型型实现和和ASIIC的原原型验证证编写写本流程程的目的的是:l 在于规范范整个设设计流程程,实现现开发的的合理性性、一致致性、高高效性l 形成风格格良好和和完整的的文档l 实现在FFPGAA不同厂厂家之间间以及从从FPGGA到AASICC的顺利利移植l 便于新员员工快速速掌握本本部门FFPGAA的设计计流程由于目前前所用到到的FPPGA器器件以AAlteera的的为主,,所以下下面的例例子也以以Altteraa为例,,工具组组合为 moddelssim + LLeonnarddoSppecttrumm/FPPGACComppileerIII + Quaartuus,但但原则和和方法对对于其他他厂家和和工具也也是基本本适用的的目 录1. 基基于HDDL的FPGGA设计计流程概概述11.1 设计流流程图111.2 关键步步骤的实实现21.2..1 功功能仿真真21.2..2 逻逻辑综合合21.2..3 前前仿真331.2..4 布布局布线线31.2..5 后后仿真((时序仿仿真)442. VVeriilogg HDDL设计计42.1 编程风风格(CCodiing Styyle))要求442.1..1 文文件42.1..2 大大小写552.1..3 标标识符552.1..4 参参数化设设计52.1..5 空空行和空空格52.1..6 对对齐和缩缩进52.1..7 注注释52.1..8 参参考C语言的的资料552.1..9 可可视化设设计方法法62.2 可综合合设计662.3 设计目目录63. 逻逻辑仿真真63.1 测试程程序(ttestt beenchh)73.2 使用预预编译库库74. 逻逻辑综合合84.1 逻辑综综合的一一些原则则84.1..1 关关于LeeonaardooSpeectrrum884.1..1 大大规模设设计的综综合84.1..3 必必须重视视工具产产生的警警告信息息84.2 调用模模块的黑黑盒子((Blaack boxx)方法法8参考100修订纪录录101. 基基于HDDL的FFPGAA设计流流程概述述1.1 设计流流程图(1)设计定义(2)HDL实现逻辑仿真器(3)功能仿真逻辑综合器(4)逻辑综合逻辑仿真器(5)前仿真FPGA厂家工具(6)布局布线(8)静态时序分析逻辑仿真器(7)后仿真(9)在系统测试说明:l 逻辑仿真真器主要要指moodellsimm,Veerillog--XL等等。
l 逻辑综合合器主要要指LeeonaardooSpeectrrum、、Synnpliify、、FPGGA EExprresss/FPPGA Commpiller等等l FPGAA厂家工工具指的的是如AAlteera的的Maxx+PllusIII、QQuarrtussII,,Xillinxx的Foounddatiion、、Allliannce、、ISEE4.11等1.2 关键步步骤的实实现1.2..1 功功能仿真真RTL代码调用模块的行为仿真模型测试程序(test bench)测试数据逻辑仿真器说明:“调用模模块的行行为仿真真模型””指的是是RTLL代码中中引用的的由厂家家提供的的宏模块块/IPP,如AAlteera 提供的的LPMM库中的的乘法器器、存储储器等部部件的行行为模型型1.2..2 逻逻辑综合合设置综合目标和约束条件调用模块的黑盒子接口RTL代码逻辑综合器HDL网表(netlist)EDIF网表(netlist)说明:“调用模模块的黑黑盒子接接口”的导入入,是由由于RTTL代码码调用了了一些外外部模块块,而这这些外部部模块不不能被综综合或无无需综合合,但逻逻辑综合合器需要要其接口口的定义义来检查查逻辑并并保留这这些模块块的接口口。
1.2..3 前前仿真逻辑综合器调用模块的行为仿真模型测试数据测试程序(test bench)HDL网表(netlist)逻辑仿真器说明: 一般来来说,对对FPGGA设计计这一步步可以跳跳过不做做,但可可用于ddebuug综合合有无问问题1.2..4 布布局布线线逻辑综合器设置布局布线约束条件FPGA厂家工具EDIF网表(netlist)调用模块的综合模型SDF文件(标准延时格式)HDL网表(netlist)下载/编程文件1.2..5 后后仿真((时序仿仿真)测试数据SDF文件(标准延时格式)FPGA基本单元仿真模型测试程序(test bench)FPGA厂家工具HDL网表(netlist)逻辑仿真器2. VVeriilogg HDDL设计计 基于将将来设计计转向AASICC的方便便,本部部门的设设计统一一采用VVeriilogg HDDL,但但针对混混合设计计和混合合仿真的的趋势,,所有开开发人员员也应能能读懂VVHDLLVeriilogg HDDL的学学习可参参考[11][22]2.1 编程风风格(CCodiing Styyle))要求2.1..1 文文件(1) 每个模块块(moodulle)一一般应存存在于单单独的源源文件中中,通常常源文件件名与所所包含模模块名相相同。
2) 每个设计计文件开开头应包包含如下下注释内内容:l 年份及公公司名称称l 作者l 文件名l 所属项目目l 顶层模块块l 模块名称称及其描描述l 修改纪录录请参考标标准示例例程序[[3]2.1..2 大大小写(1) 如无特别别需要,,模块名名和信号号名一律律采用小小写字母母2) 为醒目起起见,常常数(``deffinee定义))/参数数(paarammeteer定义义)采用用大写字字母2.1..3 标标识符(1) 标识符采采用传统统C语言言的命名名方法,,即在单单词之间间以“_”分开,,如:mmax__dellay、、datta_ssizee等等2) 采用有意意义的、、能反映映对象特特征、作作用和性性质的单单词命名名标识符符,以增增强程序序的可读读性3) 为避免标标识符过过于冗长长,对较较长单词词的应当当采用适适当的缩缩写形式式,如用用‘bufff’代替‘buffferr’,‘enaa’代替‘enaablee’,‘adddr’代替‘adddresss’等2.1..4 参参数化设设计 为了源源代码的的可读性性和可移移植性起起见,不不要在程程序中直直接写特特定数值值,尽可可能采用用`deefinne语句句或paarammateer语句句定义常常数或参参数。
2.1..5 空空行和空空格(1) 适当地在在代码的的不同部部分中插插入空行行,避免免因程序序拥挤不不利阅读读2) 在表达式式中插入入空格,,避免代代码拥挤挤,包括括:赋值符号号两边要要有空格格;双目运算算符两边边要有空空格;单目运算算符和操操作数之之间可没没有空格格,示例如下下:a <<= b;c <<= a + b;if ((a == bb) tthenn ....a <== ~aa && cc;2.1..6 对对齐和缩缩进(1) 不要使用用连续的的空格来来进行语语句的对对齐2) 采用制表表符Taab对语语句对齐齐和缩进进,Taab键采采用4个个字符宽宽度,可可在编辑辑器中设设置3) 各种嵌套套语句尤尤其是iif....ellse语语句,必必须严格格的逐层层缩进对对齐2.1..7 注注释必须加入入详细、、清晰的的注释行行以增强强代码的的可读性性和可移移植性,,注释内内容占代代码篇幅幅不应少少于300%2.1..8 参参考C语语言的资资料 要形成成良好的的编程风风格,有有许多细细节需要要注意,,可以参参考资料料[4]],虽然然它是针针对C语语言的讨讨论,但但由于VVeriilogg HDDL和CC语言的的形式非非常近似似,所以以里面提提到的很很多原则则都是可可以借鉴鉴的。
2.1..9 可可视化设设计方法法 为提高高设计效效率和适适应协同同设计的的方式,,可采用用可视化化的设计计方法,,Menntorr Grrahppicss的Reenoiir软件件提供了了非常好好的设计计模式2.2 可综合合设计 用HDDL实现现电路,,设计人人员对可可综合风风格的RRTL描描述的掌掌握不仅仅会影响响到仿真真和综合合的一致致性,也也是逻辑辑综合后后电路可可靠性和和质量好好坏最主主要的因因素,对对此应当当予以充充分的重重视 学习可可综合的的HDLL请参考考 [55][66] [[7] 学习设设计的模模块划分分请参考考[8]]2.3 设计目目录 采用合合理、条条理清晰晰的设计计目录结结构有助助于提高高设计的的效率、、可维护护性建建议采用用类似下下面的目目录结构构:(1)designsrc(源代码)syn(综合)sim(仿真)par(布局布线)(2)designver1ver2src(源代码)syn(综合)sim(仿真)par(布局布线)src(源代码)syn(综合)sim(仿真)par(布局布线)3. 逻逻辑仿真真 考虑到到性能和和易用性性,首选选的逻辑辑仿真器器是Meentoor GGrapphiccs的mmodeelsiim。
3.1 测试程程序(ttestt beenchh) 测试程程序对于于设计功功能和时时序的验验证有着着举足轻轻重的影影响,测测试激励励的完备备性和真真实性是是关键所所在,有有以下原原则须遵遵循:(1) 测试激励励输入和和响应输输出采集集的时序序应当兼兼顾功能能仿真((无延时时)和时时序仿真真(有延延时)的的情况2) 对于周期期较多的的测试,,为提高高效率,,尽可能能采用程程序语句句来判断断响应与与标准结结果是否否一致,,给出成成功或出出错标志志,而不不是通过过观察波波形来判判断3) 采用基于于文件的的测试是是很好的的办法,,即由mmatllab或或spww等系统统工具产产生测试试数据,,测试程程序将其其读入产产生激励励,再把把响应结结果写入入到文件件,再交交给上述述工具进进行处理理或分析析4) 仿真器支支持几乎乎所有的的Verriloog HHDL语语法,而而不仅仅仅是常用用的RTTL的描描述,应应当利用用这一点点使测试试程序尽尽可能简简洁、清清楚,篇篇幅长的的要尽量量采用ttaskk来描述述3.2 使用预预编译库库 在进行行功能仿仿真和后后仿真时时都需要要某些模模块的行行为仿真真模型和和门级仿仿真模型型,如AAlteera Quaartuus里的的2200moddel..v(LLPM模模块行为为仿真模模型)和和apeex200ke__atooms..v(220KEE系列门门级仿真真模型)),为避避免在不不同的设设计目录录中多次次编译这这些模型型,应当当采用一一次编译译,多次次使用的的方法。
具体做做法如下下(以220KEE门级库库为例)): 1:在在某个工工作目录录下新建建一库名名 appex220kee,将aapexx20kke_aatomms.vv编译到到其中 2:在在图形界界面中的的Loaad DDesiign对对话框中中装入仿仿真设计计时,在在Verriloog 标标签下指指定预编编译库的的完整路路径见下图图)4. 逻逻辑综合合 目前可可用的FFPGAA综合工工具有MMenttor Graaphiics 的 LLeonnarddoSppecttrumm,Syynplliciity的的Synnpliify和和Synnopssys 的FPPGA CommpillerIII/FFPGAA Exxpreess,,LeoonarrdoSSpecctruum由于于性能和和速度最最好,成成为我们们首选的的综合器器,FPPGA CommpillerIII/FFPGAA Exxpreess由由于可以以和Deesiggn CComppileer代码码兼容也也可用见参考考[9]]4.1 逻辑综综合的一一些原则则 HDLL代码综综合后电电路质量量的好坏坏主要取取决于三三个方面面:RTTL实现现是否合合理、对对厂家器器件特点点的理解解和对综综合器掌掌握的程程度。
参参考[110]中中有比较较全面的的讨论4.1..1 关关于LeeonaardooSpeectrrum LeoonarrdoSSpecctruum对综综合的控控制能力力比较强强,但使使用也略略为复杂杂,故需需要在使使用前尽尽量熟悉悉其功能能,才能能取得较较好的综综合结果果 当出现现综合结结果不能能满足约约束条件件时,不不要急于于修改设设计源文文件,应应当通过过综合器器提供的的时序和和面积分分析命令令找出关关键所在在,然后后更改综综合控制制或修改改代码 在LeeonaardooSpeectrrum 20000.11b以前前的版本本输出的的 .vv 网表表都不能能用于仿仿真4.1..1 大大规模设设计的综综合l 分块综合合 当设计计规模很很大时,,综合也也会耗费费很多时时间如如果设计计只更改改某个模模块时,,可以分分块综合合如有有设计 topp.v 包含 a.vv和b..v两个个模块,,当只修修改a..v的话话,可以以先单独独综合bb.v,,输出其其网表bb.eddf,编编写一个个b模块块的黑盒盒子接口口b_ssyn..v,每每次修改改a.vv后只综综合toop.vv、a..v、bb_syyn.vv,将综综合后的的网表和和b.eedf送送去布线线,可以以节约综综合b模模块的时时间。
l 采用脚本本命令当设计规规模比较较大时,,综合控控制也许许会比较较复杂,,可以考考虑采用用脚本控控制文件件的方式式进行综综合控制制,moodellsimm、LeeonaardooSpeectrrum和和Quaartuus都支支持TCCL(TTooll Coommaand Lannguaage))语言,,采用脚脚本控制制可以提提供比图图形界面面更灵活活和更方方便的控控制手段段4.1..3 必必须重视视工具产产生的警警告信息息 综合工工具对设设计进行行处理可可能会产产生各种种警告信信息,有有些是可可以忽略略的,但但设计者者应该尽尽量去除除,不去去除必须须确认每每条警告告的含义义,避免免因此使使设计的的实现产产生隐患患 这个原原则对仿仿真和布布局布线线同样适适用4.2 调用模模块的黑黑盒子((Blaack boxx)方法法 使用黑黑盒子方方法的原原因主要要有两点点: 一是HHDL代代码中调调用了一一些FPPGA厂厂家提供供的模块块(如AAlteera的的LPMM模块))或第三三方提供供的IPP,这些些模块不不需要综综合,而而且有些些综合器器也不能能综合((如FPPGA CommpillerIII/FFPGAA Exxpreess可可以综合合包含LLPM的的代码而而LeoonarrdoSSpecctruum不能能)。
因因此须提提供一个个黑盒子子接口给给综合器器,所调调用的模模块到布布局布线线时才进进行连接接 二是方方便代码码的移植植,由于于厂家提提供的模模块或第第三方提提供的IIP通常常都是与与工艺有有关的,,直接在在代码中中调用的的话将不不利于修修改,影影响代码码移植 下面以以调用AAlteera的的LPMM库中的的乘法器器为例来来说明调用这这样一个个模块需需要这样样一个文文件:mmultt8x88.v((可由QQuarrtuss的MeegaWWizeer PPlugg-inn Maanagger产产生),,代码如如下:// mmultt8x88.vmoduule mullt8xx8 ((dattaa,, daatabb, rresuult));inpuut [[7:00] ddataaa;inpuut [[7:00] ddataab;outpput [155:0]] reesullt;// eexemmplaar ttrannslaate__offf// ssynoopsyys ttrannslaate__offflpm__mullt lpmm_muult__commponnentt( .ddataaa (daataaa), .ddataab (daatabb), .aaclrr (1''b0)), .cclocck (1''b0)), .cclkeen (1''b0)), .ssum (1''b0)), .rresuult (reesullt) );; deffparram lppm_mmultt_coompoonennt.llpm__widdthaa = 88, lppm_mmultt_coompoonennt.llpm__widdthbb = 88, lppm_mmultt_coompoonennt.llpm__widdthss = 116, lppm_mmultt_coompoonennt.llpm__widdthpp = 116, lppm_mmultt_coompoonennt.llpm__reppressenttatiion = ""SIGGNEDD", // eexemmplaar ttrannslaate__on// ssynoopsyys ttrannslaate__on endmmoduule17。




