本文章主要从以下几点进行逐一讲解:
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的命令和实例)