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菜鸟上分记
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值