Vivado的Implementation主要有三大步:
- opt_design,会生成opt_desgin.dcp
- place_design,会生成place_design.dcp
- route_design,会生成route_design.dcp
如果再详细一点:
- opt_design
在这一步,Vivado会对综合后的网表文件做一些优化,删除一些无用的或者Vivado认为可以冗余的逻辑,但如果代码中使用了
DONT_TOUCH
和MARK_DEBUG
,在此步骤就不会被优化掉。 - power_opt_design 这一步可以在opt_design后执行,也可以在place_design后执行,该步骤主要是用Xilinx的智能门控时钟方案来减少FPGA设计中的动态功耗,但并不会改变时钟和逻辑的设计。
- place_design
在布局时,Vivado的布局器会优先考虑下面三点:
- Timing Slace
- Wirelength
- Congestion 在布局之前,Vivado会进行DRC检查。但比较扯淡的是,如果DRC发现错误,很多情况下,下面的步骤并不会停止,直到生成bit文件时才报错,会让工程师误以为这一步没有问题。
- phys_opt_design
该步骤主要进行的优化如下:
- 对于高扇出的网络,如果在WNS的10%内具有负的裕量,则会考虑复制以降低高扇出;
- 对于临近的负载进行聚合,并为每个负载的集合复制一个驱动;
- 重新分析时序,如果时序有优化则会改动逻辑部分;
- 继续分析是否有高扇出,如果还有,则继续复制电路以降低高扇出。
- route_design
Vivado的router有两种工作模式:
- Normal模式,这是最常用也是默认的模式,在该模式下,布局器会以增量编译的方式对读入的文件进行布局,如果文件已经进行了部分布局,那么布局器会在此基础上继续布局,而不是从头开始。
- Re-Entrant模式,当我们要跑多个routing且各个routing之间有关联操作时使用该模式。如果是非Re-Entrant模式,布局器执行完成后,会清除内存空间,每次开始的时候都需要初始化。
Vivado会优先对全局资源进行布线,比如时钟、复位、I/O和其他专用资源;接下来就是根据时序的紧张程度进行布线,优先布线时序紧张的路径。
这里需要注意的是,在某些手动锁定的布线约束下,router通常无法对某些信号进行最佳布线,这往往是因为时序约束不规范导致的。如果我们仔细观察那些不是最优路径的网络,我们会发现问题经常出在时序约束上。
所以最好的方式就是在routing之前,查看place_design的时序报告,检查时序约束是否正确。所以对于大型工程,采用non-project方式可能更好一些,因为project模式下,我们直接点击Implementation就可以执行完所有的步骤了,往往中间的结果我们也不会很在意。