0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

利用Tcl脚本节省编译时间

XILINX开发者社区 来源:XILINX开发者社区 2023-09-15 10:44 次阅读

这篇博文介绍了多种自动生成报告的有效途径,以便您在尝试对设计中特定阶段所耗用的编译时间进行调试时使用,例如,自动报告加载设计约束的时间、每条命令的持续时间,甚至是跨多个设计的运行时间差异。

此外还提供了关于如何解读这些结果的建议。其中涵盖了 3 个强大的脚本,用于应对这些用例。

一、Report_constraints:

对约束分析时间进行剖析之前,需知晓写入约束时建议的顺序要求。这些要求是根据每种类型的约束的优先级来决定的。时序约束的最优排序如下所述:

1. set_disable_timing
2. set_case_analysis
3. create_clock
4. set_clock_sense
5. create_generated_clock
6. set_input_delay / set_output_delay
7. set_min_delay / set_max_delay
8. set_false_path
9. set_multicycle_path

10. set_bus_skew

除了 set_bus_skew 之外,其他约束类型的优先级随编号而递增,并且覆盖先前约束类型的可能性也越高。因此,仅限更高优先级的约束才会对所涵盖的路径进行分析。

为减少约束解析所用的时间,约束应尽可能精确无误并且限定到目标范围内。如需了解更多信息,请参考 UG949 中的“建议的约束顺序”部分:

在复杂设计中,总是需要添加许多约束文件,包括 IP 约束和用户添加的约束。要获取这些约束的汇总表,可在 Tcl shell 中调用 report_constraints 脚本,以报告 XDC 或 DCP 文件中使用的约束 Tcl 命令(时序和非时序)数量。它还可以根据约束排序,对生成的时序更新数量进行粗略估计。您需使用下列语法找到此脚本:

语法

8d9d5148-52ee-11ee-a25d-92fbcf53809c.png


示例:
1. 按 XDC 文件名报告时序约束数量
此示例演示了 4 个独立 XDC 文件中每一种约束类型的数量

8dc67a8c-52ee-11ee-a25d-92fbcf53809c.png


2. 利用 -all 选项报告时序约束和非时序约束
非时序命令包括当前使用的所有 Vivado 命令,例如,get_pins、get_clocks 等。

8de89a86-52ee-11ee-a25d-92fbcf53809c.png


3. 报告详细的约束信息和各项约束的详情

8e385170-52ee-11ee-a25d-92fbcf53809c.png


4. 报告时序计算图 (graph)
此脚本可以估算各命令对于时序计算图的影响,它还能通过报告估算的时序更新数量(部分更新或完整更新)来帮助您了解这些约束是否采用了最优排序,其报告结果为 “Estimated updates: xxx”。

当命令流从 “Invalidate timing”(使时序失效)转变为“Require valid timing”(需有效时序)时,即可检测到时序更新。

8e48dae0-52ee-11ee-a25d-92fbcf53809c.png


通过使用此脚本,您应该能够看到这些约束的更新和加载次数,并确定约束是否具有重复的定义或有效的状态。

注释:报告的时序更新次数只是估算总数。但它确实能够呈现时序约束是否采用了最优排序。

二、剖析器profiler.tcl:

在 Vivado shell 中根据执行目标操作来调试特定设计的运行时间问题时,可以在 Vivado Tcl shell 中找到剖析器文件“profiler.tcl”,用于执行以下操作:

剖析 Vivado 命令或用户进程

执行运行时间分析,帮助了解运行时方面的瓶颈

分析特定命令或进程的调用次数(以改善脚本效率)

剖析器报告的输出 log 日志文件中包含 4 个部分:

汇总表

排名前 50 的运行时间

排名前 10 的集合

剖析的所有命令的详细运行时间


注释:输出格式可采用表格(默认)格式或 CSV (profiler summary -csv) 格式。

语法:

8e96e384-52ee-11ee-a25d-92fbcf53809c.png


使用示例:

8ec991e4-52ee-11ee-a25d-92fbcf53809c.png


报告部分详情:

第 1 部分:汇总表

通过对表格列进行计数,得到耗用的总体时间的统计结果。每个列的含义如下:

8eeccc36-52ee-11ee-a25d-92fbcf53809c.png

这样即可轻松确定哪些命令占用的运行时间最长。如下图所示,get_clocks 和 get_nets 命令均多次调用,占用了大部分的运行时间。

