Quartus® Prime专业版用户指南: 设计编译

ID 683236
日期 4/01/2024
Public
文档目录

1.6.2.2. 使用Tcl命令遍历设计网表

在本主题中,您可以看到Tcl命令的示例,您可以使用这些命令使用过滤器、模式和其他技术来提取设计的基本网表对象或选择性对象。

遍历基本设计对象

下表列出了从设计网表中提取分层实例、实例端口、网络和端口的Tcl命令示例:

注: 使用SDC文件中的dni:: Tcl命令时,您可以跳过添加dni::,因为read_sdc已正确添加命名空间。
表 6.  用于遍历设计对象的Tcl命令
任务 Tcl命令实例
获得顶层模块下的所有实例。 foreach_in_collection obj [dni::get_cells] { puts $obj; }
获得所有层次结构的所有设计实例。 foreach_in_collection obj [dni::get_cells -hierarchical] { puts $obj; }
直接获得层次结构实例下的所有实例使用层次结构分隔符(|)的模式 foreach_in_collection obj [dni::get_cells auto|*] { puts $obj; }
获得特定层次实例的所有直接子实例(例如,实例auto)。

# 使用dni::current_instance将浏览范围移动到auto层次实例。

dni::current_instance auto

# 获得层次实例auto的所有直接子实例。

foreach_in_collection obj [dni::get_cells] { puts $obj; }

# 将范围设置恢复到顶层设计

dni::current_instance

直接获得顶层模块下的所有网络。 foreach_in_collection obj [dni::get_nets] { puts $obj; }
获得所有层次结构的所有设计网络。 foreach_in_collection obj [dni::get_nets -hierarchical] { puts $obj; }
直接获得层次结构实例下的所有网络使用层次结构分隔符(|)的模式 foreach_in_collection obj [dni::get_nets tick|*] { puts $obj; }
直接获得特定层次结构实例下的所有子实例(例如,实例tick)。

# 使用dni::current_instance将浏览范围移动过到tick层次结构实例。

dni::current_instance tick

# 直接获得tick下的所有网络

foreach_in_collection obj [dni::get_nets] { puts $obj; }

# 将范围设置恢复到顶层设计

dni::current_instance

获得设计的所有端口。 foreach_in_collection obj [dni::get_ports] { puts $obj; }
获得设计顶层模块下直接子实例的所有实例端口。 foreach_in_collection obj [dni::get_pins] { puts $obj; }
获得特定层次实例下所有子实例的所有实例端口(例如,tick)。

# 使用dni::current_instance将浏览范围移动到tick层次结构实例。

dni::current_instance tick

# 获得tick下得所有实例端口

foreach_in_collection obj [dni::get_pins] { puts $obj; }

# Set the scope back to the top design

dni::current_instance

使用对象ID格式获得所有子实例上的所有实例端口以指定分层实例。

set inst [get_cells tick]

foreach_in_collection obj [dni::get_pins -of_objects $inst] { puts $obj; }

foreach_in_collection obj [dni::get_pins -of_objects tick|ticket[1]] { 放入 $obj; }

foreach_in_collection obj [dni::get_pins -of_objects instance::chiptrip::tick|ticket[1]] { puts $obj; }

获得选择性设计对象

您可以使用以下技术来优化您的搜索条件并从网表中提取选定的设计对象:

  • <patterns> :通过匹配dni::get_cellsdni::get_netsdni::get_pins命令中的模式(pattern)来提取对象。模式可以包含通配符*或者。通配符与层次分隔符不匹配。

    对于设计层次结构中的对象:

    • 对象的层次路径名与模式(pattern)匹配。
    • 层次分隔符|将模式(pattern)拆分为单独的子模式(subpattern),每个子模式与一个层次结构级别匹配。这意味着*与层次结构不匹配。
    • 匹配的名称与当前搜索root(设计顶层模块)相关。您可以使用dni::current_instance命令。
