3. Voltus环境与数据准备

Voltus 的 IR/EM 分析结果是否可信,几乎在“读入数据”这一步就已经决定了大半。Voltus 本身并不产生设计数据,它只是把一套彼此一致的输入“拼装”成一个可求解的电源网络模型:工艺库提供电阻/电容/电流的物理含义,网表提供连接关系,寄生参数提供真实的 RC 网络,功耗文件提供每个实例的电流激励,电源意图文件提供供电网络的定义。任何一类数据缺失、版本错配或格式不符,都会在 log 中表现为 warning 甚至 error,最终反映为压降分布异常或收敛困难。

四类核心输入及其作用

可以把 Voltus 的输入理解为四个互相咬合的层次:

  • 工艺库(Tech / QRC / Cell Liberty):定义金属层、通孔、单位方块电阻、层间电容、电流密度限值(EM limit),以及标准单元的时序与功耗信息。Voltus 依赖这些数据把几何尺寸换算成电阻和电容。
  • 网表(Verilog / SPICE / DEF):描述实例、端口与网络的连接关系。Voltus 通常以 Verilog 网表配合 LEF/DEF 使用,DEF 提供物理位置与电源布线。
  • 寄生参数(SPEF / DSPF):给出每根网络的 RC 网络,是 IR 计算精度的关键。SPEF 中的耦合电容是否被处理、单位是否一致,直接影响结果。
  • 功耗文件(VCD / SAIF / TCF / Power Intent):提供每个实例的翻转活动或平均电流,是动态 IR 的激励来源。静态 IR 则常配合 UPF/CPF 中的电源域定义。

这四类数据必须来自同一工艺节点、同一设计版本、同一 corner。例如 7nm 工艺库配 16nm 的 SPEF,或 RTL 网表配综合后的功耗文件,都会导致模型自相矛盾。

导入流程与关键命令

Voltus 的典型导入顺序是:先建立设计库与工艺环境,再读网表与物理数据,然后读寄生与功耗,最后做一致性检查。以下是一段示意性的命令序列(参数为示例,实际以项目 corner 为准):

# 1. 设置工艺与库环境
set_db init_lib_search_path {./libs ./lef}
set_db init_hdl_search_path {./netlist}
read_libs slow.lib fast.lib
read_physical -lef {tech.lef stdcell.lef macro.lef}

# 2. 读入网表与物理数据
read_hdl -sv top.v
read_def top.def

# 3. 读入寄生参数(指定 corner 与单位)
read_spef -corner slow -units {1e-12 1e-9} top.spef

# 4. 读入功耗活动
read_activity -format vcd -scope top_tb/dut top.vcd
# 或 read_power_intent -upf top.upf

# 5. 一致性检查
check_design -type power
report_analysis_setup

其中 read_spef 的 -units 必须与 SPEF 文件头 *DESIGN 后的单位声明一致,否则 RC 会被整体缩放,压降结果可能差一个数量级。read_activity 的 -scope 必须指向 DUT 在 testbench 中的层次路径,否则活动率会全部落到顶层而无法映射到实例。

常见数据问题与排查

导入阶段最常见的问题可以归为四类,排查时建议按“先看 log、再查映射、后验数值”的顺序进行:

问题现象可能原因排查方法
大量 instance 未映射网表与 Liberty 单元名不一致,或 LEF 缺失检查 report_unmapped,核对 cell 命名前缀
SPEF 读入后 RC 为 0corner 名不匹配或单位错误查看 SPEF 头 *CORNER 与 -corner 是否一致
活动率全为默认值VCD scope 路径错误或时间窗未覆盖用 report_activity 查看覆盖率
电源网络开路/短路DEF 中 PG pin 未连接或 LEF 缺 PG 定义运行 check_design -type power

例如,当 log 中出现 Cannot find cell 'INVX1_H' in library 时,通常不是库真的缺这个单元,而是网表里用了综合后的名字,而 Liberty 里是 INVX1。此时应检查综合脚本是否做了 cell 重命名,或在 Voltus 中用 set_db hdl_cell_name_mapping 做映射。

建议在正式分析前先跑一次 report_analysis_setup,它会汇总库、网表、SPEF、活动文件的加载状态与覆盖率,是判断“数据是否齐备”的最快入口。

数据一致性检查清单

为了减少反复试错,可以在导入后逐项确认:

  1. 工艺库、LEF、SPEF、功耗文件是否来自同一工艺节点与同一 corner。
  2. 网表顶层模块名与 DEF 的 DESIGN 名是否一致。
  3. SPEF 中的 instance 名是否能在网表中找到对应层次。
  4. VCD/SAIF 的时间窗是否覆盖了关心的活动区间。
  5. 电源域定义(UPF/CPF)中的 supply net 是否与 DEF 中 PG 网络同名。

下面这张图把四类输入、导入顺序与典型问题排查路径放在一起,便于对照理解数据之间的依赖关系。

Voltus 输入数据导入与问题排查关系图 工艺库 Liberty / LEF / QRC 网表 Verilog / DEF 寄生参数 SPEF / DSPF 功耗文件 VCD / SAIF / UPF Voltus 导入与一致性检查 read_libs → read_hdl → read_def → read_spef → read_activity 映射/命名错误 cell 未映射、层次不匹配 → 检查 report_unmapped 单位/corner 错误 SPEF 单位、corner 名不一致 → 核对 *CORNER 与 -corner 活动率缺失 VCD scope 路径错误 → 用 report_activity 查覆盖率 数据一致 → 模型可信 → IR/EM 结果可复现

把这张图当作导入阶段的检查地图:四类输入各自独立,但只有在同一 corner、同一设计版本下汇聚,Voltus 才能构建出可信的电源网络模型。导入完成后,建议先看 report_analysis_setup 的覆盖率,再进入实际的 IR 分析,避免在错误的数据基础上反复调参。