昨天帮助社区IC训练营学员远程协助解决一个Calibre DRC案例。通过这个DRC Violation向大家分享下Innovus和ICC2中如何批量约束cell的spacing rule。
数字IC后端手把手实战教程 | Innovus verify_drc VIA1 DRC Violation解析及脚本自动化修复方案
下图所示为T12nm A55项目的Calibre DRC Violation M1.EN.9。通过查找T12nm的design manual,我们可以很清晰看到这个DRC Violation的本质是VIA到包边Metal的间距不够。
DRC Violation" />
但是通过Calibre RVE高亮后发现这个VIA1和Metal1都是标准单元内部的pin shape。所以换孔是行不通的。因此只能通过打破DRC Violation的触发条件来解决。
数字IC后端笔试面试真题串讲(Cut_EOL_Spacing DRC Violation自动化修复方案)
我们可以尝试改变并行走线长度L,间距D1和D1’。所以,我们可以把相邻的这两个cell间距拉大即可实现。
传统的做法是通过给DRC Violation Marker所在位置的cell添加cell padding来解决。
今天我们要分享的是通过设置placement spacing rule来约束工具做符合咱们预期的placement。这样做的好处是可以更精准针对某两类cell来设置space rule约束,对整体density或timing的影响相对来说更小。
Innovus中可以对任意cell进行cell edge type定义,并对不同的cell edge设置spacing约束。
specifyCellEdgeSpacing GROUP1 GROUP2 2
specifyCellEdgeType -cell A -top GROUP1 -range 0 0.2
specifyCellEdgeType -cell A -bottom GROUP2 -range 0.4 0.6
specifyCellEdgeType -cell B -top GROUP2 -range 0.4 0.6
specifyCellEdgeType -cell B -bottom GROUP1 -range 0 0.2
当我们给Cell A和Cell B设置如上约束后,工具在做refinePlace时就会遵守我们约束的spacing rule。当出现第二种图形时工具会检查出checkPlace的violation。
Innovus工具不仅支持对cell的bottom,top,也支持对left和right edge进行设置。当工具发现无论如何做refinePlace都无法修复这类placement violation就会报告Context placement violation。
本案例的Calibre DRC Violation,经过详细分析得知所有这类DRC都位于IND1和DF1这两款cell之间。所以,我们可以针对这两颗cell进行cell edge spacing的约束,只要这个它们之间的间距大于D1即可。
foreach cell [dbGet head.libCells.name -e] { specifyCellEdgeType -cell $cell -reset }
report_cell_edge_spacing
report_cell_edge_type
deleteCellEdgeSpacing
ICC2中设置placement space rule相关命令如下。命令中的{1 1}代表工具做placement时不能出现两个cell间距为1个site的场景。如果把{1 1}改成{0 1}则表示任何两个标准单元的间距不能为0(abut)和1个site。
remove_placement_spacing_rules -all
set_placement_spacing_label -name X -side both -lib_cells [get_lib_cells /]
set_placement_spacing_rule -labels {X X} {1 1}
而Innouvs中则可以通过设置如下的placeMode来实现这个效果。
setPlaceMode -place_detail_legalization_inst_gap 2
此外,我们还可以针对特定的cell来约束特殊的spacing rule约束。比如对设计中pin数量大于等于4的DF1寄存器进行spacing约束。
set cells [get_object_name [get_lib_cells -filter “number_of_pins >=4&& name=~DF1”]
set_placement_spacing_label -name X -side both -lib_cells [get_lib_cells $cells]
set_placement_spacing_rule -label {X X} {0 1}