表 7.  使用<pattern>获得选择性设计对象
使用<pattern>的任务 Tcl Command实例
获得所有第一级层次结构和叶实例。 foreach_in_collection obj [dni::get_cells *] { puts $obj; }
获得所有第二级层次结构和叶实例。 foreach_in_collection obj [dni::get_cells *|*] { puts $obj; }
获得分层实例下的所有实例,例如,auto foreach_in_collection obj [dni::get_cells auto|*] { puts $obj; }
获得顶层模块下的所有网络。 foreach_in_collection obj [dni::get_nets *] { puts $obj; }
获得第一级层次结构和叶实例下所有网络。 foreach_in_collection obj [dni::get_nets *|*] { puts $obj; }
获得第一级层次实例下的所有网络,例如,auto foreach_in_collection obj [dni::get_nets auto|*] { puts $obj; }
获得第一级层次结构和叶实例下所有实例端口。 foreach_in_collection obj [dni::get_pins *|*] { puts $obj; }
获得层次实例上的所有实例端口,例如,auto foreach_in_collection obj [dni::get_pins auto|*] { puts $obj; }
获得特定层次实例下所有子实例上的所有实例端口,例如,auto)。 foreach_in_collection obj [dni::get_pins auto|*|*] { puts $obj; }
  • <-of_objects> :从输入对象集合中提取dni::get_cellsdni::get_netsdni::get_pinsdni::get_ports的相关设计对象。请考虑以下对象关系:
    • dni::get_cells -of_objects <inst_port|net>
    • dni::get_nets -of_objects <inst_port|port|instance>
    • dni::get_pins -of_objects <instance|net>
    • dni::get_ports -of_objects <net>
表 8.  使用<-of_objects>获得选择性设计对象
使用<-of_objects>的任务 Tcl命令实例

获的输入实例端口所在的层次实例或叶实例。

foreach_in_collection obj [dni::get_cells -of_objects inst_port::chiptrip::auto|dir[0]] { puts $obj; }

foreach_in_collection obj [dni::get_cells -of_objects inst_port::chiptrip::auto|street_map[2]|q] { puts $obj; }

获得已连接的输入网络所在的层次实例或叶实例。

foreach_in_collection obj [dni::get_cells -of_objects net::chiptrip::wire_get_ticket1] { puts $obj; }

foreach_in_collection obj [dni::get_cells -of_objects net::chiptrip::auto|n5] { puts $obj; }

foreach_in_collection obj [dni::get_cells -of_objects [dni::get_nets *]] { puts $obj; }

foreach_in_collection obj [dni::get_cells -of_objects [dni::get_nets auto|*]] { puts $obj; }

获得连接叶实例端口的网络。 foreach_in_collection obj [dni::get_nets -of_objects inst_port::chiptrip::auto|street_map[0]|q] { puts $obj; }
获得连接层次实例端口的网络。 foreach_in_collection obj [dni::get_nets -of_objects inst_port::chiptrip::auto|get_ticket] { puts $obj; }
获得连接到叶实例的所有实例端口的网络。 foreach_in_collection obj [dni::get_nets -of_objects instance::chiptrip::auto|street_map[0]] { puts $obj; }
获得连接到层次实例的所有实例端口的网络。 foreach_in_collection obj [dni::get_nets -of_objects instance::chiptrip::auto] { puts $obj; }
获得连接到设计主端口的网络。 foreach_in_collection obj [dni::get_nets -of_objects port::chiptrip::gt1] { puts $obj; }
获得叶实例上的实例端口。 foreach_in_collection obj [dni::get_pins -of_objects instance::chiptrip::tick|add_0] { puts $obj; }
获得层次实例上的实例端口。 foreach_in_collection obj [dni::get_pins -of_objects instance::chiptrip::tick] { puts $obj; }
获得层次实例上的实例端口,例如,instance::chiptrip::auto foreach_in_collection obj [dni::get_pins -of_objects [dni::get_cells auto]] { puts $obj; }
获得通过层次网络连接的实例端口。 foreach_in_collection obj [dni::get_pins -of_objects net::chiptrip::wire_get_ticket1] { puts $obj; }
获得由顶层的层次网络连接的主端口。 foreach_in_collection obj [dni::get_ports -of_objects net::chiptrip::wire_get_ticket1] { puts $obj; }
  • <-filter> :它根据过滤程序表达式,通过过滤从dni::get_cellsdni::get_netsdni::get_pinsdni::get_ports返回的对象来提取对象。过滤表达式会验证每个满足其他搜索条件的对象。如果对象不满足过滤条件,则不会在结果中返回。
    过滤表达式由使用逻辑运算符组合的判别式(predicate)组成,例如&&and/AND||or/OR!。在表达式中的括号()覆盖优先级。每个判别式(predicate)均具有以下形式:
    prop_namerelopvalue
    ,其中
    • prop_name 是正在评估中的对象属性的名称。
    • value 是数字或字符串。您可以提供不带双引号的简单字符串。
    • relop 是如下比较运算符之一:
      • ==(平等的)
      • !=(不等于)
      • =〜(匹配,值为一个模式)
      • !〜(不匹配,则值为一个模式)
      • >(大于)
      • <(少于)
      • >=(大于或等于)
      • <=(小于或等于)

    例如:-filter {name=~"out[*]" && ! (master_name==mod_1 || parent_name != block_1)}

