大家好!今天我要给大家安利一个数字后端物理设计中的“救命稻草”——ICC2里的 create_keepout_margin
命令!这个命令堪称解决布局混乱、短路问题的神器,尤其在面对那些“易短路的AOI/OAI单元”时,简直是物理设计工程师的福音!
一、什么是 Keepout Margin?
想象一下,你刚摆好一块精密的电路模块,如果周围没有“安全距离”,布线时很容易出现信号打架、短路甚至 DRC 报警。create_keepout_margin
的作用就是给这些模块划出“禁飞区”,确保其他元件和布线不会靠近,相当于给电路模块拉了一道“警戒线”。
这个命令有两种边界设置:
你以为这是在“自找麻烦”?No!这是让工具自动避坑的高效操作,避免后期 DRC 翻车!
⚙️ 二、三大核心选项分类与实战
虽然 create_keepout_margin
的选项看起来很多,但其实可以分为三大类,每类都有自己的“杀手锏”:
【门派1:边距控制】
-outer {左 下 右 上}
:直接指定模块四周的禁区尺寸,是防止干扰的“硬核武器”。
案例:给所有 A0I* 单元设置左0.28、右0.23的外边距(底部/顶部不限制)
create_keepout_margin -outer {0.28 0 0.23 0} [get_lib_cells */A0I*]
-inner {左 下 右 上}
:控制模块内部的隔离区域,适合层次化设计。
create_keepout_margin -inner {5 5 5 5} [get_cells hierarchical_block]
-tracks_per_macro_pin
:根据引脚密度自动计算禁区尺寸,数值越大越保守(0.5是黄金值)。
搭配技:用 -min_padding_per_macro
和 -max_padding_per_macro
限制推导结果的上下限,避免设计过激。
create_keepout_margin -tracks_per_macro_pin 0.5 -min_padding_per_macro 0.1 -max_padding_per_macro 0.2 [get_cells macro_xy]
【门派2:类型约束】
-type
:决定禁区的“硬核程度”。
hard
:工具必须100%遵守,适合初版设计(DRC终结者)。soft
:允许动态调整,适合优化阶段(灵活试探)。create_keepout_margin -type hard -outer {0.3 0 0.3 0} [get_cells critical_macro]
-layers
:指定特定金属层设置禁区,不影响其他层的布线自由度。
案例:仅在 M2-M4 层设置布线禁区
create_keepout_margin -layers "M2 M3 M4" -outer {0.2 0 0.2 0} [get_cells noise_sensitive_block]
【门派3:隐藏技能】
block_and_cell_list
:指定要保护的模块/单元列表,支持通配符快速批处理。create_keepout_margin -outer {0.5 0.5 0.5 0.5} [get_cells ARM*]
三、应用场景:对号入座,精准开大
宏模块防干扰:硬核外边界 + 自动计算,适合引脚密集的 Memory/CPU 模块。
create_keepout_margin -type hard -tracks_per_macro_pin 0.5 [get_cells ddr_controller]
敏感信号隔离:严格限制特定层的绕线禁区,降低串扰风险。
create_keepout_margin -layers M3 -outer {0.15 0.15 0.15 0.15} [get_cells clk_gen]
临时调试禁区:非致命区域用 soft
类型,兼顾规则和绕线灵活度。
create_keepout_margin -type soft -outer {0.1 0 0.1 0} [get_cells debug_interface]
四、血泪Tips:少走弯路的经验包
hard
确保收敛,后期优化再尝试 soft
释放空间。layers
参数尽量精简,过度限制会让绕线资源雪上加霜。最后分享一个冷知识:芯片设计中 60% 的 Short 问题 都是因为忽略了这个简单的禁区设定!所以下次遇到诡异的 DRC 报警,别急着挠头,先检查你的 Keepout Margin 是否“拉够”!
看完这篇文章,立刻动手在你的设计里试试这个命令吧!实践出真知,评论区欢迎分享你的实战翻车或救场经历~