时序组是进行时序赋值的有效方法。可以指定包含组中模式匹配节点的通配符,也可以指定排除组中模式匹配节点的通配符。您可能需要查看时序组中所有节点的列表,以便验证指定的通配符模式是否正确。
这些脚本列出了设计的时序组中的所有节点。此脚本对设计中的每个时序节点进行迭代,将时序节点名称与每个时间组包含模式进行比较,然后与每个时序组排除模式进行比较。
此脚本存在一定的限制;它无法处理嵌套时序组。包含或排除一个时序组可以有效地作为另一个时序组的元素,但此脚本并不支持。
要在时序组中包含总线的所有位,请在 Quartus II 软件 4.2 版或更低版本的总线名称后使用星号。从 5.0 版开始,无需使用星号即可指定总线名称。此脚本包含根据软件版本号对此行为进行的检查。
global quartus load_package advanced_timing load_package project # 确定脚本是在 4.2 版或更低版本还是 5.0 版或 # 更高版本中运行。5.0 及更高版本将 <bus name> 识别为 # 有效时序组输入,而 4.2 版及更低版本需要将 # <bus name>* 作为时序组输入。 regexp {^Version (\d)} $quartus(version) match qver if { $qver < 5 } { set need_asterisk 1 } else { set need_asterisk 0 } project_open [lindex $quartus(args) 0] create_timing_netlist set tg_name [lindex $quartus(args) 1] post_message "The following nodes are members of the timegroup $tg_name:" set tg_name [escape_brackets $tg_name] set tg_members [timegroup -get_members $tg_name] set tg_exceptions [timegroup -get_exceptions $tg_name] # 此循环对设计中的每个时序节点进行遍历 foreach_in_collection node_id [get_timing_nodes -type all] { set node_name [get_timing_node_info -info name $node_id] # 如果节点名称不在总线中,则清除 bus_name。 # 否则,设置 bus_name。 if { ! [regexp {(.*?)\[\d+\]} $node_name match bus_name] } { set bus_name "" } # 检查节点名称是否与指定时序组中的 # 任何模式匹配 set matches 0 foreach_in_collection member $tg_members { set esc_name [escape_brackets [lindex $member 2]] if { [string match $esc_name $node_name] } { set matches 1 } elseif { ! $need_asterisk && \ [string match $esc_name $bus_name] } { set matches 1 } } # 如果此处的 $matches 是 1,表明时序节点与时序组中的 # 一个成员名称匹配。但是,它也可能与异常匹配。 # 在此处进行检查。 if { $matches } { foreach_in_collection exception $tg_exceptions { set esc_name [escape_brackets [lindex $exception 2]] if { [string match $esc_name $node_name] } { set matches 0 } elseif { ! $need_asterisk && \ [string match $esc_name $bus_name] } { set matches 0 } } } # 我们已检查了所有异常。如果 $matches 仍然是 1, # 表明节点名称与成员模式匹配, # 而非与异常模式匹配,可打印节点名称。 if { $matches } { post_message $node_name } } project_close