动态 IR drop 「最坏情形」模板及复用说明
一份最差动态IRDrop的、可直接复用的gsr和tcl模板。

文件: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.spef542.05 mV (30.11%)本模板:最坏波形 + 最大网格 R
max.vcd + rcmax + max.spef494.82 mV (27.49%)标准 max 角场景
min.vcd + rcmax + min.spef~525.8 mV换 spef 的影响 7~11%
min.vcd + rcmin + min.spef83.13 mV (4.62%)本 PDK rcmin 方阻低于铜 → 严重低估,不可签核

三条支撑结论:

  1. 网格 R(tech file)是头号变量:tech rcmax→rcmin 使压降变 6.8 倍(方阻差 9~12 倍)。spef 只覆盖信号网。

  2. min.vcd 比 max.vcd 更坏 +5~10%(固定角、固定窗口),尽管其窗内平均功耗低 9%。

  3. max.spef 比 min.spef 更坏 7~11%。

二、复用步骤(新项目)

  1. 把 signoff_worstcase.gsr 与 run_dynamic.tcl 拷到新项目的 run 目录,改名成 <TOP>.gsr / run_dynamic.tcl。

  2. 替换 GSR 里的 <...> 占位符(TECHFILE LEF DEF LIB PAD STA_FILE APL CELL_RC_FILE FRONT_PATH FREQ VDD_VOLT)。

  3. 确认三个角文件指向同一角族:rcmax.tech + max.spef + min.vcd。不要只换其中一个。

  4. 跑第一轮(自动选窗):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      # 排名前 500,第 1 行就是被选中的窗
    grep -E "PWR-330|ANL-013|GEN-010" $L            # 必须为空

  5. 要复现/做方案对比时,在 VCD_FILE 里加 START_TIME <ps> 把窗口钉死(此时 SELECT_RANGE 失效、
    cycle selection 跳过),并把 DYNAMIC_SIMULATION_TIME 保持成同一个宽度。

  6. 读结果:

    grep -A9 "Worst Dynamic Voltage Drop:" $L | tail -8     # WIRE/avgTW/maxTW/minTW/minWC
    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
感谢阅读,更多文章点击这里:【专栏:iLoveIC】
留言(0)
还没有留言,来说两句吧。
留言需要 登录 或 注册(注册后需通过邮箱验证)。
相关文章