-
2019-09-12 10:42:01
华为FPGA设计高级技巧xilinx篇阅读笔记一
前言
个人觉得前言部分是这篇的精华,一个FPGA工程师应该具备的基础。总结起来就是,在用HDL语言描述电路时,头脑中应该清楚综合出来是什么样的,映射到芯片后又是什么样子的。因此在进行HDL电路设计时应该了解FPGA内部的硬件结构以及基础资源,掌握与结构相关的设计技巧,具体可以参考博主之前的博客。前言指出目前大多数FPGA工程师的一个弊端,曾经博主也是这样的人。
随着HDL语言,综合工具以及相关工具的推广,广大工程师不再进行繁琐的画原理图,连线等工作,这样虽然提高了工作效率,但同时也带来了弊端。使现在越来越多的工程师不关心自己电路的实现形式,再进行HDL电路设计时,脑袋里没有任何电路的概念,以及自己的设计综合出来是什么样的,映射到芯片后又是什么样的,有没有充分利用FPGA的资源。这样过分依赖综合工具就会造成,遇到问题时,想到的只是还更好的芯片,自己束手无策。导致成本上升,影响开发周期。
随着器件工艺的提升,已经步入深亚微米时代,我们在设计时要更多关注以前很少关注的线延时,因此我们应该提高自己的设计技巧,以及设计方法来面对这些庞大的基于深亚微米技术的电路设计。
很多人称呼HDL代码为程序,但博主觉得这样有些不妥,博主觉等更好的应该是电路。各位同志自行体会。综合
综合工具通常包括两个过程:
- Synthesis
- Optimization
其中synthesis是把行为级的描述通过一定的算法转化成门级的描述,该过程与设计的工艺库无关,与用户约束无关。
Optimization 则是把已转化的门级描述在用户的约束下,通过算法映射到相应的工艺库中的器件上,对FPGA而言就是映射到器件的单元结构中。其中设计的代码风格,在综合的第一步就决定了设计的性能
代码风格:- 1 资源共享的应用限制在同一个module里。
- 2 尽可能将Critical path上所有相关逻辑放在同一个module里
- 3 Critical path所在的module与其他module分别综合,对critical path 采用速度优先的综合策略,对其他module采用面积优先的策略。
- 4 尽可能register所有的output。该做法对加约束方便。
- 5 一个module 的 size不能太大。具体有综合工具而定。
- 6 一个module尽量只有一个时钟,或整个设计只有一个时钟。
器件结构对Coding Style的影响
第三部分主要讲的是器件结构对Coding Style的影响,这个主要看所用的器件,需要对FPGA底层资源结构有一定的了解。具体可以参考博主之前的博客
只要是在一个LUT内实现的逻辑,不管是几输入,逻辑延时基本一样。
对FPGA设计而言,如果速度想要更快,应当努力减少路径上的LUT的个数,而不是逻辑技术(ASIC则是减少逻辑级数);如果想要面积更小,应当努力减少LUT的个数,而不是逻辑门数。(与ASIC设计完全不一样)For Example
图a结构前面的2输入与门占用一个LUT,后面的2个三输入或门各占用一个LUT,总共占用3个LUT,LUT级数是2级。
图b结构,虽然增加了一个2输入与门,并且逻辑级数与a一样,也是2级,但它只占用了2个LUT,LUT级数只有1级。
门数增加,逻辑未变,但资源占用减少,速度更快未完待续…
更多相关内容 -
华为FPGA设计规范 VERILOG约束 编程规范时序分析等全套资料.zip
2021-07-09 09:58:59华为FPGA设计规范 VERILOG约束 编程规范时序分析等全套资料: FPGA技巧Xilinx.pdf HuaWei Verilog 约束.rar Synplify工具使用指南(华为文档)[1].rar.rar Verilog HDL 华为入门教程.rar Verilog典型电路设计 华为.rar ... -
华为FPGA设计规范.doc
2019-08-26 16:17:36最近编写了几个比较大的程序,深切体会到代码风格的重要性。好好看看吧,不学习的话要被大牛们BS的。 verilog , 风格 -
华 为 FPGA设计流程指南_fpga_华为FPGA_
2021-09-29 10:09:06华 为 FPGA设计流程指南,可以学习华为哦 -
华为FPGA设计规范(Verilog_HDL)
2018-04-06 13:20:23华为内部FPGA源代码设计时所需遵循的设计规范,培养好的设计方法。 -
华为fpga学习资料
2018-03-15 10:51:31华为fpga学习资料,写的很好,很清楚,看了说不定你能去华为 -
华为FPGA设计全套
2015-08-05 15:31:09静态时序分析与逻辑、Verilog HDL 华为入门教程、Verilog典型电路设计 华为 -
华为FPGA设计流程指南
2022-05-07 15:46:41华为FPGA设计流程指南 -
华为FPGA设计规范
2019-01-17 22:34:27华为FPGA设计规范,规范整个设计流程,实现开发的合理性、一致性、高效性。形成风格良好和完整的文档。 -
华为内部FPGA学习资料汇总
2018-11-24 10:38:40华为内部FPGA学习资料汇总,里面包含VERILOG语法、软件使用、代码规范以及代码例程学习 -
华为中兴FPGA面试题目
2019-03-03 20:26:46华为和中兴FPGA招聘面试题目,每道题都含有详细答案。 -
华为FPGA设计资料.zip
2021-06-20 22:09:14华为FPGA设计资料合集 -
华为经典FPGA设计全套入门技巧.zip
2020-03-01 14:46:40华为的关于FPGA入门的文档资料,包括设计技巧、规范、逻辑设计指导书、同步电路设计规范等内容,资料比较全面,希望有益 -
华为FPGA.rar
2020-05-08 07:39:24从网上下载FPGA设计教程,里面有各种各样的FPGA学习资料文档( FPGA设计流程指南、大规模逻辑电路设计指导书/同步电路设计规范)!值得下载学习! -
华为FPGA设计资料
2018-02-10 21:11:25收集了好多年的资料,与大家分享,华为非常实用的FPGA设计资料 -
华为FPGA设计设计规范
2020-05-28 23:10:00最近看到了一份华为早年的FPGA设计规范文档,分享给大家。前言本部门所承担的FPGA设计任务主要是两方面的作用:系统的原型实现和ASIC的原型验证。编写本流程的目的是:在于规范整个设计流...最近看到了一份华为早年的FPGA设计规范文档,分享给大家。
前言
本部门所承担的FPGA设计任务主要是两方面的作用:系统的原型实现和ASIC的原型验证。编写本流程的目的是:
在于规范整个设计流程,实现开发的合理性、一致性、高效性。
形成风格良好和完整的文档。
实现在FPGA不同厂家之间以及从FPGA到ASIC的顺利移植。
便于新员工快速掌握本部门FPGA的设计流程。
由于目前所用到的FPGA器件以Altera的为主,所以下面的例子也以Altera为例,工具组合为 modelsim + Leonardo Spectrum / FPGA CompilerII + Quartus,但原则和方法对于其他厂家和工具也是基本适用的。
1. 设计流程概述
1.1 设计流程图
说明:
逻辑仿真器主要指modelsim,Verilog-XL等。
逻辑综合器主要指LeonardoSpectrum、Synplify、FPGA Express/FPGA Compiler等。
FPGA厂家工具指的是如Altera的Max+PlusII、QuartusII,Xilinx的Foundation、Alliance、ISE4.1等。
1.2 关键步骤的实现
1.2.1 功能仿真
说明:
“调用模块的行为仿真模型”指的是RTL代码中引用的由厂家提供的宏模块/IP,如Altera 提供的LPM库中的乘法器、存储器等部件的行为模型。
1.2.2 逻辑综合
逻辑综合 说明:
“调用模块的黑盒子接口”的导入,是由于RTL代码调用了一些外部模块,而这些外部模块不能被综合或无需综合,但逻辑综合器需要其接口的定义来检查逻辑并保留这些模块的接口。
1.2.3 前仿真
前仿真 说明:
一般来说,对FPGA设计这一步可以跳过不做,但可用于debug综合有无问题。
1.2.4 布局布线
布局布线 1.2.5 后仿真(时序仿真)
2. Verilog HDL设计
基于将来设计转向ASIC的方便,本部门的设计统一采用Verilog HDL,但针对混合设计和混合仿真的趋势,所有开发人员也应能读懂VHDL。Verilog HDL的学习可参考[1][2]。
2.1 编程风格(Coding Style)要求
2.1.1 文件
(1)每个模块(module)一般应存在于单独的源文件中,通常源文件名与所包含模块名相同。
(2)每个设计文件开头应包含如下注释内容:
年份及公司名称。
作者。
文件名。
所属项目。
顶层模块。
模块名称及其描述。
修改纪录。
请参考标准示例程序[3]。
2.1.2 大小写
(1)如无特别需要,模块名和信号名一律采用小写字母。
(2)为醒目起见,常数(`define定义)/参数(parameter定义)采用大写字母。
2.1.3 标识符
(1)标识符采用传统C语言的命名方法,即在单词之间以“_”分开,如:max_delay、data_size等等。
(2)采用有意义的、能反映对象特征、作用和性质的单词命名标识符,以增强程序的可读性。
(3)为避免标识符过于冗长,对较长单词的应当采用适当的缩写形式,如用‘buff’代替‘buffer’,‘ena’代替‘enable’,‘addr’代替‘address’等。
2.1.4 参数化设计
为了源代码的可读性和可移植性起见,不要在程序中直接写特定数值,尽可能采用`define语句或paramater语句定义常数或参数。
2.1.5 空行和空格
(1)适当地在代码的不同部分中插入空行,避免因程序拥挤不利阅读。
(2)在表达式中插入空格,避免代码拥挤,包括:
赋值符号两边要有空格;双目运算符两边要有空格;单目运算符和操作数之间可没有空格, 示例如下:
a <= b; c <= a + b; if (a == b) then ... a <= ~a & c;
2.1.6 对齐和缩进
不要使用连续的空格来进行语句的对齐。
采用制表符Tab对语句对齐和缩进,Tab键采用4个字符宽度,可在编辑器中设置。
各种嵌套语句尤其是if...else语句,必须严格的逐层缩进对齐。
2.1.7 注释
必须加入详细、清晰的注释行以增强代码的可读性和可移植性,注释内容占代码篇幅不应少于30%。
2.1.8 参考C语言的资料
要形成良好的编程风格,有许多细节需要注意,可以参考资料[4],虽然它是针对C语言的讨论,但由于Verilog HDL和C语言的形式非常近似,所以里面提到的很多原则都是可以借鉴的。
2.1.9 可视化设计方法
为提高设计效率和适应协同设计的方式,可采用可视化的设计方法,Mentor Grahpics的Renoir软件提供了非常好的设计模式。
2.2 可综合设计
用HDL实现电路,设计人员对可综合风格的RTL描述的掌握不仅会影响到仿真和综合的一致性,也是逻辑综合后电路可靠性和质量好坏最主要的因素,对此应当予以充分的重视。学习可综合的HDL请参考 [5][6] [7]。学习设计的模块划分请参考[8]。
2.3 设计目录
采用合理、条理清晰的设计目录结构有助于提高设计的效率、可维护性。建议采用类似下面的目录结构:
3. 逻辑仿真
考虑到性能和易用性,首选的逻辑仿真器是Mentor Graphics的modelsim。
3.1 测试程序(test bench)
测试程序对于设计功能和时序的验证有着举足轻重的影响,测试激励的完备性和真实性是关键所在,有以下原则须遵循:
(1)测试激励输入和响应输出采集的时序应当兼顾功能仿真(无延时)和时序仿真(有延时)的情况。
(2)对于周期较多的测试,为提高效率,尽可能采用程序语句来判断响应与标准结果是否一致,给出成功或出错标志,而不是通过观察波形来判断。
(3)采用基于文件的测试是很好的办法,即由matlab或spw等系统工具产生测试数据,测试程序将其读入产生激励,再把响应结果写入到文件,再交给上述工具进行处理或分析。
(4)仿真器支持几乎所有的Verilog HDL语法,而不仅仅是常用的RTL的描述,应当利用这一点使测试程序尽可能简洁、清楚,篇幅长的要尽量采用task来描述。
3.2 使用预编译库
在进行功能仿真和后仿真时都需要某些模块的行为仿真模型和门级仿真模型,如Altera Quartus里的220model.v(LPM模块行为仿真模型)和apex20ke_atoms.v(20KE系列门级仿真模型),为避免在不同的设计目录中多次编译这些模型,应当采用一次编译,多次使用的方法。具体做法如下(以20KE门级库为例):
1:在某个工作目录下新建一库名 apex20ke,将apex20ke_atoms.v编译到其中。2:在图形界面中的Load Design对话框中装入仿真设计时,在Verilog 标签下指定预编译库的完整路径。(见下图)
4. 逻辑综合
目前可用的FPGA综合工具有Mentor Graphics 的 Leonardo Spectrum,Synplicity 的 Synplify 和 Synopsys 的FPGA CompilerII / FPGA Express,Leonardo Spectrum由于性能和速度最好,成为我们首选的综合器,FPGA CompilerII / FPGA Express由于可以和Design Compiler代码兼容也可用。见参考[9]
4.1 逻辑综合的一些原则
HDL代码综合后电路质量的好坏主要取决于三个方面,参考[10]中有比较全面的讨论。:
RTL实现是否合理、
对厂家器件特点的理解
对综合器掌握的程度。
4.1.1 关于LeonardoSpectrum
LeonardoSpectrum对综合的控制能力比较强,但使用也略为复杂,故需要在使用前尽量熟悉其功能,才能取得较好的综合结果。当出现综合结果不能满足约束条件时,不要急于修改设计源文件,应当通过综合器提供的时序和面积分析命令找出关键所在,然后更改综合控制或修改代码。
在LeonardoSpectrum 2000.1b以前的版本输出的 .v 网表都不能用于仿真。
4.1.2 大规模设计的综合
分块综合
当设计规模很大时,综合也会耗费很多时间。如果设计只更改某个模块时,可以分块综合。如有设计 top.v 包含 a.v和b.v两个模块,当只修改a.v的话,可以先单独综合b.v,输出其网表b.edf,编写一个b模块的黑盒子接口b_syn.v,每次修改a.v后只综合top.v、a.v、b_syn.v,将综合后的网表和b.edf送去布线,可以节约综合b模块的时间。
采用脚本命令
当设计规模比较大时,综合控制也许会比较复杂,可以考虑采用脚本控制文件的方式进行综合控制,modelsim、Leonardo Spectrum 和 Quartus 都支持TCL(Tool Command Language)语言,采用脚本控制可以提供比图形界面更灵活和更方便的控制手段。
4.1.3 必须重视工具产生的警告信息
综合工具对设计进行处理可能会产生各种警告信息,有些是可以忽略的,但设计者应该尽量去除,不去除必须确认每条警告的含义,避免因此使设计的实现产生隐患。这个原则对仿真和布局布线同样适用。
4.2 调用模块的黑盒子(Black box)方法
使用黑盒子方法的原因主要有两点:
一是HDL代码中调用了一些FPGA厂家提供的模块(如Altera的LPM模块)或第三方提供的IP,这些模块不需要综合,而且有些综合器也不能综合(如FPGA CompilerII/FPGA Express可以综合包含LPM的代码而LeonardoSpectrum不能)。因此须提供一个黑盒子接口给综合器,所调用的模块到布局布线时才进行连接。
二是方便代码的移植,由于厂家提供的模块或第三方提供的IP通常都是与工艺有关的,直接在代码中调用的话将不利于修改,影响代码移植。
下面以调用Altera的LPM库中的乘法器为例来说明。调用这样一个模块需要这样一个文件:mult8x8.v(可由Quartus的MegaWizer Plug-in Manager产生),代码如下:
// mult8x8.v module mult8x8 (dataa, datab, result); input [7:0] dataa; input [7:0] datab; output [15:0] result; // exemplar translate_off // synopsys translate_off lpm_mult lpm_mult_component( .dataa (dataa), .datab (datab), .aclr (1'b0), .clock (1'b0), .clken (1'b0), .sum (1'b0), .result (result) ); defparam lpm_mult_component.lpm_widtha = 8, lpm_mult_component.lpm_widthb = 8, lpm_mult_component.lpm_widths = 16, lpm_mult_component.lpm_widthp = 16, lpm_mult_component.lpm_representation = "SIGNED", // exemplar translate_on // synopsys translate_on endmodule
注意上述的代码有两对编译指示:
> // exemplar translate_off 和 // exemplar translate_on (Leonardo Spectrum 支持) > // synopsys translate_off 和 // synopsys translate_on(Leonardo Spectrum 和 FPGA CompilerII都支持)
对于相应的综合器,在这些编译指示中间的语句将会被忽略,那我们可以看到在综合过程中模块mult8x8实际变成了一个只有I/O定义的空盒子(即black box),所以该部分的代码没有连接,在Quartus布局布线的时候,lpm模块的代码才连接到整个设计,在仿真的时候,编译指示不影响模块的完整性。
参考
[1]:台湾清华Verilog HDL教程
[2]:Verilog HDL硬件描述语言
[3]:文件头注释块示例
[4]:C语言的风格
[5]:Verilog HDL Reference manual
[6]:Actel HDL coding style guide
[7]:LeonardoSpectrum HDL Synthesis
[8]:ASIC Design Partitioning
[9]:三种FPGA综合工具的比较
[10]: FPGA Synthesis Training Course
修订纪录
V2.0 (何辉,2001-8-1) 修改了4.2节(黑盒子方法)的描述
V1.0 (何辉,2001-3) 第一个版本
版权归华为公司所有,如有侵权,联系删除!
还有更多历史精彩内容等着你!
modelsim系列教程
本文完!!!
欢迎关注,更精彩的内容等着你!
-
华为FPGA设计流程指南.pdf
2020-09-17 17:34:20在于规范整个设计流程,实现开发的合理性、一致性、高效性。形成风格良好和完整的文档。实现在 FPGA 不同厂家之间以及从 FPGA 到 ASIC 的顺利移植。便于新人快速掌握 FPGA 的设计流程。 -
华为FPGA加速云服务器用户指南.docx
2021-10-10 18:35:56华为FPGA加速云服务器用户指南.docx -
华为fpga设计流程指南(21).doc
2021-10-21 15:00:25华为fpga设计流程指南(21).doc -
Xilinx助力华为FPGA加速云服务器.pdf
2021-07-24 22:50:34Xilinx助力华为FPGA加速云服务器.pdf -
华为FPGA设计流程图
2012-09-25 21:33:34包含华为FPGA开发的详细流程,有利于初步学习FPGA的同学。 -
【华为】FPGA设计高级技巧Xilinx篇
2018-01-10 15:25:465.2 FPGA Editor的作用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 5.1.3 正确看待map之后的资源占用报告 . . . . . . . . . . . . . . . . . . . .... -
Xilinx助力华为FPGA加速云服务器 (1).pdf
2021-07-24 22:53:55Xilinx助力华为FPGA加速云服务器 (1).pdf -
华为fpga设计规范
2012-08-29 16:50:09华为内部FPGA的实际规范,verilog代码风格 -
华为FPGA设计流程指南:华为FPGA设计流程指南
2009-04-08 20:40:42华为FPGA设计流程指南:华为FPGA设计流程指南 -
华为中兴的FPGA岗位面试题
2018-03-05 14:08:50华为中兴的FPGA岗位面试题,绝对经典,希望大家喜欢。