8f013324-52ee-11ee-a25d-92fbcf53809c.png

第 2 部分:排名前 50 的运行时间

此处报告了前 50 个最差的运行时间,按最差到最好进行排序。它提供了对运行时间影响最严重的命令的快速汇总信息。

其中包含以下列:
• ID(可用于查找 log 日志文件内的命令):匹配 Vivado 已处理的命令的顺序。ID 1 是运行的第一条命令,ID 2 是第二条,以此类推。
• runtime:以 ms 为单位的运行时间
• command:Vivado 运行的命令
以下截屏显示了 50 行列表中的一部分:

8f2ad800-52ee-11ee-a25d-92fbcf53809c.png


第 3 部分:排名前 10 的集合
这部分包括由任意剖析的命令返回的 10 个最大的对象集合。其中对于每个集合都包含:
• size:集合大小
• count:大小相同的集合数量
• total:对象总数 (size * count)
• commands:返回该集合的命令列表

8f4c0c32-52ee-11ee-a25d-92fbcf53809c.png


第 4 部分:详情报告
这部分包含已剖析的每条命令的全部详细信息,按第一条到最后一条命令排序。其中包含命令 ID、运行时间、命令以及每条命令对象数量:

8f89b258-52ee-11ee-a25d-92fbcf53809c.png


用例:
1. 改善约束效率
对 Tcl 脚本进行剖析有助于了解运行时间的使用方式以及 Vivado 命令或用户进程的调用次数。它有助于重构对运行时至关重要的 Tcl 代码,显著改善运行时间。

以下示例对两个等效版本的 Tcl 循环之间的运行时间差异和 Vivado 命令的调用次数进行了比较:
构造前:

8fb4e9c8-52ee-11ee-a25d-92fbcf53809c.png


结果显示,有 75,216 次调用用于 get_property 命令,这占用了大部分的运行时间。因此,我们可以把“get_property”命令移至循环外部以节省时间。

构造代码后,耗费的总时间减少了 95%:

9002af00-52ee-11ee-a25d-92fbcf53809c.png


2. 跨多个设计比较运行时间
在跨不同 Vivado 版本进行网表加载或约束解析时,您可能会遇到时间差异。以下示例演示了 2 轮不同的 Vivado 运行之间耗用运行时间的方式。

此方法有助于对不同版本间耗用的每条命令的调用次数进行调试。在此情况下,有问题的版本运行针对每个命令的调用次数都增加了一倍。

正常版本:

90374a44-52ee-11ee-a25d-92fbcf53809c.png


问题版本:

90698202-52ee-11ee-a25d-92fbcf53809c.png

三、Vivado Runtime:

如需对多个设计上跨多个阶段的 Vivado 命令的运行时间进行比较,可使用 VivadoRuntime 脚本从 Vivado log 日志文件内的:

runtime/memory/checksum/timing/congestion/command 行提取部分调试信息。它还可用于比较多个 Vivado log 日志文件之间的信息。此脚本可用于提取定制运行时间,前提是这些运行时间的格式正确。它会从文本 log 日志文件中提取信息,并可在 Shell 提示符下执行。

语法:

90c2baf2-52ee-11ee-a25d-92fbcf53809c.png


示例:
在此示例所示表格中,对 Vivado 流程中每个阶段的多个 log 日志文件进行了比较。

90f695c0-52ee-11ee-a25d-92fbcf53809c.png910b1270-52ee-11ee-a25d-92fbcf53809c.png

总结:

通过使用这 3 个强大的脚本,您即可快速识别约束和运行阶段的瓶颈,从而最终帮助您节省运行时间。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 调试
    +关注

    关注

    7

    文章

    527

    浏览量

    33625
  • TCL
    TCL
    +关注

    关注

    10

    文章

    1658

    浏览量

    87933
  • 编译时间
    +关注

    关注

    0

    文章

    3

    浏览量

    5470
  • 时序约束
    +关注

    关注

    1

    文章

    111

    浏览量

    13350
  • 脚本
    +关注

    关注

    1

    文章

    372

    浏览量

    14636

原文标题:开发者分享|节省编译时间系列-利用 Tcl 脚本对编译时间进行剖析

