本文主要是介绍innovus之property,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
做IC后端工程师,和tool打交道是数不胜数的,记得最初想实现某个功能,试了很多办法,大多过于繁琐不够简洁,后来接触到一些command觉得真是瞬间晴空万里。把一些遇到很有帮助的经验记录下来,希望能帮助到和我一样的小白。
今天要介绍的是object的property
property 是object的一些特性,或者属性值。常见的有clock的period, datapath的slack, cell的pin等 。有些property自己也是object,比如cell的pin,所以只要你愿意,就能一级一级trace下去 。
两个核心command:
list_property ; # 列出所有指定类型的object的property
get_property ; # 获得指定的某一个object的property
举个具体使用的🌰
list_property -type cell ;#这一步执行之后就会看到cell作为object的各种property,lib_cell就是cell的property
get_property [get_cells ADDED_B*] lib_cell ; #用这一条获得名字为ADDED_B*的cell的lib_cell,是常说的ref cell,是inst对应的库
set leaf [ get_cells -hierarchical -f "is_hierarchical == false" ] ;#这条command获得的是没有hierarchy的inst。
到这里可能还不足以感受到property的强大,那么下面要来大招了。
在debug timing的时候想知道slack出现的原因,比如想知道某条path slack过小到底是因为clock skew,还是datapath的delay太大等。借助property写出的脚本可以帮我们很大的忙。先看运行结果:
是不是分析起来一目了然:
slack :0.014 > 0 ;无violation
launch和capture的clock path skew分别是0.501和0.456, datapath的delay是1.55。
clock的周期也可以一眼看出。
有了这个脚本,分析某条具体path的timing会更加清楚明晰。
以下脚本是实现该任务运用property的一些核心命令
set points [get_property $path timing_points];#获得timing path $paths上的所有timing point(所有经过的点)
set size [expr [sizeof_collection $points] -1];#计算整个timing path上point的数量
set delay [expr [get_property [index_collection $points $size] arrival] - [get_property [index_collection $points 0] arrival]];# 计算出从第一个timing point到最后一个timing point的delay差
set slack [get_property $path slack];# 获得timing path的 slack
set cap_clock [get_object_name [get_property $path capturing_clock]];#获得timing path的capture clock(一个collection)
接下来放上全脚本
proc ccs_path_delay { {fromPt "" } {toPt ""} } {if { [string length $fromPt ] !=0 } {if { [string length $toPt ] !=0 } {set path_coll [report_timing -from $fromPt -to $toPt -collection -path_type full_clock]} else {set path_coll [report_timing -from $fromPt -collection -path_type full_clock]}} elseif { [string length $toPt ] != 0 } {set path_coll [report_timing -to $toPt -collection -path_type full_clock]} else {set path_coll [report_timing -collection -path_type full_clock]}set comment "################################"
# set path_coll [report_timing -collection -path_type full_clock]foreach_in_collection path $path_coll {set points [get_property $path timing_points]set size [expr [sizeof_collection $points] -1]set delay [expr [get_property [index_collection $points $size] arrival] - [get_property [index_collection $points 0] arrival]]set slack [get_property $path slack]set cap_clock [get_object_name [get_property $path capturing_clock]]set launch_clock [get_object_name [get_property $path launching_clock]]set launch_path [get_property $path launch_clock_path]set launch_path_points [get_property $launch_path timing_points]set launch_path_size [expr [sizeof_collection $launch_path_points] -1]if {[sizeof_collection $launch_path_points] > 0} {set launch_delay [expr [get_property [index_collection $launch_path_points $launch_path_size] arrival] \- [get_property [index_collection $launch_path_points 0] arrival]]} else {set launch_delay 0}set capture_path [get_property $path capture_clock_path]set capture_path_points [get_property $capture_path timing_points]set capture_path_size [expr [sizeof_collection $capture_path_points] -1]if {[sizeof_collection $capture_path_points] > 0} {set capture_delay [expr [get_property [index_collection $capture_path_points $capture_path_size] arrival] \- [get_property [index_collection $capture_path_points 0] arrival]]} else {set capture_delay 0}set end_clock_period [get_property [get_property $path capturing_clock] period]set start_clock_period [get_property [get_property $path launching_clock] period]puts "$comment \nData path delay: $delay \nPath Slack: $slack \nLaunch Clock path delay: $launch_delay \nCapture clock path delay: $capture_delay \nLaunch clock: $launch_clock \nCapture clock: $cap_clock \nLaunch clock period: $start_clock_period \nCapture clock period: $end_clock_period \n$comment"}
}
当然你也可以加更多内容进去,可以list property 试试。
总之,学习之路漫漫,有时候突然发现的知识技能,会让你直呼NB,继续努力💪
欢迎关注公众号:IC菜鸟上分记
这篇关于innovus之property的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!