星球创建了一个专属QQ交流群,上传了积累多年的IC后端笔记,最近刚上传2万字125页的ICC2教程,同时也会不定时发一些红包,感兴趣的可以加入。我相信这绝对是你能找到的最全的后端设计资料(理论+实践操作+脚本),没有之一!! 目前已上传的笔记有: 低功耗设计技术总结-3万字,129页 IR drop的分析与修复总结-4.3千字,20页 数字后端理论及实践-ICC干货笔记-11万字,423页 数字后端理论及实践-Innouvs教程-5.7万字,316页 ICC2教程-星球精编版-2万字,125页(最新上传)
...... 本文选自知识星球,同时星球里面分享了ICC2/ICC/Innovus解决Short问题的脚本,这里分享一下相应的链接: 《ICC/ICC2/Innovus 短路(Short)问题该如何解决?附tcl脚本》《ICC2教程 - 超实用DRC LVS检查、修复命令及脚本分享》《Innovus修复Short的脚本分享(附脚本思路详细讲解)》《ICC教程 - 超实用DRC LVS修复命令及脚本分享》在设计中有一些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的问题,如何写脚本解决?》同时星球里面分享了get_db/set_db的详细教程,感兴趣的也可以看下:《get_db命令教程 与 Innovus Stylus Common UI教程》set_verify_drc_mode -check_only all \-report DTMF_CHIP.drc.rpt \-limit 1000 -ignore_cell_blockage true命令get_db current_design .markers.subtype 可以得到当前设计中error browser里面的所有subtype,比如Metal_Short, Parallel_Run_Length_Spacing等。[DEV]innovus 63> get_db current_design .markers.subtype[DEV]innovus 64> get_db current_design .markers -if {.subtype==Metal_Short}[DEV]innovus 65> get_db marker:0x7ffeda4d2200 .layer.name下面的命令可以报出error browser里面的message:[DEV]innovus 66> get_db marker:0x7ffeda4d2200 .messageRegular Wire of Net DTMF_INST/TDSP_DS_CS_INST/CTS_2 & Regular Wire of Net tdsp_portO[9][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 Metal50x7fff7a5e3718 0x7fff7a0f8058[DEV]innovus 69> get_db [dbQuery -area {810.67 664.72 810.95 665.28} -objType wire -layers Metal5] .net.nametdsp_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[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重新绕即可。setMultiCpuUsage -localCpu 16get_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}]define_proc_arguments hq_fix_shorts -info 'Fix shorts based on DRC results'执行proc hq_fix_shorts之后的结果:之后执行ecoRoute并检查DRC和Open即可。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非常宽裕,那么完全删掉它重新绕也没有问题。
|