转自:http://forums.xilinx.com/t5/Vivado专区/Vivado使用误区与进阶-Tcl在Vivado中的应用/td-p/525003
Xilinx的新一代设计套件Vivado相比上一代产品ISE,在运行速度、算法优化和功能整合等很多方
本文介绍了Tcl在Vivado中的基础应用,希望起到抛砖引玉的作用,指引使用者在短时间内快速掌握相关
Tcl的背景介绍和基础语法
Tcl(读作tickle)诞生于80年代的加州大学伯克利分校,作为一种简单高效可移植性好的脚本语言,
实际上Tcl的功能可以很强大,用其编写的程序也可以很复杂,但要在Vivado或大部分其它EDA工具中
注: 在以下示例中,% 表示Tcl的命令提示符,执行回车后,Tcl会在下一行输出命令执行结果。 // 后是作者所加注释,并不是例子的一部分。
设置变量
打印
打印主要通过puts语句来执行,配合特殊符号,直接决定最终输出内容。
文件I/O
可以看到Tcl对文件的操作也是通过设置变量,改变属性以及打印命令来进行的。上述写文件的例子中通过pu
控制流和循环命令
Tcl语言中用于控制流程和循环的命令与C语言及其它高级语言中相似,包括if、while、for和fo
具体使用可以参考如下示例:
子程序/过程
Tcl中的子程序也叫做过程(Procedures),Tcl正是通过创建新的过程来增强其内建命令的能力
一些特殊符号
Tcl语言的基本语法相对简单,但要熟练掌握仍需日常不断练习。Xilinx网站上有很多相关资料,这里推
在Vivado中使用Tcl定位目标
在Vivado中使用Tcl最基本的场景就是对网表上的目标进行遍历、查找和定位,这也是对网表上的目标进
目标的定义和定位
如上图所示,设计顶层的I/O称作ports,其余底层模块或是门级网表上的元件端口都称作pins。而包
get_ports
ports仅指顶层端口,所以get_ports的使用相对简单,可以配合通配符“* ”以及Tcl语言中处理list的命令一起使用。如下所示,
get_cells/get_nets
不同于ports仅指顶层端口,要定位cells和nets则相对复杂,首先需要面对层次的问题。这里有个
以下图所示设计来举例,若要搜索A(不含a1,a2)层次内的所有cells和名字中含有nt的nets, 有两种方法:
若要将搜索层次改为A+B+b1,则可以写一个循环,逐一用current_instance将搜索层次指
若要将搜索层次改为当前层次以及其下所有子层次,可以使用 -hierarchical (在Tcl中可以简写为-hier )。
在使用-hierarchical时有一点需要特别留意,即后面所跟的搜索条件仅指目标对象的名字,不能含
get_pins
pins在Vivado数据库中有个独特的存在形式,即 <instance>/<pin> 。这里的“/”不表示层次,而是其名字的一部分,表示这个pin所属的实体。也就是说,在使用get_pi
目标之间的关系
Tcl在搜索网表中的目标时,除了上述根据名字条件直接搜索的方式,还可以利用目标间的关系,使用-of_
以上示右图的设计来举例,
下图是一个更复杂的示例,涉及跨层次搜索。可以看到在get_pins时,要加上-leaf才能准确定位到
高级查找功能
在使用get_*命令查找网表中的目标时,除了名字这一直接条件,往往还需要辅以其它更复杂的条件判断,这
在创建子程序时也常常用到-filter,例如下述get_p的子程序/过程就可以用来返回指定管脚的方向属性,告诉用户这是一个输入管脚还是一个输出管脚。 需要特别指出的是,通常在-filter后会使用 { } ,但此时需要对 $direction做变量替换,必须如下所示改用 " "
Tcl在Vivado中的延伸应用
Tcl在Vivado中的应用还远不止上述所列,其它常用的功能包括使用预先写好的Tcl脚本来跑设计实现
Vivado在不断发展更新的过程中,还有很多新的功能,包括ECO、PR、HD Flow等等都是从Tcl脚本方式开始支持,然后再逐步放入图形化界面中实现。这也解释了为何高端FPGA用户和熟练的Vivado用户都更偏爱Tcl脚本。
篇幅所限,不能一一展开。关于以上Tcl在Vivado中的延伸应用,敬请关注Xilinx官方网站和中文论坛上的更多技术文章。