芯片设计就像跑马拉松,前面99%的路程固然重要,但最后1%的冲刺往往决定成败。在完成主要布局布线后,我们进入了物理设计的收尾阶段——这个阶段需要处理各种"边角料"问题,稍有不慎就可能导致前功尽弃。
我经历过多次流片前的惊心动魄时刻,最夸张的一次是在tapeout前48小时发现关键路径有setup违例。当时整个团队通宵达旦做ECO修复,最终在deadline前半小时完成所有检查。这种经历让我深刻体会到signoff流程的重要性。
Signoff阶段主要解决两大问题:时序收敛和DRC违例。时序签核(Timing Signoff)要确保芯片在各种工作条件下都能满足频率要求,而DRC签核则要保证制造可行性。这两个环节就像产品的"出厂质检",任何疏漏都可能导致流片失败。
在route_opt完成后,首先要做的是全面的静态时序分析。ICC II与PrimeTime的深度集成让这个过程更加高效。我通常会关注这些关键参数:
tcl复制set_host_options -target PrimeTime \
-submit_common {/lsf/bin/bsub -R "rusage[mem=30G]"}
set_pt_options -pt_exec /apps/pt_2019.12-SP4/bin/pt_shell
这段配置告诉ICC II使用30GB内存运行PrimeTime引擎。实际项目中,内存配置要根据设计规模调整——我曾遇到一个7nm设计因为内存不足导致分析中断,后来将内存提升到64GB才解决问题。
ECO Fusion是ICC II的杀手锏功能,它把PrimeTime的时序分析、StarRC的参数提取和ICC II的物理实现无缝衔接。相比传统的手动流程,它能将ECO迭代周期缩短50%以上。下面是一个典型的使用示例:
tcl复制eco_opt -types "setup hold" -pba_mode path -physical_mode open_site
这个命令会同时优化setup和hold违例,采用基于路径的分析方法(PBA),并允许工具利用空白site放置新增单元。
遇到时序违例时,新手常犯的错误是直接看最差的路径。我的经验是:先看违例的分布情况。如果违例集中在某个区域,可能是局部拥塞导致;如果分散在各处,则可能是约束设置有问题。
在ICC II中,我习惯用这个命令生成更详细的时序报告:
tcl复制check_pt_qor -pba_mode path
它比标准的report_timing提供更多诊断信息,特别是会标注出时序路径上的关键节点。有次我们发现一个违例路径经过了一个本不该使用的低驱动强度buffer,原来是逻辑综合时设置了错误的驱动强度约束。
DRC检查最耗时的环节通常是金属层验证。我推荐采用分层渐进式检查策略:
tcl复制signoff_check_drc -select_layers {M1 VIA1 M2 VIA2 M3}
先检查底层金属,修复后再逐步向上。这样比一次性检查所有层效率更高。在28nm项目中,这种方法帮我们节省了约40%的DRC检查时间。
IC Validator(ICV)是业界公认的DRC检查利器。它的runset文件配置很关键,特别是当工艺厂提供的tech file与runset层名不一致时:
tcl复制set_app_options -list {signoff.physical.layer_map_file "filename"}
对于常见的间距违例,ICC II的自动修复功能很实用:
tcl复制set_app_options -list {signoff.fix_drc.init_drc_error_db "signoff_check_drc_run"}
signoff_fix_drc
但要注意,自动修复可能会引入新的时序问题。我的做法是:修复后立即跑一次快速时序检查,确保没有倒退。有次金属填充导致相邻信号线耦合电容增加,差点酿成hold时间违例,幸亏及时发现。
Pre-tapeout ECO允许修改包括poly在内的所有层,灵活性较高。核心步骤是网表比对:
tcl复制eco_netlist -by_verilog_file ECO_netlist.v -write_changes ECO_changes.tcl
这个命令会生成一个包含所有逻辑变更的TCL脚本。我强烈建议在应用变更前人工审核这个脚本,特别是注意它是否正确处理了特殊网络如时钟和复位信号。
ECO单元的放置有三个主要模式:
tcl复制place_eco_cells -eco_changed_cells -legalize_mode minimum_physical_impact
在大多数情况下,我选择minimum_physical_impact模式。它能在控制改动范围的同时,提供足够的布局灵活性。
Freeze-silicon模式下,poly层已经固定,所有逻辑变更都依赖预先放置的spare cells。这就要求在前期布局时做好规划:
tcl复制set_app_options -list {design.eco_freeze_silicon_mode true}
spare cells的分布密度很有讲究。我的经验法则是:在时序关键区域放置更多spare cells,通常占总单元数的3-5%。太少可能导致ECO无法实施,太多则会影响常规布局。
在freeze-silicon模式下,首先要做可行性分析:
tcl复制check_freeze_silicon
这个命令会检查新的逻辑是否能用现有spare cells实现。如果失败,可能需要简化逻辑变更或回tapeout前ECO。
实施阶段有两种方式:
tcl复制place_freeze_silicon # 自动
map_freeze_silicon # 手动
对于复杂变更,我通常先让工具自动尝试,再手动微调关键路径上的单元映射。
金属填充对芯片可制造性至关重要,但处理不当会影响时序。我的经验是:
tcl复制signoff_create_metal_fill -timing_preserve_setup_slack_threshold 0.05
设置适当的slack阈值很关键。太宽松会导致填充不足,太严格则可能引入违例。在7nm项目中,我们通常使用0.03-0.05ns的阈值。
当金属填充导致时序违例时,标准的处理流程是:
这个循环可能需要重复几次。有次在16nm项目中,我们反复了5次才找到理想的填充方案。
芯片设计的最后1%阶段考验的是工程师的耐心和细致。每个ECO都要谨慎评估,因为任何改动都可能引发连锁反应。我习惯在每次ECO后都做完整的signoff检查,虽然耗时,但能避免很多潜在风险。