文章出处:【微信号:gh_2d1c7e2d540e,微信公众号:XILINX开发者社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    加载TCL脚本

    求助大神 制作能够 “加载TCL脚本功能”得用什么控件!求指教求指点~!万分感谢~!{:36:}百度了好几天都没有~!
    发表于 04-22 09:55

    关于TCL脚本问题

    请问大家,这个tcl脚本文件是做什么用的呢????本人是菜鸟,还望大家多多指教啊
    发表于 06-14 16:05

    matlab脚本节点问题

    matlab脚本节点中的程序不能嵌套函数,怎么解决这一问题
    发表于 09-11 11:24

    LabVIEW调用Matlab脚本节点Matlab无响应

      我的LabVIEW是2014版,Matlab2011a。我在LabVIEW Matlab脚本节点写个函数然后调用Matlab里面函数是可以的,但是用采集卡采集的数据(连续采集,但是每采集指定
    发表于 01-03 18:26

    ISE 14.7怎么从tcl脚本更改.bit文件名

    你好,我做了Project->生成TCL脚本。现在,我希望能够从tcl脚本中指定.bit文件名。我怎么做?以上来自于谷歌翻译以下为原文hello,I did the Project-&
    发表于 11-09 11:49

    有哪些标准的方法使用TCL脚本添加Microblaze处理器C文件?

    。现在我正在尝试使用TCL脚本构建项目。我能够使用TCL脚本生成.bit文件。但我没有找到任何方法将固件C文件(在SDK中)添加到Microblaze处理器并使用
    发表于 04-04 16:37

    如何将库添加到设计中并使用Tcl脚本编译

    你好,我编写了一个Tcl脚本来合成Vivado Design Suite 2014.4中的设计(适用于Zynq ZC 706)。设计中的库未编译。弹出错误,表示找不到特定的.vhd文件。我检查了
    发表于 04-16 10:15

    【创龙TLZ7x-EasyEVM评估板试用连载】TcL脚本的使用

    ` 今天继续与大家分享一下使用TcL脚本生成Vivado工程及编译的开发体验。创龙提供了丰富的入门教程与Demo程序,帮助我们快速熟悉FPGA开发流程。先来了解一下什么是Tcl呢?
    发表于 06-07 13:59

    请问如何利用tcl脚本在lc_shell中批量把.lib文件转化成.db文件?

    如何利用tcl脚本在lc_shell中批量把.lib文件转化成.db文件?
    发表于 01-04 07:36

    在Vivado下利用Tcl脚本对综合后的网表进行编辑过程

    在ISE下,对综合后的网表进行编辑几乎是不可能的事情,但在Vivado下成为可能。Vivado对Tcl的支持,使得Tcl脚本在FPGA设计中有了用武之地。本文通过一个实例演示如何在Vivado下
    发表于 11-18 03:16 7009次阅读
    在Vivado下<b class='flag-5'>利用</b><b class='flag-5'>Tcl</b><b class='flag-5'>脚本</b>对综合后的网表进行编辑过程

    Vivado之TCL脚本语言基本语法介绍

    TCL脚本语言 Tcl(Tool Command Language)是一种很通用的脚本语言,它几乎在所有的平台上都可以解释运行,而且VIVADO也提供了
    发表于 04-11 12:09 9270次阅读

    如何节省FPGA编译时间

    FPGA到最后自然是规模越来越大,编译时间越来越长。解决问题的方法通常来说应该从工具和设计入手。
    的头像 发表于 08-04 09:16 6210次阅读

    Linux内核编译脚本

    ,则: make V= 2 内核编译脚本 最后分享我常用的内核编译脚本 mk.sh ,给大家参考: #!/bin/sh export ARCH=arm export PATH=~/to
    的头像 发表于 09-27 11:52 365次阅读

    Vivado那些事儿:节省编译时间系列文章

    虽然想必您知道,在综合或实现阶段,增量运行可以从参考文件中读取和复制信息,但仅在某些阶段中能节省时间,如果网表发生大量更改,其中引用的内容就会减少,编译时间也会受到相应影响。
    的头像 发表于 10-09 16:48 976次阅读
    Vivado那些事儿:<b class='flag-5'>节省</b><b class='flag-5'>编译</b><b class='flag-5'>时间</b>系列文章

    keil自动化编译脚本

    这是一个 keil 的自动化编译脚本,可被其他脚本或程序调用,接收参数并按参数编译 keil 工程,而不必打开 keil 软件,实现程序上的自动化。
    的头像 发表于 10-16 17:04 591次阅读
    keil自动化<b class='flag-5'>编译</b><b class='flag-5'>脚本</b>