热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一文读懂Tcl在Vivado中的应用

原标题:【Vivado使用误区与进阶】Tcl在Vivado中的应用Xilinx的新一代设计套件Vivado相比上一代产品ISE,在运行速度、算法优化和功

原标题:【Vivado使用误区与进阶】Tcl在Vivado中的应用

Xilinx的新一代设计套件Vivado相比上一代产品ISE,在运行速度、算法优化和功能整合等很多方面都有了显著地改进。但是对初学者来说,新的约束语言XDC以及脚本语言Tcl的引入则成为了快速掌握Vivado使用技巧的最大障碍,以至于两年多后的今天,仍有很多用户缺乏升级到Vivado的信心。

本文介绍了Tcl在Vivado中的基础应用,希望起到抛砖引玉的作用,指引使用者在短时间内快速掌握相关技巧,更好地发挥Vivado在FPGA设计中的优势。


Tcl的背景介绍和基础语法

Tcl(读作tickle)诞生于80年代的加州大学伯克利分校,作为一种简单高效可移植性好的脚本语言,目前已经广泛应用在几乎所有的EDA工具中。Tcl 的最大特点就是其语法格式极其简单甚至可以说僵化,采用纯粹的 [命令 选项 参数] 形式,是名副其实的“工具命令语言”( 即Tcl的全称Tool Command Language)。

实际上Tcl的功能可以很强大,用其编写的程序也可以很复杂,但要在Vivado或大部分其它EDA工具中使用,则只需掌握其中最基本的几个部分。

注:在以下示例中,% 表示Tcl的命令提示符,执行回车后,Tcl会在下一行输出命令执行结果。// 后是作者所加注释,并不是例子的一部分。

设置变量

打印

打印主要通过puts语句来执行,配合特殊符号,直接决定最终输出内容。


文件I/O

可以看到Tcl对文件的操作也是通过设置变量,改变属性以及打印命令来进行的。上述写文件的例子中通过puts命令在my_file.txt文件中写入两行文字,分别为“Hello World!” 和myVar变量的值,然后在读文件操作中逐行读取同一文件的内容。


控制流和循环命令

Tcl语言中用于控制流程和循环的命令与C语言及其它高级语言中相似,包括if、while、for和foreach等等。

具体使用可以参考如下示例:

子程序/过程

Tcl中的子程序也叫做过程(Procedures),Tcl正是通过创建新的过程来增强其内建命令的能力,提供更强的扩展性。具体到Vivado的使用中,用户经常可以通过对一个个子程序/过程的创建来扩展或个性化Vivado的使用流程。

一些特殊符号

Tcl语言的基本语法相对简单,但要熟练掌握仍需日常不断练习。Xilinx网站上有很多相关资料,这里推荐两个跟Tcl相关的文档 UG835 和 UG894 ,希望对大家学习Vivado和Tcl有所帮助。

在Vivado中使用Tcl定位目标

在Vivado中使用Tcl最基本的场景就是对网表上的目标进行遍历、查找和定位,这也是对网表上的目标进行约束的基础。要掌握这些则首先需要理解Vivado对目标的分类。

目标的定义和定位

如上图所示,设计顶层的I/O称作ports,其余底层模块或是门级网表上的元件端口都称作pins。而包括顶层在内的各级模块,blackbox以及门级元件,都称作cells。连线称作nets,加上XDC中定义的clocks,在Vivado中一共将网表文件中的目标定义为五类。要选取这五类目标,则需用相应的get_*命令,例如get_pins等等。

get_ports

ports仅指顶层端口,所以get_ports的使用相对简单,可以配合通配符“* ”以及Tcl语言中处理list的命令一起使用。如下所示,

get_cells/get_nets

不同于ports仅指顶层端口,要定位cells和nets则相对复杂,首先需要面对层次的问题。这里有个大背景需要明确:Vivado中Tcl/XDC对网表中目标的搜索是层次化的,也就是一次仅搜索一个指定的层次current_instance,缺省值为顶层。

以下图所示设计来举例,若要搜索A(不含a1,a2)层次内的所有cells和名字中含有nt的nets, 有两种方法:

 