表 9.  使用<-filter>获得选择性设计对象
使用<-filter>的任务 Tcl命令实例
获得顶层下的所有子实例。 foreach_in_collection obj [dni::get_cells *] { puts $obj; }
获得实例对象类型的属性。 dni::list_properties -type instance
获得非叶实例的对象 foreach_in_collection obj [dni::get_cells * -filter {is_leaf==1}] { puts $obj; }
获得层次实例的所有对象。 foreach_in_collection obj [dni::get_cells * -filter {is_leaf==0}] { puts $obj; }
返回与设计顶层模块下名称模式相匹配的层次实例(例如,t* foreach_in_collection obj [dni::get_cells * -filter {is_leaf==0 && name=~"t*"}] { puts $obj; }
获得层次实例下的所有实例,例如,与过滤器中模块名称相匹配的auto

Foreach_in_collection obj [dni::get_cells auto|*] { puts $obj; }

dni::get_property -name module_name -object instance::chiptrip::auto|Mux_0

foreach_in_collection obj [dni::get_cells auto|* -filter {module_name=="primitive_lib_WORKING_LIBRARY_INTERNAL/OPER_(MUX)"}] { puts $obj; }

获得可用于过滤net对象的属性。然后,获得顶层设计下具有三个连接实例端口和主端口的网络。

dni::list_properties -type net

foreach_in_collection obj [dni::get_nets -filter {number_of_ports==3}] { puts $obj; }

获得父模块下的完整设计层次结构中的所有网络,例如,auto_max foreach_in_collection obj [dni::get_nets -hierarchical -filter {parent_name=="auto_max"}] { puts $obj; }
获得完整设计层次结构中与net_bus相关的所有网络,例如,street_map foreach_in_collection obj [dni::get_nets -hierarchical -filter {net_bus_name=="street_map"} ] { puts $obj; }
获得可用于过滤实例端口对象的属性,并获得direction属性得值。然后,获取顶层设计下所有输出inst_ports

dni::list_properties -type inst_port

dni::get_property -name direction -object inst_port::chiptrip::auto|get_ticket

foreach_in_collection obj [dni::get_pins -filter {direction==output}] { puts $obj; }

获得设计中的所有主输入端口。 foreach_in_collection obj [dni::get_ports -filter {direction==input}] { puts $obj; }
  • 组合使用<pattern>, -of_objects <obj_col>, -hierarchical, 和-filter <filter_expr> :
表 10.  组合搜索条件
使用组合搜索条件的任务  
获得设计顶层模块下符合-of_objects-filter组合搜索条件的所有实例端口。 foreach_in_collection obj [dni::get_pins -of_objects [dni::get_cells *] -filter {direction==input}] { puts $obj; }
获得设计顶层模块下与模式和-hierarchical匹配的所有网络。 foreach_in_collection obj [dni::get_nets time* -hierarchical] { puts $obj; }
以下示例显示了组合搜索条件的限制性:
tcl> foreach_in_collection obj [dni::get_pins clk -hierarchical]  { puts $obj; }
inst_port::chiptrip::auto|clk
inst_port::chiptrip::speed|clk
inst_port::chiptrip::tick|clk
inst_port::chiptrip::time_c|clk

 
tcl> foreach_in_collection obj [dni::get_nets time* -of_objects instance::chiptrip::time_c] { puts $obj; }
Arguments '-of_objects' and 'patterns' are mutually exclusive

 
tcl> foreach_in_collection obj [dni::get_pins -hierarchical -of_objects instance::chiptrip::time_c]  { puts $obj; }

Arguments '-of_objects' and '-hierarchical' are mutually exclusive