TCL学习:First Class Tcl Objects and Relationships
前言:最近需要移植vivado工程到新板卡上。之前只学了基础TCL语法,复杂一点的指令看博客看文档对陌生名词挠头。才发现官方文档Vivado Design Suite Tcl Command Reference Guide (UG835)第一章的First Class Tcl Objects and Relationships对Vivado用到的TCL的指令做了很好的知识铺垫。所以翻译该部分用于快速了解Vivado使用的TCL命令的背景知识。
原文链接:PDF • 查看器 • AMD 自适应计算文档门户 (xilinx.com)
Ch.1: Introduction
First Class Tcl Objects and Relationships
Vivado Design Suite中的Tcl命令提供了对网表、设备和项目的对象模型的直接访问。这些是Vivado一级对象,这意味着它们不仅仅是字符串表示,而且可以对它们进行操作和查询。这条规则有一些例外,但通常“事物”可以作为对象进行查询,这些对象具有可以查询的属性,并且它们具有允许您访问其他对象的关系。
Object Types and Definitions
在Vivado设计套件中有许多对象类型;本章提供了基本类型的定义和说明。最基本和最重要的对象类型与设计网络列表中的实体相关联,这些类型在以下小节中列出:
- Cell: 单元格是一个实例,它可以是网络列表中的基本实例,也可以是分层的实例。单元的例子包括触发器、lut、I/O缓冲区、RAM和dsp,以及作为其他单元组包装器的分层实例。
- Pin: 引脚是单元格上的逻辑连接点。pin允许对单元的内部进行抽象和简化,以便于使用,并且可以是分层单元或原始单元。引脚的例子包括时钟、数据、复位和触发器的输出引脚。
- Port: 端口是对象边界上的连接,用于将内部内容连接到对象的外部。顶级网表或设计中的端口通常连接到芯片上的I/O垫,连接到设备封装上的引脚,并在系统级设计中外部连接到设备。分层单元、模块或实体内部的端口表示为分层单元上的引脚。
- Net: 网络是一根或一串最终直接物理连接在一起的电线。
- Clock: 时钟是在设计中传播到顺序逻辑的周期性信号。时钟可以是主时钟域,也可以由时钟原语(如DCM、PLL或MMCM)生成。时钟大致相当于UCF中的TIMESPEC PERIOD约束,是静态时序分析算法的基础。
Querying Objects
所有第一类对象都可以通过 get_* Tcl命令查询,该命令通常具有以下语法:
get_<object_type> <pattern>
其中pattern是一个搜索,如果适用的话,它包括一个层次分隔符(/)来获得一个完全限定的名称。对象通常通过在层次结构的每个级别上应用的字符串模式匹配来查询,并且搜索模式还支持通配符样式的搜索模式以使查找对象更容易,例如:
get_cells */inst_1
该命令在层次结构顶层下的层次结构的第一层中搜索名为inst_1的单元格。要在每个层次结构级别上递归搜索模式,请使用以下语法:
get_cells -hierarchical inst_1
该命令在层次结构的每个级别搜索与inst_1匹配的任何实例。
有关命令语法的完整覆盖,请参阅单个命令的特定在线帮助:
help get_cellsget_cells -help
Object Properties
对象具有可查询的属性。属性名对于任何给定的对象类型都是唯一的。查询对象的指定属性, 使用实例:
get_property <property_name> <object>
例如,单元格对象上的lib_cell属性告诉你给定实例映射到的UniSim组件:
get_property lib_cell [get_cell inst_1]
要发现给定对象类型的所有可用属性,使用report_property命令:
report_property [get_cells inst_1]
有些属性是只读的,有些属性是用户可设置的。映射到可以在UCF或HDL中注释的属性的属性通常是用户可以通过Tcl使用set_property命令进行设置的:
set_property loc OLOGIC_X1Y27 [get_cell inst_1]
Filtering Based on Properties
对象查询get_*命令有一个通用选项,可以根据附加到对象的任何属性值过滤查询。这是对象查询命令的强大功能。例如,要查询所有基本类型FD的单元格,请执行以下操作:
get_cells * -hierarchical -filter “lib_cell == FD”
要执行更精细的字符串过滤,请使用=~操作符进行字符串模式匹配。例如,要查询设计中的所有触发器类型,请执行以下命令:
get_cells * -hierarchical -filter “lib_cell =~ FD*”
多个过滤器属性可以与其他带有逻辑OR(||)和and(&&)操作符的属性过滤器组合,以进行非常强大的搜索。查询设计中任何触发器类型并具有放置位置约束的每个单元:
get_cells * -hierarchical -filter {lib_cell =~ FD* && loc != “”}
Handling Lists of Objects
返回多个对象(如get_cells或get_sites)的命令在Vivado工具中返回一个集合,其外观和行为都类似于本地Tcl列表。在处理大型Tcl对象列表时,此特性可以提高性能,而无需使用foreach_in_collection命令等特殊命令。在Vivado Design Suite中,集合可以像Tcl列表一样使用内置命令(如lsort、lsearch和foreach)进行处理。
通常,当您运行get_*命令时,返回的结果作为Tcl字符串回显到控制台和日志文件,而不是作为列表回显,这是由于Tcl的一个称为“闪烁”的特性。
在内部,Tcl可以将变量或值存储为字符串和更快的本机对象(如float或list对象)。在Tcl中,当对象或值的表示形式从列表对象变为字符串对象,或从字符串变为列表时,就会发生闪烁。get_*命令返回一个Vivado对象列表,但是闪烁的字符串表示形式被写入日志文件和Tcl控制台。
但是,为了提高性能并防止内存缓冲区过载,Vivado Design Suite将闪烁字符串限制并截断为tcl定义的默认字符长度。collectionResultDisplayLimit参数,默认值为500。
可以返回大量对象的命令,如get_cells或get_sites,将截断返回的字符串,并以省略号('…')结束。您可以使用set_param命令更改tcl。collectionResultDisplayLimit参数值返回更多或更少的结果
你可以通过将结果赋值给一个Tcl变量来获取get_*命令返回的完整列表:
set allSites [get_sites]
Object Relationships
可以使用相关get_*命令的-of选项查询相关对象。例如,要获取连接到cell对象的引脚列表,请执行以下操作:
get_pins -of [get_cells inst_1]
下图显示了Vivado工具中的对象类型及其关系,其中从一个对象到另一个对象的箭头表示您可以使用get_*命令的-of选项来遍历逻辑连接并获取对任何连接对象的Tcl引用。有关第一类对象及其关系的更多信息,请参阅Vivado Design Suite属性参考指南(UG912)。


浙公网安备 33010602011771号