首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

【Vivado使用误区与进阶】用Tcl定制Vivado设计实现流程-2

【Vivado使用误区与进阶】用Tcl定制Vivado设计实现流程-2

Tcl Console
Vivado IDE的最下方有一个Tcl Console,在运行过程中允许用户输入Tcl/XDC命令或是source预先写好的Tcl脚本,返回值会即时显示在这个对话框。

举例来说,设计调试过程中,需要将一些约束应用在某些网表目标上(具体可参照《Tcl在Vivado中的应用》所示),推荐的做法就是在IDE中打开.dcp然后在Tcl Console中输入相应的Tcl/XDC命令,验证返回值,碰到问题可以直接修改,直到找到正确合适的命令。然后可以记录这些命令,并存入XDC文件中以备下次实现时使用。
还有一种情况是,预先读入的XDC中有些约束需要修改,或是缺失了某些重要约束。不同于ISE中必须修改UCF重跑设计的做法,在Vivado中,我们可以充分利用Tcl/XDC的优势, 在Tcl Console中输入新的Tcl/XDC,无需重跑设计,只要运行时序报告来验证。当然,如果能重跑设计,效果会更好,但是这种方法在早期设计阶段提供了一种快速进行交互式验证的可能,保证了更快地设计迭代,大大提升了效率。
另外,通过某些Tcl命令(例如show_objects、select_objects等等)的帮助,我们还可以利用Tcl Console与时序报告、RTL和门级网表以及布局布线后的网表之间进行交互调试,极大发挥Vivado IDE的优势。
Hook Scripts
Vivado IDE中内置了tcl.pre和tcl.post,用户可以在Synthesis和Implementation的设置窗口中找到。设计实现的每一步都有这样两个位置可供用户加入自己的Tcl脚本。


tcl.pre 表示当前这步之前Vivado会主动source的Tcl脚本,tcl.post 表示这步之后会source的脚本。Tcl脚本必须事先写好,然后在上图所示的设置界面由用户使用弹出窗口指定到脚本所在位置。
这些就是所谓的“钩子”脚本,正是有了这样的脚本,我们才得以在图形化界面上既享有一键式执行的便利,又充分利用Tcl带来的扩展性。比较常见的使用场景是,在某个步骤后多产生几个特别的报告,或是在布线前再跑几次物理优化等。
Customer Commands
Vivado IDE中还有一个扩展功能,允许用户把事先创建好的Tcl脚本以定制化命令的方式加入图形化界面,成为一个按钮,方便快速执行。这个功能常常用来报告特定的时序信息、修改网表内容、实现ECO等等。


用Tcl定制实现流程
综上所述,标准的FPGA设计实现流程完全可以通过Vivado IDE一键式执行,如果仅需要少量扩展,通过前述钩子脚本等几种方法也完全可以做到。若是这些方法都不能满足需求,还可以使用Tcl脚本来跑设计,从而实现设计流程的全定制。
注:以下讨论的几种实现方案中仅包含后端实现具体步骤的区别,而且只列出非工程模式下对应的Tcl命令。
下图所示是Vivado中设计实现的基本流程,蓝色部分表示实现的基本步骤(尽管 opt_design 这一步理论上不是必选项,但仍强烈建议用户执行),对应Implementation的Default策略。黄色部分表示可选择执行的部分,不同的实现策略中配置不同。


这里不会讨论那些图形化界面中可选的策略,不同策略有何侧重,具体如何配置我们将在另外一篇关于Vivado策略选择的文章中详细描述。
我们要展示的是如何对设计流程进行改动来更好的满足设计需求,这些动作往往只能通过Tcl脚本来实现。
充分利用物理优化
物理优化即 phys_opt_design 是在后端通过复制、移动寄存器来降扇出和retiming,从而进行时序优化的重要手段,一般在布局和布线之间运行,从Vivado 2014.1开始,还支持布局后的物理优化。
很多用户会在Vivado中选中phys_opt_design,但往往不知道这一步其实可以运行多次,并且可以选择不同的directive来有侧重的优化时序。
比如,我们可以写这样一个Tcl脚本,在布局后,使用不同的directive或选项来跑多次物理优化,甚至可以再多运行一次物理优化,专门针对那些事先通过get_nets命令找到并定义为highfanout_nets的高扇出网络。具体directive的含义可以通过UG835、UG904或phys_opt_design -help命令查询。
布局布线之间的多次物理优化不会恶化时序,但会增加额外的运行时间,也有可能出现时序完全没有得到优化的结果。布线后的物理优化有时候会恶化THS,所以请一定记得每一步后都运行 report_timing_summary,并且通过 write_checkpoint  写出一个 .dcp 文件来保留阶段性结果。这一步的结果不理想就可以及时退回到上一步的 .dcp 继续进行。


闭环设计流程
通常的FPGA设计流程是一个开环系统,从前到后依次执行。但Vivado中提供了一种可能,用户可以通过place_design -post_place_opt 在已经完成布局布线的设计上再做一次布局布线,从而形成一个有了反馈信息的闭环系统。这次因为有了前一次布线后的真实连线延迟信息,布局的针对性更好,并且只会基于时序不满足的路径进行重布局而不会改变大部分已经存在的布局信息,之后的布线过程也是增量流程。
这一过程所需的运行时间较短,是一种很有针对性的时序优化方案。可以通过Tcl写一个循环多次迭代运行,但需留意每次的时序报告,若出现时序恶化就应及时停止。


增量设计流程
Vivado中的增量设计也是一个不得不提的功能。当设计进行到后期,每次运行改动很小,在开始后端实现前读入的设计网表具有较高相似度的情况下,推荐使用Vivado的增量布局布线功能。
如下图所示,运行增量流程的前提是有一个已经完成布局布线的.dcp文件,并以此用来作为新的布局布线的参考。
运行过程中,Vivado会重新利用已有的布局布线数据来缩短运行时间,并生成可预测的结果。当设计有95% 以上的相似度时,增量布局布线的运行时间会比一般布局布线平均缩短2 倍。若相似度低于80%,则使用增量布局布线只有很小的优势或者基本没有优势。


除了缩短运行时间外,增量布局布线对没有发生变化的设计部分造成的破坏也很小,因此能减少时序变化,最大限度保留时序结果,所以一般要求用做参考的 .dcp 文件必须是一个完全时序收敛的设计。
参考点 .dcp 文件可以在Vivado IDE的Implementation设置中指定,也可以在Tcl脚本中用 read_checkpoint -incremental 读入。特别需要指出的是,在工程模式中,如要在不新建一个impl实现的情况下使用上一次运行的结果作为参考点,必须将其另存到这次运行目录之外的位置,否则会因冲突而报错。

以上用Tcl定制Vivado设计实现流程的讨论就到这里,关于更细节的Tcl使用场景,包括ECO流程等,会另外展开,敬请关注Xilinx 官方网站和中文论坛上的更多技术文章。
返回列表