1. 问题背景与DRC检查概述
在芯片物理设计(Physical Design)阶段,Power Plan(电源规划)是至关重要的一环。它直接影响芯片的供电稳定性、IR压降和信号完整性。最近我在进行一个项目的PR(Place and Route)工作时,遇到了一个典型的DRC(Design Rule Check)问题——通孔(Via)与金属线边界距离违规。这个问题看似简单,但如果不正确处理,可能会导致芯片制造时的短路风险。
使用Calibre进行DRC检查后,系统报出了多个通孔与金属线边界的间距违规。这类错误通常表现为通孔过于靠近电源线(Power Stripe)或地线(Ground Stripe)的边缘,违反了代工厂(Foundry)规定的设计规则。在28nm及以下工艺节点,这类问题尤为常见,因为设计规则变得更加严格。
重要提示:DRC违规必须100%修复,否则芯片可能无法正常制造或功能失效。任何侥幸心理都可能导致流片失败。
2. 问题分析与初步解决方案
2.1 违规现象的具体表现
通过对比正确的设计和我当前的设计,可以明显看出差异:
-
正确设计:
- Via与Power Stripe边界保持安全距离(通常为0.1-0.2um,具体取决于工艺)
- FollowPin(跟随引脚走线)与相邻金属层有清晰的间距
- 电源网络分布均匀,没有过度拥挤的区域
-
我的设计:
- Via直接打到Power Stripe边缘,没有留出足够间距
- FollowPin与相邻走线间距不足
- 某些区域Via密度过高
2.2 根本原因分析
这个问题通常源于以下几个原因:
- 电源网络生成脚本未正确设置Via的偏移参数
- 手动调整电源网络后未更新Via位置
- 工艺设计规则(Design Rule)变更后未相应修改脚本
- 不同金属层之间的设计规则差异未被考虑
在我的案例中,问题主要出在第一个原因——初始的电源网络生成脚本没有正确设置Via与金属边界的间距参数。
3. 详细修复步骤
3.1 清理现有电源网络
首先需要完全清除现有的问题电源网络,这是修复的基础。不能尝试局部修改,必须彻底重做。
3.1.1 删除所有Stripe
使用以下命令删除所有纵向电源线:
tcl复制editDelete -shape STRIPE
这个命令会删除设计中所有的Stripe形状。执行后,只剩下横向的FollowPin。
3.1.2 删除所有FollowPin
接着删除剩余的横向电源线:
tcl复制editDelete -shape FOLLOWPIN
现在设计中的电源网络已完全清除,为重建做好准备。
3.2 重建全局电源连接
在重新生成电源网络前,必须确保全局电源连接定义正确。以下是完整的globalNetConnect脚本:
tcl复制clearGlobalNets
globalNetConnect VDD -type pgpin -pin {VDD} -inst *
globalNetConnect VDD -type tiehi -pin {VDD} -inst *
globalNetConnect VDD -type net -net VDD
globalNetConnect VSS -type pgpin -pin {VSS} -inst *
globalNetConnect VSS -type tielo -pin {VSS} -inst *
globalNetConnect VSS -type net -net VSS
这个脚本完成了以下工作:
- 清除现有的全局网络连接
- 将VDD网络连接到所有实例的VDD引脚
- 将VDD网络连接到所有tiehi单元
- 将VDD网络连接到VDD网线
- 对VSS网络重复相同操作
3.3 重新定义通孔规格
这是最关键的一步,也是我最初缺失的部分。正确的Via定义应包括:
- Via与金属边界的偏移量
- Via的排列模式(阵列或交错)
- Via的尺寸和间距
- 不同金属层间的Via过渡规则
虽然没有老师的完整脚本,但可以通过以下方式手动设置:
tcl复制setViaGenMode -reset
setViaGenMode -viarule_preference default
setViaGenMode -ignoreDRC false
setViaGenMode -min_stack_level 1
setViaGenMode -max_stack_level 3
setViaGenMode -via_interval 0.2
setViaGenMode -via_offset 0.1
这些参数需要根据具体工艺进行调整。关键参数是-via_offset,它控制Via与金属边界的距离。
4. 电源网络重建与验证
4.1 重新生成电源网络
使用正确的参数重新生成电源网络:
tcl复制sroute -connect { blockPin padPin padRing corePin floatingStripe } \
-layerChangeRange { METAL1 METAL8 } \
-blockPinTarget { nearestTarget } \
-padPinPortConnect { allPort oneGeom } \
-padPinTarget { nearestTarget } \
-corePinTarget { firstAfterRowEnd } \
-floatingStripeTarget { blockring padring ring stripe ringpin blockpin followpin } \
-allowJogging 1 \
-crossoverViaLayerRange { METAL1 METAL8 } \
-nets { VDD VSS } \
-allowLayerChange 1 \
-blockPin useLef \
-targetViaLayerRange { METAL1 METAL8 }
4.2 检查生成结果
生成后需要重点检查:
- Via与金属边界的间距是否符合规则
- 电源网络的覆盖率是否足够
- 是否有区域出现过度拥挤
- 不同金属层间的过渡是否平滑
5. 常见问题与解决方案
5.1 Via间距仍然违规
可能原因:
- Via偏移参数设置不足
- 金属线宽度与Via尺寸不匹配
- 设计规则理解有误
解决方案:
- 检查工艺文档,确认最小间距要求
- 逐步增加
-via_offset值,直到DRC干净 - 考虑使用双排Via减少密度
5.2 电源网络不连续
可能原因:
- 某些区域被阻挡
- 金属层变化处Via生成失败
- 电源网络定义不完整
解决方案:
- 使用GUI工具手动检查断开点
- 调整
sroute命令的-layerChangeRange参数 - 确保所有电源/地网络都正确定义
5.3 性能问题
可能原因:
- Via数量过多导致文件庞大
- 复杂的设计规则检查耗时
解决方案:
- 优化Via生成策略,减少冗余Via
- 分区域运行DRC检查
- 使用增量DRC检查方法
6. 进阶技巧与最佳实践
6.1 Via生成策略优化
- 对于高电流路径,使用双排Via增加可靠性
- 在低频区域可以适当减少Via密度
- 考虑使用不同尺寸的Via组合
6.2 电源网络规划建议
- 先规划顶层电源网络,再细化局部
- 保持电源网络的对称性和均匀性
- 为时钟网络预留足够的电源资源
- 考虑IR压降的影响,在关键区域增加Via
6.3 脚本自动化建议
将常用操作封装成脚本:
tcl复制proc redo_power_plan {} {
# 清除现有电源网络
editDelete -shape STRIPE
editDelete -shape FOLLOWPIN
# 重建全局连接
source global_connect.tcl
# 设置Via参数
source via_rules.tcl
# 重新生成电源网络
source sroute.tcl
puts "Power plan regeneration completed."
}
7. 工具使用技巧
7.1 Innovus中调用Calibre
在Innovus中可以直接调用Calibre进行DRC检查:
tcl复制calibre -drc -hier -turbo -hyper -nowait -64 -grid -gui design_name
7.2 高效查看DRC结果
- 使用Calibre RVE查看具体违规
- 按违规类型分类查看
- 重点关注重复出现的模式
- 使用"Waiver"功能标记已知接受的违规
7.3 性能优化技巧
- 在多核服务器上运行,使用
-turbo选项 - 对大型设计使用层次化检查
- 合理设置检查区域,避免全芯片检查
- 利用增量检查功能
8. 个人经验分享
在实际项目中,我总结了以下几点经验:
-
电源网络问题越早发现,修复成本越低。建议在Floorplan阶段就进行初步DRC检查。
-
Via相关问题往往不是孤立的,可能反映了更深的规划问题。需要从整体电源架构角度思考。
-
保持与工艺团队密切沟通,及时获取最新的设计规则更新。
-
建立完整的电源网络检查清单,包括:
- Via间距和排列
- 电源网络连续性
- 不同金属层的过渡
- 特殊区域的特殊规则(如模拟模块周围)
-
对于复杂设计,考虑使用专门的电源完整性分析工具进行辅助验证。
最后提醒一点:每次工艺节点升级,电源网络规划都会面临新的挑战。28nm到7nm的转变中,Via相关规则变得更加复杂,需要投入更多精力学习和适应。