FPGA : 流程篇 (Synplicity+Xilinx)

Synplicity 综合

1.代码导入

库设置, 可针对每个文件设置所属lib
Verilog include 目录
顶层Generic 可设
TopLevel设置(若非work, 要加库名前缀)

2.设置选项

选择器件
Fanout :面积允许的情况下,fanout 较小timing 比较理想,一般20,10,若设的太小,面积会急剧膨胀。
I/O pad :默认会对I/O自动插入pad, 若需要edn则不要勾选
Fix Gate:会对时钟识别产生影响,但具体影响规律没有总结出来。
功能选项:Resource Sharing / Pipeline + retiming / FSM
实现选项:
WriteVendorConstraints 勾选择生成 ucf, 如果不选,可能会将约束自动写入edf当中,从而会与其他约束冲突。

3.编写约束

如果对timing不太清楚,则可先设为 AutoConstraint 之后综合一遍,分析综合结果后可以得出大致timing从而指导约束的编写。
若综合前对timing已非常了解,可直接在综合前写好时钟约束,无须上述迭代。

3.1 管脚约束

大多在Xilinx中通过ucf约束,但容易出错且不直观,不方便调试
我一般是通过 sdc约束,因为sdc是tcl语法,所有可以通过脚本扩展出许多其他功能
比如我一般针对板子写一个管脚定义文件。明确FPGA管脚在板上的实际用处。LED或者
switch 或port什么的。之后可以直接针对这些有意义的名字进行管脚绑定,从而屏蔽了
FPGA的管脚细节。但缺点是,更改管脚后需要重新map生成ncf, 时间较长。

3.2 时钟约束

最好对所有已知的时钟指定group及频率要求,若不指定,则会按默认频率约束,有些情况下,若默认频率无法达到则会耗费很多综合时间。
timing 约束不要太多,会导致综合布线很慢,
但如果不写任何时钟约束,ISE似乎会try best! 从而导致route 极慢,所以写一条宽松的时钟约束可能反而会快不少

4. 综合 (Synplicity)

run(F7:compile, F8:compile+map)

compile

逻辑分析优化 => srs (RTL网表,可以图形方式观察)
编译过程中,*.sro 这些中间文件存在可能导致compile死锁,无法完成编译,删空即可

map

根据约束对逻辑作物理映射
生成以下文件:
edf/edn - 结果文件
ncf - 约束
srm - Gate NetList (可以图形方式观察)
srr - log 文件
*.areasrr - 面积报告

5. 综合结果分析

第一次跑完,可以在log窗口或通过log文件观察一些实现后的数据以及note/warning/error:

log warning

主要要注意以下几点:
1. sensitive list: not in / in but not used 敏感列表,会导致仿真和综合行为失配
2. undriven/float/unused/unassigned 悬空
3. unbound 未限定
4. combinational loop / feedback mux 回环
5. latch/tristate 可以在整个设计中搜索latch并一一排除(有些可能是设计需要)

clock timing

srr 中的timing report 之前有clock report报告了所有的时钟,分3类
1. clock: 普通时钟
2. derived: 分频倍频(如通过DCM),生成的派生时钟,无须约束,综合工具会自动从源时钟推算出其约束。
3. inferred: 未指定成时钟,但实际作为时钟来用的信号,最好在constraints 显式指定出来。

Xilinx 布线

1. 综合结果导入Xilinx

这里需要综合出来的2个文件 :约束文件 ncf, 和 综合结果 edf(edn)

将edf导入Xilinx工程 (Xilinx的工程.ise文件自7.1开始改为2进制,不可编辑), ncf 若在edf 目录则会自动被包含。
指定ucf文件,ucf 可用来做一些扩展定义或者覆盖ncf中已有的定义(特别是时钟,一般在synplify中约束较高,考虑布线延时,具体实现时可能要降低要求,这可以在ucf中指定)
 

2. translate

设置 macro目录(用于搜寻edn,包含子目录也会被自动搜索,默认只搜索当前目录)
调用nngdbuild, 生成ngd和bld(log report), 若有ngo则直接使用
edn->_ngo/*.ngo
edf->ngd+_ngo/ngo
 

3. map

option
timing_driven
optimization cross hier
optimization strategy ( area, speed, balance )

生成文件
ngd -> ncd
ncf -> pcf (可在该文件中加进一步的约束,在schmetic 之外的不会被重新生成时覆盖)
-> mrp ( report, 有面积数据 )

4. place

这步做布局,安排各单元的具体位置。
如果 map 时timing_driven, 则这步已经合在map中做过了

5. route

这步最慢,做核心的布线工作

ncd+pcf->ncd
*.par是report
timgen: twx(文本模式为twr)
 

6. fpga_editor (optional)

直接对ncd 做修改(管脚,内部逻辑,改后不需要P&R)

7. 生成最终结果及下载

bitgen:生成bit文件(bit+bgn(report))
impact :下载

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-Share Alike 2.5 License.