若要将搜索层次改为A+B+b1,则可以写一个循环,逐一用current_instance将搜索层次指向A,B和b1,再将搜索到的cells或nets合成一个list输出即可。

若要将搜索层次改为当前层次以及其下所有子层次,可以使用 -hierarchical (在Tcl中可以简写为-hier )。

在使用-hierarchical时有一点需要特别留意,即后面所跟的搜索条件仅指目标对象的名字,不能含有代表层次的“/” 。下面列出的写法便是一种常见的使用误区,并不能以此搜索到A及其下子层次内所有的cells。

get_pins

pins在Vivado数据库中有个独特的存在形式,即 / 。这里的“/”不表示层次,而是其名字的一部分,表示这个pin所属的实体。也就是说,在使用get_pins 配合-hier来查找pins时,“/”可以作为名字的一部分,出现在搜索条件内(注意与上述get_cells和get_nets的使用区别)。

目标之间的关系

Tcl在搜索网表中的目标时,除了上述根据名字条件直接搜索的方式,还可以利用目标间的关系,使用-of_objects(在Tcl中可以简写为-of)来间接搜索特定目标。Vivado中定义的五类目标间的关系如下页左图所示。

以上示右图的设计来举例,

下图是一个更复杂的示例,涉及跨层次搜索。可以看到在get_pins时,要加上-leaf才能准确定位到门级元件(或blackbox)的端口q。另外,在实际操作中,使用get_nets和get_pins时,需要视情况而加上其它条件(-filter)才能准确找到下述例子中的cells (i2)。

高级查找功能

在使用get_*命令查找网表中的目标时&#xff0c;除了名字这一直接条件&#xff0c;往往还需要辅以其它更复杂的条件判断&#xff0c;这就需要用到高级查找功能&#xff1a;-filter 结合Tcl支持的各种关系和逻辑运算符&#xff08;&#61;&#61;, !&#61;, &#61;~, !~, <&#61;, >&#61;, >, <, &&, ||&#xff09;甚至是正则表达式来操作。

在创建子程序时也常常用到-filter&#xff0c;例如下述get_p的子程序/过程就可以用来返回指定管脚的方向属性&#xff0c;告诉用户这是一个输入管脚还是一个输出管脚。

Tcl在Vivado中的延伸应用

Tcl在Vivado中的应用还远不止上述所列&#xff0c;其它常用的功能包括使用预先写好的Tcl脚本来跑设计实现流程&#xff0c;创建高级约束&#xff08;XDC不支持循环等高级Tcl语法&#xff09;以及实现复杂的个性化设计流程等等。Tcl所带来的强大的可扩展性决定了其在版本控制、设计自动化流程等方面具有图形化界面不能比拟的优势。

Vivado在不断发展更新的过程中&#xff0c;还有很多新的功能&#xff0c;包括ECO、PR、HD Flow等等都是从Tcl脚本方式开始支持&#xff0c;然后再逐步放入图形化界面中实现。这也解释了为何高端FPGA用户和熟练的Vivado用户都更偏爱Tcl脚本。

文章来源&#xff1a;赛灵思中文社区

作者&#xff1a;Ally Zhou

整理&#xff1a;碎碎思

版权归原作者所有

&#xff2e;&#xff2f;&#xff37;&#xff01;

推荐阅读

【Vivado那些事】如何查找官网例程及如何使用官网例程

【每周一问】如何控制加载FPGA程序时&#xff0c;Xilinx FPGA的IO管脚输出高低电平

【每周一问】Vivado综合时突然OCC模式弹不出来了

点击上方字体即可跳转阅读哟


推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • 本文总结和分析了JDK核心源码(2)中lang包下的基础知识,包括常用的对象类型包和异常类型包。在对象类型包中,介绍了Object类、String类、StringBuilder类、StringBuffer类和基本元素的包装类。在异常类型包中,介绍了Throwable类、Error类型和Exception类型。这些基础知识对于理解和使用JDK核心源码具有重要意义。 ... [详细]
  • php缓存ri,浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
    thinkPHP的F方法只能用于缓存简单数据类型,不支持有效期和缓存对象。S()缓存方法支持有效期,又称动态缓存方法。本文是小编日常整理有关thinkp ... [详细]
author-avatar
生活更美好YE
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有