综合是将我们的设计转化为FPGA可以读懂的配置文件的第一个步骤。本文努力从0基础开始向大家说明综合的基本知识和高级技巧。
话说所有的功能都有它应用的环境。在了解某个按钮选项有某个功能的时候,我们更应该了解应该在什么时候什么情况使用它。所以我以这种问答的形式,向大家展示综合过程中可能遇到的方方面面的问题以及解决的方法。
-----------基础知识--------------
1. 什么是综合?
综合就是把HDL语言/原理图转换为综合网表的过程。
2. 什么是综合网表?
综合网表就是综合的结果啦。
综合网表的业界标准是EDIF格式。文件后缀通常为.edn, .edf, .edif。EDIF网表是可以用文本编辑器打开的文本文件。
Xilinx自家的综合结果是NGC网表。NGC网表是二进制的文件,不能用文本编辑器打开观察。
3. 综合网表中包含一些什么内容?
综合网表中除了包含从HDL语言中infer出的与门、非门等组合逻辑和寄存器等时序逻辑之外,还包含FPGA特有的各种原语(Primitive)比如LUT,BRAM,DSP48,甚至PowerPC,PCIe等硬核模块,以及这些模块的属性和约束信息。
4. 综合工具有哪些?
Xilinx自家的XST,Synopsys(收购了Synplicity)的Synplify,Mentor Graphic的Precision 都是使用最广泛的综合工具。
5. 这些综合工具有什么特点呢?
XST - 随ISE自带,免费,对新器件支持快。但是对loop循环支持不如Synpilfy。综合结果的时序有时没有Synplify好。
Synplify - 应用最广泛。综合结果的时序性能和占用面积都不错,大器件的综合时间也相比XST有优势。但是非常贵,对新器件支持比XST晚一拍。
Precison - 没用过,不发表评论。
-----------XST基础--------------
1. XST的使用手册在哪里?
XST User Guide。可以在ISE界面中点Help --> Reference Manuals --> XST User Guide,或者在开始菜单中找到ISE --> Documentation --> Reference Manuals --> XST User Guide,或者ISE安装目录doc子目录中搜索xst.pdf。
2. XST支持哪些语言?
VHDL, Verilog-2002, 以及Mixed Language of VHDL and Verilog。
所支持的可综合的VHDL和Verilog的子集可以查看XST User Guide。
-----------XST中更多的控制--------------
1. 综合器插入的Buffer类型不是我想要的,如何控制XST插入buffer的类型?
- 用buffer_type约束控制某个信号驱动的buffer的类型。具体使用方法在XST User Guide。
- 如果用了很多门控时钟,XST会给他们分别都插入BUFG,而真正需要BUFG的信号可能却因此没有BUFG可分配了。此时可以手动例化插入BUFG,然后在XST属性中设置允许使用BUFG的数量,那么手动例化BUFG的将拥有高优先级而先占用了规定的可用BUFG数量。
2. 怎样防止逻辑被合并优化?
- 在默认情况下,综合器会将有相同输入信号并且实现相同功能的逻辑认为是重复的逻辑而将他们合并优化。
- 为防止这种情况发生,可以关闭XST的"Resource Sharing"和"Equivalant Register Removal"选项
- 也可以在特定的逻辑上加上Keep约束或S约束
3. 用综合约束控制产生电路
- 综合器也需要添加约束。通常使用的UCF只在布局布线时才起作用。在越早的步骤中使用约束,就能对设计进行更早的干预和优化,时序收敛的可能性就越大。
- 在XST的属性中添加XCF约束
- Period, Offset, From To的约束语法都和UCF一样。
--------复制寄存器相关事项--------
1. 什么时候要复制寄存器?
- Fanout太多导致延时增大(在FPGA中不是最主要的因素)
- Fanout太分散相距太远导致布局布线后出现过长的走线
2. 复制寄存器有哪些方法?
- 手动作HDL Coding,并且为了防止这些寄存器再次被综合器优化合并,需要将“Equivalant Register Removal”设置为False。
- 让工具自动复制。为需要复制的寄存器添加Max_Fanout约束,并关闭Resource Sharing和Equivalent Register Removal。注意当Max_Fanout约束设置得过小时,可能不会生效。
--------使用BlackBox注意事项------------
1. 什么是BlackBox
- 一个大的设计中可以用到一系列网表文件作为输入的一部分而并不全部使用HDL文件。当综合这个大设计时综合器不需要知道这个网表文件是怎样实现的,而只需要知道它的输入输出接口就可以了。这样的网表就称为黑盒子,因为我们不需要看到它的内部情况。
- 通常付费IP都会以BlackBox的形式
2. 如何使用BlackBox
- BlackBox网表可以是EDIF或NGC文件。
- 每个BlackBox网表都需要有一个与之相对应的HDL文件来注明它的端口。这个HDL只说明BlackBox的端口信息,而不提供具体实现信息。这个只提供端口信息的HDL文件称为Wrapper。Wrapper的名字通常需要与BlackBox网表的名字相同。
- 在ISE工程中使用BlackBox时只需要将它的Wrapper添加到工程中。然后像普通的模块一样在其上层声明和例化就可以使用。
- BlackBox网表文件可以放在ISE工程目录中,也可以放在其他任意文件夹内。当不放在ISE工程目录时,需要在Translate属性中将Macro Search Path指向这个目录。多个目录使用"|"分割。
3. 如何制作BlackBox
- BlackBox只是普通网表而已。XST的综合结果就可以直接作为BlackBox使用。
- 通常BlackBox外部还会连接其他逻辑,所以BlackBox中一般不插入IOBUF。在XST属性中去除Insert IO Buffer的选项。