1. Tcl的背景介绍和基础语法
- Tcl(读作 tickle)诞生于 80 年代的加州大学伯克利分校,作为一种简单高效可移植性好的脚本语言,目前已经广泛应用在几乎所有的 EDA工具中。Tcl 的最大特点就是其语法格式极其简单甚至可以说僵化,采用纯粹的 [命令 选项 参数] 形式,是名副其实的“工具命令语言”( 即 Tcl 的全称 Tool Command Language)。
- 实际上 Tcl 的功能可以很强大,用其编写的程序也可以很复杂,但要在 Vivado 或大部分其它 EDA 工具中使用,则只需掌握其中最基本的几个部分。
- 设置变量
- 打印
- 文件I/O
- 控制流和循环命令
- 子程序/过程
- 一些特殊符号
2. 在Vivado中使用Tcl定位目标
在 Vivado 中使用 Tcl 最基本的场景就是对网表上的目标进行遍历、查找和定位,这也是对网表上的目标进行约束的基础。要掌握这些则首先需要理解 Vivado 对目标的分类。
- 目标的定义和定位
如上图所示,设计顶层的 I/O 称作 ports,其余底层模块或是门级网表上的元件端口都称作 pins。而包括顶层在内的各级模块, blackbox 以及门级元件,都称作 cells。连线称作 nets,加上 XDC 中定义的 clocks,在Vivado 中一共将网表文件中的目标定义为五类。要选取这五类目标,则需用相应的 get_*命令,例如 get_pins等等。
- get_ports
- get_cells/get_nets
不同于 ports 仅指顶层端口,要定位 cells 和 nets 则相对复杂,首先需要面对层次的问题。这里有个大背景需要明确: Vivado 中 Tcl/XDC 对网表中目标的搜索是层次化的,也就是一次仅搜索一个指定的层次current_instance,缺省值为顶层。
- get_pins
- 目标之间的关系
Tcl 在搜索网表中的目标时,除了上述根据名字条件直接搜索的方式,还可以利用目标间的关系,使用-of_objects(在 Tcl 中可以简写为-of)来间接搜索特定目标。 Vivado 中定义的五类目标间的关系如下页左图所示。
下图是一个更复杂的示例,涉及跨层次搜索。可以看到在 get_pins 时,要加上-leaf 才能准确定位到门级元件(或 blackbox)的端口 q。另外,在实际操作中,使用 get_nets 和 get_pins 时,需要视情况而加上其它条件( -filter)才能准确找到下述例子中的 cells ( i2) 。
- 高级查找功能