文件:signoff_worstcase.gsr(GSR 模板)、signoff_worstcase.run_dynamic.tcl(配套 TCL)。
角组合:TEMPERATURE 125 + rcmax.tech + <TOP>_max.spef + min.vcd(实测压降最大的自洽可达组合)。
一、为什么是这个组合(实测,同窗口 139914000 ps)
| 组合 | 最坏压降 | 说明 |
|---|
| min.vcd + rcmax + max.spef | 542.05 mV (30.11%) | 本模板:最坏波形 + 最大网格 R |
| max.vcd + rcmax + max.spef | 494.82 mV (27.49%) | 标准 max 角场景 |
| min.vcd + rcmax + min.spef | ~525.8 mV | 换 spef 的影响 7~11% |
| min.vcd + rcmin + min.spef | 83.13 mV (4.62%) | 本 PDK rcmin 方阻低于铜 → 严重低估,不可签核 |
三条支撑结论:
网格 R(tech file)是头号变量:tech rcmax→rcmin 使压降变 6.8 倍(方阻差 9~12 倍)。spef 只覆盖信号网。
min.vcd 比 max.vcd 更坏 +5~10%(固定角、固定窗口),尽管其窗内平均功耗低 9%。
max.spef 比 min.spef 更坏 7~11%。
二、复用步骤(新项目)
把 signoff_worstcase.gsr 与 run_dynamic.tcl 拷到新项目的 run 目录,改名成 <TOP>.gsr / run_dynamic.tcl。
替换 GSR 里的 <...> 占位符(TECHFILE LEF DEF LIB PAD STA_FILE APL CELL_RC_FILE FRONT_PATH FREQ VDD_VOLT)。
确认三个角文件指向同一角族:rcmax.tech + max.spef + min.vcd。不要只换其中一个。
跑第一轮(自动选窗):redhawk -b run_dynamic.tcl,然后读窗口:
L=$(ls -t adsRpt/Log/redhawk.log.* | head -1)
grep -nE "Selection resolution|Time span selected|Sim Start Time|Sim End Time|Recommended dynamic" $L
sed -n '1,12p' adsRpt/worst_power_cycle.rpt
grep -E "PWR-330|ANL-013|GEN-010" $L
要复现/做方案对比时,在 VCD_FILE 里加 START_TIME <ps> 把窗口钉死(此时 SELECT_RANGE 失效、
cycle selection 跳过),并把 DYNAMIC_SIMULATION_TIME 保持成同一个宽度。
读结果:
grep -A9 "Worst Dynamic Voltage Drop:" $L | tail -8
cat adsRpt/Dynamic/layer_drop.rpt
grep -E "<inst>" adsRpt/Dynamic/<TOP>.dvd
"IR drop X%" = (ideal_VDD − min_pg_tw) / ideal_VDD(.dvd 列:loc_x loc_y eff_Vdd max_pg_tw
min_pg_tw min_pg_sim max_pg_sim min_vdd_tw max_vss_tw domain inst_name)。
三、必须知道的坑
DYNAMIC_SIMULATION_TIME 是窗口宽度(秒,单值)。写两个数 = 第二个当宽度,超范围立即 PWR-330。
START_TIME 是钉窗开关;随便改窗宽会换窗,跨方案比较前一定钉窗(否则差异 ±30~40% 全来自窗口)。
rhtech 不校验语法:生成的 .tech 坏了也报 "Successfully generated",RedHawk 导入时才 GEN-010。
换 tech 后先与一份已知可用的 .tech 做结构 diff,再跑。
高温角:若 nldm lib 的 nom_temperature 不在 125 附近会报 ERROR(SLB-121),属温度外插提示(非致命),
报告里注明即可。
四、敏感度阶梯(优先级排序,实测)
tech 网格 R ≈6 倍 ≫ 窗口/场景选择 ±30~40% > VCD 选择 +5~10% ≈ spef 角 7~11% > SDC 频率 ≈0
所以:先确认 tech 的 R 是否可信(含 PDK 的 min-R 角是否低于铜),再谈波形和窗口,最后才谈 SDC。
五、gsr模板
#############################################################
# <TOP>.gsr —— RedHawk 动态 IR drop「最坏情形」模板
#
# 角组合: TEMPERATURE 125 + rcmax.tech + <TOP>_max.spef + min.vcd
# 用途:把最大压降筛出来(最大网格 R + 最高温 + 最坏翻转场景)
# 这是「悲观界」,不是标准角对;标准角对见文末 CORNER SWAPS
#
# 实测依据(同一钉死窗口 139914000 ps):
# min.vcd + rcmax + max.spef → 542.05 mV (30.11%) ← 本模板
# max.vcd + rcmax + max.spef → 494.82 mV (27.49%)
# max.vcd + rcmax + min.spef → ~525.8 mV;spef 角贡献 7~11%
# tech 从 rcmax 换 rcmin(方阻差 9~12 倍)→ 566.74 mV 掉到 83.13 mV(6.8 倍)
#
# 替换规则:尖括号 <...> 处换成项目实际值;本文件所有注释请保留,
# 它们记录了每行为何这样写(都是实测踩过的坑)。
#############################################################
TEMPERATURE 125 # 高温 → 金属 R 变大 → IR 压降最坏(本 PDK R 温度系数 Coeff_RT1 > 0)
# 注意:若 nldm lib 的 nom_temperature 不在 125 附近,会报
# ERROR(SLB-121) nom_temperature ... out of range;那是温度外插提示,
# 不是致命错,但要在报告里注明。
#############################################################
# 1) 文件指针
#############################################################
# 网格 R 完全由 tech file 决定(spef 只覆盖信号网)→ 这是压降的头号变量(实测 6 倍量级)
TECH_FILE <RUN_DIR>/rhtech/<TECHFILE> # 例: .../rhtech/rcmax.tech
# 注:占位符在注释里也会被替换,注释示例请写具体值
LEF_FILES {
<PDK>/lef_techfiles/tech/<tech>.lef
<PDK>/lef/<stdcell>.lef
}
DEF_FILES {
<RUN_DIR>/data/<TOP>.def top
}
LIB_FILES {
<PDK>/lib/nldm_lib/<stdcell>_<corner>_nldm.lib
}
PAD_FILES {
<RUN_DIR>/data/<TOP>.ploc
}
# ATE/pt2timing 生成的时序文件(含 CLOCK 定义、时序窗口、slew)
STA_FILE {
<BLOCK> <RUN_DIR>/data/<TOP>.timing.gz
}
# APL 表征文件(cell current / decap / pwcap)
APL_FILES {
<RUN_DIR>/../stdcell.current current
<RUN_DIR>/../stdcell.cdev cdev
<RUN_DIR>/../stdcell.pwcdev pwcap
}
# 信号网 RC:用 max.spef(实测比 min.spef 悲观 7~11%)
CELL_RC_FILE {
<TOP> <RUN_DIR>/data/<TOP>_max.spef
}
#############################################################
# 2) 必填参数
#############################################################
VDD_NETS {
VDD <VDD_VOLT>
}
GND_NETS {
VSS 0
}
# 默认工作频率:只作用于「无法从 STA 推出时钟」的实例;
# 主频率来源是 STA_FILE 里的 CLOCK 定义(例:CK200M = 4.140 ns = 241.5 MHz)
FREQ <FALLBACK_FREQ>
#############################################################
# 3) 动态仿真窗口(最容易踩坑的一处)
#############################################################
# DYNAMIC_SIMULATION_TIME = 窗口【宽度】(秒),在此 cycle-selection 流程里只能写一个值!
# * 写两个数时,第二个数被当成宽度:一旦超过 VCD 活动区长度 →
# ERROR(PWR-330) «larger than select range» + ERROR(ANL-013),dynamic 不执行
# * 起步建议 2~4 个最慢时钟周期:241.5 MHz(4.14 ns) → 12e-9 ~ 30e-9
# * 跑一次看日志里的 "Recommended dynamic simulation time, <N>psec" 再定
# * 窗口越长瞬态越久(20 ps 步长:30 ns ≈ 23 s;1.35 µs ≈ 20 min)
DYNAMIC_SIMULATION_TIME 30e-9
DYNAMIC_TIME_STEP 20ps # 默认 10ps;>30ps 不推荐;20ps 为 sign-off 常用
#DYNAMIC_PRESIM_TIME 10n # 不设时自动取 3.5~40 ns(日志会打印 Presim is determined to be ...)
DYNAMIC_EM 0
AD_MODE 0
#############################################################
# 4) VCD —— 选最坏周期 / 钉死窗口
#############################################################
# 首轮:让工具自己选最坏窗(SELECT_RANGE + SELECT_TYPE)
VCD_FILE {
<TOP> min.vcd # 与本角配套的波形;本项目实测 min.vcd 场景比 max.vcd 更坏(+9.5%)
FILE_TYPE VCD
FRONT_PATH "<TB_HIER>" # VCD 里的层次前缀(例 "tb/dut/Ilv/Idig_top/")
SELECT_RANGE -1 -1 # -1 -1 = 全 VCD 参与 cycle selection
SELECT_TYPE WORST_POWER_CYCLE # 关心 di/dt 时改 WORST_DPDT_CYCLE
# (它是 SELECT_TYPE 的取值,不是独立 GSR 关键字)
TRUE_TIME 1 # 1 = 用 VCD 的真实翻转时刻(不要用 STA 反标)
STA_VCD_FREQ_RATIO 1 # = STA_freq / VCD_freq;=1 表示不做压缩
#CYCLE_SELECTION_GRID_SIZE 3000ps # 滑窗步长;默认 = 1/STA 最高频率(333.33 MHz → 3000 ps)
#POWER_CYCLE_SELECT_MODE 1 # 19.0.3 已废弃:日志会提示 "obsolete now",无需设置
#START_TIME <ps> # 钉死窗口:设了它 SELECT_RANGE 失效、跳过 cycle selection,
# 窗口 = START_TIME + DYNAMIC_SIMULATION_TIME
# 做多方案对比/复现时必须用它(否则每次挑的窗不同,±30~40% 全来自窗口)
}
#############################################################
# 5) 杂项
#############################################################
TOGGLE_RATE 0.3
INPUT_TRANSITION 200ps
IGNORE_CELLS {
FILLER1AS9
FILLER2AS9
FILLER3AS9
FILLER4AS9
FILLER8AS9
FILLER16AS9
FILLER32AS9
}
#############################################################################
# CORNER SWAPS —— 其它用途怎么配(tech / spef / VCD 三个必须同一角,只换一个=混合角)
#
# 目的 TEMP TECH CELL_RC_FILE VCD 备注
# 最坏动态 IR(本模板) 125 rcmax max.spef min.vcd 悲观界,做筛查/签核上限
# 标准 max 角场景 125 rcmax max.spef max.vcd 自洽的 max 角对
# 标准 min 角场景 125 rcmin min.spef min.vcd 本 PDK rcmin 方阻低于铜(ρ<1.68 µΩ·cm)
# → 会严重低估,别当签核值
# di/dt 敏感筛查 125 rcmax max.spef min.vcd + SELECT_TYPE WORST_DPDT_CYCLE
#
# 实测敏感度(最坏压降口径,VCD 驱动):
# tech(网格 R) ≈ 6 倍 ≫ 窗口/场景选择 ±30~40% > VCD 选择 +5~10% ≈ spef 角 7~11% > SDC 频率 ≈ 0
#
# 还要记住:片外模型在 TCL 里给(setup package/wirebond/pad 的 R/C/L);
# 全 0 = 理想片外 = 没有 Ldi/dt,频率/di/dt 敏感性被抹掉。
#############################################################################
六、run.tcl模板
# =============================================================================
# run_dynamic.tcl —— RedHawk 动态 IR drop(VCD 驱动)最坏情形模板
#
# 用法(远端 Linux,无 DISPLAY 时必须用 -b;-f 是 GUI 模式,会直接退出):
# module load redhawk/2019
# redhawk -b run_dynamic.tcl
#
# ⚠ 判定一次运行是否有效:redhawk 的退出码永远是 0!
# 只看 adsRpt/Error/redhawk.err.<时间戳> 与日志里的
# PWR-330 / ANL-013 / GEN-010 / WARNING 计数。
# =============================================================================
# 导入 GSR(角组合见 GSR 模板:TEMPERATURE 125 + rcmax + max.spef + min.vcd)
import gsr <TOP>.gsr
setup design
setup analysis_mode dynamic
# ---------------------------------------------------------------------------
# 1) 功耗计算 + 关键周期选择
# 产出 adsRpt/worst_power_cycle.rpt、adsRpt/worst_dpdt_cycle.rpt、
# adsRpt/power_summary.rpt,并打印 "Recommended dynamic simulation time"
# ---------------------------------------------------------------------------
perform pwrcalc
# ---------------------------------------------------------------------------
# 2) 电源地网抽取(网格 R 由 GSR 的 TECH_FILE 决定 —— 压降的头号变量)
# ---------------------------------------------------------------------------
perform extraction -power -ground -c
# ---------------------------------------------------------------------------
# 3) 片外模型:R in Ohm, C in pF, L in pH;全 0 = 理想片外(无 Ldi/dt)
# 签核评估封装/凸点影响时必须填真实值,否则频率/di/dt 敏感性被抹掉
# ---------------------------------------------------------------------------
setup package -power -r 0 -c 0 -l 0
setup package -ground -r 0 -c 0 -l 0
setup wirebond -power -r 0 -c 0 -l 0
setup wirebond -ground -r 0 -c 0 -l 0
setup pad -power -r 0 -c 0
setup pad -ground -r 0 -c 0
# ---------------------------------------------------------------------------
# 4) 动态仿真
# GSR 里有 VCD_FILE 时用 -vcd(真实翻转时刻);
# -vectorless 只让 VCD 供平均功耗,翻转由 vectorless 生成(做交叉验证时可用)
# ---------------------------------------------------------------------------
perform analysis -vcd
#perform analysis -vectorless # ← 只在做交叉验证/无波形时启用
# ---------------------------------------------------------------------------
# 5) 可选:Explorer 报告库 / 导出 DB
# ⚠ 这两条会覆盖 adsRpt/ 与 *_dynamic.db;要留证据请先把结果快照到 compare/<tag>/
# ---------------------------------------------------------------------------
#explore design
export db <TOP>_dynamic.db