ICC2/innovus fix transition思路和实例

本文章主要从以下几点进行逐一讲解:

1.为什么要修transition?

2.修transition的方法有哪些?

3.结合实例,innovus与icc2修transition的命令对比

1.首先,为什么我们数字后端在修setup/hold之前,要修transition/cap,因为在lib中,cell delay是通过查二维表得来的,也即input transition和output load,如果发生了max transition的drv,也就是说此时的transition的值已经超过了表中的范围,那么显然此时的cell delay数值是不准确的,所以这个时候去fix timing是没有任何意义的。

2.出现transition的违例,常见的两种,一种是clock tree上的clock transition ,另一种是data path上的data transition,解决这两种transition的办法,如果是驱动单元较弱,比如是X1的,或者是SVT/RVT,可以对其进行size,如果是上一级和下一级的物理距离太长,此时你size了之后,发现还是无法解决,那么最直接的办法就是在这条长net中插入一个buffer进行打断,或许问题便能解决。

innovus相关的命令:ecoChangeCell   -cell    -inst

                                  ecoAddRepeater  -cell   -name   -term {  }   -loc {  }

icc2相关的命令:size_cell

                            insert_buffer    -new_cell_names    -new_net_names   -location  {  }

3.下面来结合实例,具体的讲解一下。同时也介绍一下icc2的一些比较方便的命令(基于icc2的命令)

1.先来介绍一下size cell的实例

我们在跑完pt之后,如果有transition的违例,report里会报出来,但是一般都是报的load点,所以此时需要通过这些load pin抓取对应的driver pin,然后根据driver pin获取insts name,进而获取cell type。所以我们基于这个思路往下进行。

1.首先可以写一个foreach循环,用get_nets -of_objects [get_pins *]获取这些点的nets,如下所示高亮的部分就是所抓取的net

2.再通过命令 all_connected -leaf [get_nets -of_objects [get_pins *]],获取与这条net相关联的所有cell的pin 

再通过命令 filter_col [all_connected -leaf [get_nets -of_objects [get_pins *]]] "direction == out" 获取这些pin当中的driver pin,这样我们所需要的 driver pin就抓出来了,如下图高亮所示

获得了driver pin之后,便也就知道了cell name以及cell type,此时便可以对其进行size操作。

2. 再来介绍一下insert buffer的情况:

笔者在项目中遇见了一个clock transition的问题,PT report报的都是mux的B端有着clock transtion的vio,一共十个,在gui界面看了之后,发现其物理距离都非常的远,并且还都没有插上buffer,如下图所示:

由一个buffer驱动着如此多的mux,并且物理距离还这么远,这个电路看起来比较复杂,自己插buffer的话,看起来有点困难,因为hierarchy层级不一样,插入的buffer名字也是不太好搞,所以这个时候,可以利用icc工具的命令: (当然要利用上面的方法,先将driver pin找出来,才能进行以下的操作,这里的driver就是 u_usb_u22h_comb/ICCII_PLACE_OPT_APS_CLK_ISO_2,为了方便观看命令,笔者将其竖着写下来)

split_fanout -driver u_usb_u22h_comb/ICCII_PLACE_OPT_APS_CLK_ISO_2/Y \

                   -cell_prefix fix_transition \

                   -max_fanout 3 \

                   -max_distance_for_incomplete_route 100 \

                   -lib_cell BUF_X12N_A6P75PP84TL_C16 \

                   -on_route 

上面的意思就是说,在间隔100um出插上一个指定的buffer cell,保证max fanout为3,插在cell   u_usb_u22h_comb/ICCII_PLACE_OPT_APS_CLK_ISO_2的扇出上,插入之后,如图所示:

由此可见,buffer也是比较完美的插上了,此时再进行分析,可是轻松明了很多。

3.题外话,这里再介绍一个icc2的命令,如果在解hold的时候,需要插入buffer,但是插入一个不太够,需要插入好几个,icc2可以解决这个小问题。

如果需要在这条黄色线上插入buffer,也即在逻辑门的输出端插入4个buffer,可以用命令

add_buffer -new_cell_names sel0_port_buf

                  -lib_cell */DLY10_X4N_A6P75PP84TR_C14

                  -no_of_cells 4 [get_pins phase_init1/U26/Y]

插入之后,如下所示:

以上便是本期内容的讲解,这是笔者第一次发表文章,内心忐忑,笔者今年大学毕业,于7月1日刚刚踏入数字后端的大门,使用icc2和innovus工具,还是萌新一枚,在此平台发布一些平时所学所感,若有纰漏或差错,还请大佬们指正,后续会多多的分享自己的学习,一起进步,给中国的半导体事业做贡献!

(由于篇幅较长,innovus的命令和实例下期再讲,本期主要讲解icc2的命令和实例)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值