分享

Innovus修复Short的脚本分享(附脚本思路详细讲解)

 mzsm 2022-06-22 发布于湖北


好消息

星球创建了一个专属QQ交流群,上传了积累多年的IC后端笔记,最近刚上传2万字125页的ICC2教程,同时也会不定时发一些红包,感兴趣的可以加入。我相信这绝对是你能找到的最全的后端设计资料(理论+实践操作+脚本),没有之一!!

目前已上传的笔记有:

  • 低功耗设计技术总结-3万字,129页

  • IR drop的分析与修复总结-4.3千字,20页

  • 字后端理论及实践-ICC干货笔记-11万字,423页

  • 字后端理论及实践-Innouvs教程-5.7万字,316页

  • ICC2教程-星球精编版-2万字,125页(最新上传)

......

Innovus修复Short的脚本分享
(附脚本思路详细讲解)

01


星球相关精华推文


本文选自知识星球,同时星球里面分享了ICC2/ICC/Innovus解决Short问题的脚本,这里分享一下相应的链接:

《ICC/ICC2/Innovus 短路(Short)问题该如何解决?附tcl脚本》
https://t./03ynmyb62
《ICC2教程 - 超实用DRC LVS检查、修复命令及脚本分享》
https://t./03iE2FYJM 
《Innovus修复Short的脚本分享(附脚本思路详细讲解)》
https://t./036EUF6au 
《ICC教程 - 超实用DRC LVS修复命令及脚本分享》
https://t./03UVVZR3b


02


正文

在设计中有一些short,跑几轮ecoRoute -fix_drc都无法解决的情况下,我们可以删除一些short的shape来让工具重新ecoRoute来解决,如果数量有几十甚至上百个,那么手工操作就不太现实了,可以用脚本来实现,这里分享的就是这样一个脚本。

注意:如果short数量非常多且比较集中(hotspot)的情况下,就需要去看你的congestion状态了,如果congestion状态很差,那么这些short多半是无法完全解决的,必须从congestion上入手。
这里分享一个自己编写的脚本,脚本可以根据error browser里面verify_drc的结果来找到short的shape,然后删除它,由于Clock nets对timing的影响比较大,所以这里并未删除clock shape,只删除signal的shape,再之后运行ecoRoute修复open即可。

前面星球里面写了个推文是讲解如何用dbGet来得到error browser里面的结果并写脚本解决一些overlap的问题(能熟练掌握的话那么你的innovus脚本水平就比较溜了),这里我们换一种方法用get_db来讲解一下如何去实现。
《Tcl练习题答案 - CTS之后发现clock cell和tap cell有overlap的问题,如何写脚本解决?》
https://t./02MJM7iYr

同时星球里面分享了get_db/set_db的详细教程,感兴趣的也可以看下:
《get_db命令教程 与 Innovus Stylus Common UI教程》
https://t./02JIMfub6

首先运行下面的命令来报出所有的DRC:
#Verify Route DRC
set_verify_drc_mode -check_only all \
-report DTMF_CHIP.drc.rpt \
-limit 1000 -ignore_cell_blockage true
verify_drc
图片
命令get_db current_design .markers.subtype 可以得到当前设计中error browser里面的所有subtype,比如Metal_Short, Parallel_Run_Length_Spacing等。
[DEV]innovus 63> get_db current_design .markers.subtype
Metal_Short
可以用-if来筛选出Metal_Short:
[DEV]innovus 64> get_db current_design .markers -if {.subtype==Metal_Short}
marker:0x7ffeda4d2200
下面的命令可以报出short发生的层:
[DEV]innovus 65> get_db marker:0x7ffeda4d2200 .layer.name
Metal5
下面的命令可以报出error browser里面的message:
[DEV]innovus 66> get_db marker:0x7ffeda4d2200 .message
Regular Wire of Net DTMF_INST/TDSP_DS_CS_INST/CTS_2 & Regular Wire of Net tdsp_portO[9]
图片
下面的命令可以报出error发生的坐标:
[DEV]innovus 67> get_db marker:0x7ffeda4d2200 .bbox
{810.67 664.72 810.95 665.28}
下面的命令可以报出error发生位置的wire,如果其他层的wire也落在这个bbox里面的话可能会干扰我们,所以我们可以用-layers来只报告有short的layer:
[DEV]innovus 68> dbQuery -area {810.67 664.72 810.95 665.28} -objType wire -layers Metal5
0x7fff7a5e3718 0x7fff7a0f8058
[DEV]innovus 69> get_db [dbQuery -area {810.67 664.72 810.95 665.28} -objType wire -layers Metal5] .net.name
tdsp_portO[9] DTMF_INST/TDSP_DS_CS_INST/CTS_2

再之后,我们可以在short发生的box区域内找到不是clock nets的那段wire,是否是clock可以通过下面的命令来识别:
[DEV]innovus 75> get_db [dbQuery -area {810.67 664.72 810.95 665.28} -objType wire -layers Metal5] .net.use
scan clock
[DEV]innovus 82> get_db [get_db [dbQuery -area {810.67 664.72 810.95 665.28} -objType wire -layers Metal5] .net] -if {.use != clock}
{net:DTMF_CHIP/tdsp_portO[9]}
之后删除那段signal wire之后用ecoRoute重新绕即可。

完整的脚本:
proc hq_fix_shorts {} {
setMultiCpuUsage -localCpu 16

#fix short
get_db current_design .markers -if {.subtype == Metal_Short} -foreach {
set box [get_db $object .bbox]
set layer_name [get_db $object .layer.name]
select_obj [get_db [dbQuery -area $box -layers $layer_name -objType wire] -if {.net.use != clock}]
editDelete -selected
}

}
define_proc_arguments hq_fix_shorts -info 'Fix shorts based on DRC results'
执行proc hq_fix_shorts之后的结果:
图片
之后执行ecoRoute并检查DRC和Open即可。

有星粉反映工具有下面的命令可以实现相似的目的:
19版:editDeleteViolation
20版:editDelete -regular_wire_with_drc
这个命令会去解所有的DRC,而不止是Short,可是我们一般用删除shape去解short,而非所有DRC,并且这个命令会去删除整个net的绕线,动作非常大,所有不推荐大家直接使用。
我来分享一下两者之间的区别,并推荐大家使用分享的脚本而非直接使用这个命令,原因也会讲一下。

editDelete -regular_wire_with_drc:
优点:只会删regular net,因此不会动PG。
缺点:整个net都删掉了,一个net可能好几百um(示例中一个500+的net整个删除了),因为一个地方的小short导致整个net删除,对timing影响比较大,而脚本分析的方法不存在这种问题。
还有就是如果发现sigal nets和clock nets short了,那么两个net全部会被删掉。而clock nets对timing影响很大,所以如果要用这种方法最好把cts nets全部fix住。

脚本分享的方法:
优点:只会删short的area里面的data signal nets,不会动PG和clock nets,因此比较有保证,不会对timing和IR drop等有大的影响。
缺点:某些情况下,只删除局部的short shape可能无法解决这个short,工具可能还是会在那个地方去绕。这个时候就需要删除更多的shape了,可以手工来选择性删除。如果net所在的path的timing非常宽裕,那么完全删掉它重新绕也没有问题。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多