FPGA 设计流程指南
前言
本部门所承担的 FPGA 设计任务主要是两方面的作用:系统的原型实现和 ASIC 的原型
验证。编写本流程的目的是:
在于规范整个设计流程,实现开发的合理性、一致性、高效性。
形成风格良好和完整的文档。
实现在 FPGA 不同厂家之间以及从 FPGA 到 ASIC 的顺利移植。
便于新员工快速掌握本部门 FPGA 的设计流程。
由于目前所用到的 FPGA 器件以 Altera 的为主,所以下面的例子也以 Altera 为例,工具
组合为 modelsim + LeonardoSpectrum/FPGACompilerII + Quartus,但原则和方法对于其他厂
家和工具也是基本适用的。
目 录
1. 基于 HDL 的 FPGA 设计流程概述 ............................................................................................ 1
1.1 设计流程图......................................................................................................................... 1
1.2 关键步骤的实现................................................................................................................. 2
1.2.1 功能仿真 .................................................................................................................. 2
1.2.2 逻辑综合 .................................................................................................................. 2
1.2.3 前仿真...................................................................................................................... 3
1.2.4 布局布线 .................................................................................................................. 3
1.2.5 后仿真(时序仿真)..............................................................................................4
2. Verilog HDL 设计 .......................................................................................................................... 4
2.1 编程风格(Coding Style)要求........................................................................................4
2.1.1 文件 .......................................................................................................................... 4
2.1.2 大小写...................................................................................................................... 5
2.1.3 标识符...................................................................................................................... 5
2.1.4 参数化设计.............................................................................................................. 5
2.1.5 空行和空格.............................................................................................................. 5
2.1.6 对齐和缩进.............................................................................................................. 5
2.1.7 注释 .......................................................................................................................... 5
2.1.8 参考 C 语言的资料................................................................................................. 5
2.1.9 可视化设计方法......................................................................................................6
2.2 可综合设计......................................................................................................................... 6
2.3 设计目录 ............................................................................................................................. 6
3. 逻辑仿真 ....................................................................................................................................... 6
3.1 测试程序(test bench).....................................................................................................7
3.2 使用预编译库 ..................................................................................................................... 7
4. 逻辑综合 ....................................................................................................................................... 8
4.1 逻辑综合的一些原则......................................................................................................... 8
4.1.1 关于 LeonardoSpectrum.......................................................................................... 8
4.1.1 大规模设计的综合 ..................................................................................................8
4.1.3 必须重视工具产生的警告信息..............................................................................8
4.2 调用模块的黑盒子(Black box)方法 ............................................................................ 8
参考 .................................................................................................................................................. 10
修订纪录 .......................................................................................................................................... 10
1. 基于 HDL 的 FPGA 设计流程概述
1.1 设计流程图
(1)设计定义
(2)HDL 实现
(3)功能仿真
逻辑仿真器
(4)逻辑综合
逻辑综合器
(5)前仿真
逻辑仿真器
(6)布局布线
FPGA 厂家工具
(8)静态时序分析
(7)后仿真
逻辑仿真器
(9)在系统测试
说明:
逻辑仿真器主要指 modelsim,Verilog-XL 等。
逻辑综合器主要指 LeonardoSpectrum、Synplify、FPGA Express/FPGA Compiler 等。
FPGA 厂家工具指的是如 Altera 的 Max+PlusII、QuartusII,Xilinx 的 Foundation、
Alliance、ISE4.1 等。
1
1.2 关键步骤的实现
1.2.1 功能仿真
调用模块的
行为仿真模型
RTL 代码
测试程序
(test bench)
测试数据
逻辑仿真器
说明:
“调用模块的行为仿真模型”指的是 RTL 代码中引用的由厂家提供的宏模块/IP,如
Altera 提供的 LPM 库中的乘法器、存储器等部件的行为模型。
1.2.2 逻辑综合
RTL 代码
调用模块的
黑盒子接口
设置综合目标
和约束条件
逻辑综合器
EDIF 网表
(netlist)
HDL 网表
(netlist)
说明:
“调用模块的黑盒子接口”的导入,是由于 RTL 代码调用了一些外部模块,而这些外
部模块不能被综合或无需综合,但逻辑综合器需要其接口的定义来检查逻辑并保留这些模块
的接口。
2
1.2.3 前仿真
逻辑综合器
HDL 网表
(netlist)
调用模块的
行为仿真模型
测试程序
(test bench)
测试数据
逻辑仿真器
说明:
一般来说,对 FPGA 设计这一步可以跳过不做,但可用于 debug 综合有无问题。
1.2.4 布局布线
逻辑综合器
EDIF 网表
(netlist)
调用模块的
综合模型
设置布局布线
约束条件
FPGA 厂家工具
下载/编程文件
HDL 网表
(netlist)
SDF 文件
(标准延时格式)
3
1.2.5 后仿真(时序仿真)
FPGA 厂家工具
测试数据
HDL 网表
(netlist)
SDF 文件
(标准延时格式)
FPGA 基本单
元仿真模型
测试程序
(test bench)
逻辑仿真器
2. Verilog HDL 设计
基于将来设计转向 ASIC 的方便,本部门的设计统一采用 Verilog HDL,但针对混合设
计和混合仿真的趋势,所有开发人员也应能读懂 VHDL。
Verilog HDL 的学习可参考[1][2]。
2.1 编程风格(Coding Style)要求
2.1.1 文件
(1) 每个模块(module)一般应存在于单独的源文件中,通常源文件名与所包含模
块名相同。
(2) 每个设计文件开头应包含如下注释内容:
年份及公司名称。
作者。
文件名。
所属项目。
顶层模块。
模块名称及其描述。
修改纪录。
请参考标准示例程序[3]。
4
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 对齐和缩进
(1) 不要使用连续的空格来进行语句的对齐。
(2) 采用制表符 Tab 对语句对齐和缩进,Tab 键采用 4 个字符宽度,可在编辑器中
设置。
(3) 各种嵌套语句尤其是 if...else 语句,必须严格的逐层缩进对齐。
2.1.7 注释
必须加入详细、清晰的注释行以增强代码的可读性和可移植性,注释内容占代码篇幅不
应少于 30%。
2.1.8 参考 C 语言的资料
要形成良好的编程风格,有许多细节需要注意,可以参考资料[4],虽然它是针对 C 语
言的讨论,但由于 Verilog HDL 和 C 语言的形式非常近似,所以里面提到的很多原则都是可
以借鉴的。
5
2.1.9 可视化设计方法
为提高设计效率和适应协同设计的方式,可采用可视化的设计方法,Mentor Grahpics
的 Renoir 软件提供了非常好的设计模式。
2.2 可综合设计
用 HDL 实现电路,设计人员对可综合风格的 RTL 描述的掌握不仅会影响到仿真和综合
的一致性,也是逻辑综合后电路可靠性和质量好坏最主要的因素,对此应当予以充分的重视。
学习可综合的 HDL 请参考 [5][6] [7]。
学习设计的模块划分请参考[8]。
2.3 设计目录
采用合理、条理清晰的设计目录结构有助于提高设计的效率、可维护性。建议采用类似
下面的目录结构:
(1)
design
src
syn
(源代码)
(综合)
sim
(仿真)
par
(布局布线)
(2)
design
ver1
ver2
src
syn
sim
par
src
syn
sim
par
(源代码)
(综合)
(仿真)
(布局布线)
(源代码)
(综合)
(仿真)
(布局布线)
3. 逻辑仿真
考虑到性能和易用性,首选的逻辑仿真器是 Mentor Graphics 的 modelsim。
6