• 正文
  • 相关推荐
申请入驻 产业图谱

多电压域静态时序分析综述

09/14 08:51
199
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

一、概述

在现代复杂SoC(系统级芯片)设计中,为了在极低功耗和高性能之间取得平衡,通常会采用多电压域设计。这种设计虽然有效降低了功耗,但也使得静态时序分析(STA)的复杂度呈指数级上升。多电压域STA的核心挑战在于跨电压域路径的时序收敛。

跨电压域路径(Cross-Voltage Paths):在多电压设计中,时序路径可能跨越不同的供电网络。由于不同电压域下的单元延迟和信号翻转时间(Slew)差异显著,必须对所有可能的电压组合进行穷尽分析,以确保在最坏情况下识别出所有关键路径。

电压波动与IR Drop:在深亚微米工艺下,即使是很小的局部电源压降(IR Drop)也会显著增加门延迟。例如,当电源电压允许有12.5%的波动时,CMOS门延迟可能增加高达2.4倍。

保持时间(Hold Time)违例风险:传统的保持时间分析通常假设高电压(快工艺)条件,但在多电压域中,低电压下的保持时间违例风险极高。若处理不当,往往需要插入大量缓冲器(Buffer)来修复,这会反过来恶化高电压下的性能并增加芯片面积。

多模式多角(MCMM)分析策略:为了应对多电压带来的不确定性,STA必须进行多模式多角(Multi-Corner Multi-Mode, MCMM)分析。Setup(建立时间)检查通常在Worst Case(慢工艺、高温、低压)下进行,以确保数据在时钟沿到来前能稳定到达。Hold(保持时间)检查通常在Best Case(快工艺、低温、高压)下进行。但在多电压域中,需要特别关注跨电压域路径在特定低压Corner下的Hold违例情况。

同步多电压感知分析(SMVA):这是一种高级分析方法,能够在单次运行中分析所有跨域路径在各种电压组合下的时序,无需额外添加悲观裕量(Margin),从而大幅缩短分析周转时间。

SDC约束与实操注意事项在进行多电压域STA时,SDC(Synopsys Design Constraints)文件的编写至关重要。定义工作条件:必须通过 set_operating_conditions 命令明确定义Max/Min库及分析类型。对于先进工艺,还需考虑PVT的联合变化。

跨电压域路径处理:跨电压域的路径必须单独设置 operating condition。如果路径经过隔离单元(Isolation Cell),通常需要设置为 false_path;如果经过电平转换器(Level Shifter),必须将其延迟准确计入IO delay中。

分层签核(Hierarchical Signoff):对于大型SoC,建议先进行模块级(Block-level)的时序签核与优化,然后再进行顶层(Top-level)的集成签核,以降低整体复杂度。

协同验证:多电压域STA不能孤立进行,必须融入功耗约束(如时钟门控)、信号完整性(SI)以及IR Drop分析,确保全芯片的可靠性。

业界前沿与AI辅助:随着工艺节点进入纳米级,传统的确定性STA面临瓶颈。目前业界正在引入机器学习(ML)和图神经网络(GNN)等AI技术。例如,基于路径阶段二元组(Bigrams)的机器学习模型,能够以极高的准确率(如~97%)预测跨电压路径的时序裕量偏差(Slack Divergence),从而在MCMM分析中大幅降低计算耗时。

二、同步多电压感知分析

SMVA(同步多电压感知分析)是Synopsys PrimeTime核心时序分析技术,源自TAU 2021官方论文,专为多电压域、DVFS芯片设计而生,彻底解决传统STA多电压场景指数级爆炸的核心痛点,是先进工艺低功耗SoC签核的关键技术。

传统STA将工艺、温度、电压全部封装在Corner二维分析空间中,多电压域设计需枚举所有电压组合。若芯片存在M个电压域、每个域N档电压,场景数量为N的M次方,呈指数级增长。所有场景独立运行,重复读取网表、SPEF、约束文件,反复计算单元延时与时序传播,不仅占用海量算力,受资源限制还会导致场景覆盖不全,存在时序漏检风险。

SMVA颠覆性重构时序分析架构,将电压独立为第三维分析维度,构建Mode+PT Corner+DVFS电压的三维分析体系。该架构实现前端数据全局共享,网表、寄生参数、约束仅需读取一次,仅在延时计算和时序传播阶段区分不同电压配置,从根源消除大量冗余运算。同时SMVA引入相关电压依赖机制,同电源域单元电压变化同步关联,跨域路径按电压组合精准计算,将整体运算复杂度从指数级降为准线性级,仅少量跨域路径存在极低开销。

基于TAU2021算力公式可精准估算SMVA运行耗时,整体耗时由单电压基础耗时、各电压域加权耗时和跨域路径开销组成。实测数据显示,3电压域设计中,传统方法需6个独立场景运行,SMVA单次运行即可全覆盖,算力节省超60%。工业实测表明,SMVA具备亚线性性能增益,16组电压配置运行耗时仅为单场景的1.9倍,远优于传统16倍耗时;千万门级大设计搭配串扰分析时,全覆盖电压场景的总耗时仅为传统单场景的1.5倍,场景缩减倍数最高可达224倍,算力和内存利用率大幅提升。

SMVA正常工作依赖 define_scaling_lib_group 核心配置,要求同组库仅电压参数不同,工艺、温度、器件类型完全统一,需将标准单元、电平转换器、存储器库分组定义。工具依托库组电压点构建延时插值曲线,实现任意工作电压的精准延时计算,仅电压区间外推场景精度会下降,签核优先采用原厂精准电压库,规避插值误差。

在工程落地中存在诸多高频坑点:UPF模式下常规电压属性无法核查单元实际供电电压,需通过 report_delay_calculation 确认单元绑定的电压库(没读upf时power_rail_voltage_max属性可用);库组电压点间距过大会导致插值失真,低压域电平转换器未纳入库组会造成延时缩放失效。同时,需单独分组跨电压域路径,精准定位SMVA少量高开销路径,提升时序调试效率。

在工具协同层面,SMVA与Mode Merging、DMSA、AOCV、IR-aware STA等技术正交兼容,可叠加使用。其与DVFS精准适配,区分静态多电压切换和电压频率联动场景,全面覆盖低功耗设计的各类工作模式。作为多电压域STA签核的核心技术,SMVA兼顾全场景覆盖、高精度和低算力开销,是现代多电压SoC时序收敛与可靠签核的基础保障。

三、SMVA脚本样例

此样例由AI工具给出,仅供参考。

下面给出一套 Synopsys PrimeTime SMVA(Simultaneous Multi-Voltage Aware,同步多电压感知)分析 的环境脚本模板。SMVA 是 PrimeTime 的 graph-based 多电压分析流程:在一次运行中同时考虑设计中所有路径的各电源电压组合,避免传统流程对跨电压域路径人为加 margin 带来的悲观或遗漏 。

1. 运行shell脚本(run_smva.csh)

#!/bin/csh -f
#============================================================
# SMVA signoff run wrapper
#============================================================
setenv SNPSLMD_QUEUE TRUE
setenv PATH "/tools/synopsys/ptsuite/V-2023.12/bin:$PATH"

set DESIGN = "soc_top"
set CORNER = "ss" # ss / tt / ff
set RC_CORNER= "cworst"
set RUN_DIR = "run_smva_${CORNER}_${RC_CORNER}"
mkdir -p $RUN_DIR && cd $RUN_DIR

# 日志
set LOG = "pt_smva_${DESIGN}.log"

pt_shell -f ../scripts/smva_setup.tcl
-output_log_file $LOG
| tee -i pt_stdout.log

2. 主环境脚本(smva_setup.tcl)

#============================================================
# PrimeTime SMVA (Simultaneous Multi-Voltage Aware) setup
# 流程要点:
# 1) 使能跨电压域分析并选择 SMVA 模式
# 2) define_scaling_lib_group 提供各电压点库
# 3) UPF 描述电源意图(或用 PG netlist 替代)
# 4) set_voltage_levels / set_voltage 定义各电压域的电压点
# 5) (可选)configure_dvfs_scenarios 配置 DVFS 场景
#==========================================================

set sh_enable_page_mode false
set sh_script_stop_severity none

# ---------------- 0. 基本路径 ----------------
set search_path [concat $search_path
/libs/std_cell/$CORNER
/libs/io
/data/netlist
/data/upf
/data/spef ]

# ---------------- 1. 使能 SMVA ----------------
# 总开关:true 时启用跨电压域/多电压分析
set timing_enable_cross_voltage_domain_analysis true
# 分析模式(默认值即 full):
# full : 域内 + 跨域路径,在所有相关电压组合下并发分析
# only_crossing : 只对跨电压域路径计算 slack
# exclude_crossing: 只对域内路径计算 slack
# capture_reduced_model / legacy : 缩减/旧式流程
set timing_cross_voltage_domain_analysis_mode full

# ---------------- 2. 读入网表并链接 ----------------
read_verilog $DESIGN.v
# 多电压设计建议直接使用 PG netlist(含电源引脚连接),可省去 UPF
# read_verilog $DESIGN.pg.v
link_design $DESIGN

# ---------------- 3. 定义 scaling 库组 ----------------
# SMVA 需要目标电压点上的 characterization 库;
# 每个电压域一组,支持 -exact_match_only(只许精确电压匹配)
define_scaling_lib_group -name SLG_CPU {
std_ss_0p72v_125c.db
std_ss_0p80v_125c.db
std_ss_0p88v_125c.db }
define_scaling_lib_group -name SLG_GPU {
std_ss_0p60v_125c.db
std_ss_0p72v_125c.db }
define_scaling_lib_group -name SLG_SOC {
std_ss_0p80v_125c.db
std_ss_0p90v_125c.db }

# ---------------- 4. 电源意图 ----------------
# 方式一:读 UPF
load_upf /data/upf/${DESIGN}.upf
# 方式二(推荐):PG netlist + set_voltage 即可

# ---------------- 5. 电压域与电压点 ----------------
# 查询电压域/电源组
get_supply_groups -quiet
get_supply_nets -quiet

# 每个电压域声明参与分析的电压等级(SMVA 对每个域支持任意多个电压点,
# legacy 模式仅限每域两个电压点)
set_voltage_levels -levels {0.72 0.80 0.88} [get_supply_groups VDD_CPU]
set_voltage_levels -levels {0.60 0.72} [get_supply_groups VDD_GPU]
set_voltage_levels -levels {0.80 0.90} [get_supply_groups VDD_SOC]

# 设置名义电压(min/max)
set_voltage 0.80 -min 0.72 -max 0.88
-object_list [get_supply_nets VDD_CPU]
set_voltage 0.60 -min 0.60 -max 0.72
-object_list [get_supply_nets VDD_GPU]
set_voltage 0.90 -min 0.80 -max 0.90
-object_list [get_supply_nets VDD_SOC]

# ---------------- 6. 寄生、OCV、约束 ----------------
read_parasitics -keep_capacitive_coupling
/data/spef/${DESIGN}.${RC_CORNER}.spef

# AOCV / POCV / 普通 derate 照常使用
set_timing_derate -early 0.97 -late 1.03

read_sdc /constraints/${DESIGN}_func.sdc

# ---------------- 7.(可选)DVFS 场景 ----------------
# DVFS 场景是 SMVA 内部的电压/频率场景,与 DMSA 的 scenario 无关;
# 可把不同时钟频率等约束绑定到不同电压配置上
# configure_dvfs_scenarios ... ;# 定义电压/频率组合
# get_dvfs_scenarios ;# 查询
# create_clock ... -dvfs_scenarios [get_dvfs_scenarios perf]
# set_clock_latency ... -dvfs_scenarios ...

# ---------------- 8. 分析与报告 ----------------
update_timing -full

# 常规报告:SMVA 会自动覆盖所有相关电压组合
report_timing -delay_type max -max_paths 50
-slack_lesser_than 0.0 -path_type full_clock_expanded
-input_pins -nets > rpt/smva_worst_max.rpt

# 关注跨电压域路径
report_timing -delay_type max -max_paths 100
-slack_lesser_than 0.2
-filter "cross_voltage_domains == true"
> rpt/smva_cross_domain_max.rpt ;# 属性名以本版本 man 为准

report_constraints -all_violators > rpt/smva_all_viol.rpt
report_clock_timing -type summary >> rpt/smva_clock_summary.rpt

# 保存会话,便于后续 ECO / 增量分析
save_session smva_session
```

若库只有单一电压点、无 voltage scaling 数据,可用 `set_cross_voltage_domain_analysis_guardband` 加 derating 做降级分析。

- 跨电压域路径过滤用的对象属性名(如 `cross_voltage_domains`)各版本略有差异,建议用 `list_attributes -application timing` 核对。

四、DMSA➕SMVA混合脚本样例

此样例由AI工具给出,仅供参考。

DMSA master
├── scenario: ss_cworst ──► 完整 SMVA(VDD_CPU 3 档 × VDD_GPU 2 档 × VDD_SOC 2 档 = 12 组合)
├── scenario: ss_rcworst ──► 完整 SMVA
├── scenario: tt_typ ──► 完整 SMVA
└── scenario: ff_cbest ──► 完整 SMVA

即 外层 DMSA 扫 PVT/寄生 corner,内层 SMVA 扫各 corner 下的多电压组合,最终由 master 汇总各 scenario 的 worst slack。

1. 目录结构

dmsa_smva/
├── run_dmsa.csh # 启动脚本
└── scripts/
├── master.tcl # DMSA 主控
├── common_setup.tcl # 公共数据(网表/UPF)
└── corner_def.tcl # corner 定义表

2. 启动脚本(run_dmsa.csh)

#!/bin/csh -f
setenv SNPSLMD_QUEUE TRUE
setenv PATH "/tools/synopsys/ptsuite/V-2023.12/bin:$PATH"

set RUN_DIR = "dmsa_smva_run"
mkdir -p $RUN_DIR && cd $RUN_DIR

# -multi_scenario 进入 DMSA 模式
pt_shell -multi_scenario
-f ../scripts/master.tcl
-output_log_file dmsa_master.log

3. corner 定义表(scripts/corner_def.tcl)

把每个 scenario 的差异参数集中管理,新增 corner 只需加一行:

#------------------------------------------------------------
# corner 名称 | 温度 | scaling 库组电压点 | SPEF | SDC
#------------------------------------------------------------
array set CORNER_TABLE {
ss_cworst { temp 125
libs {std_ss_0p72v_125c.db std_ss_0p80v_125c.db std_ss_0p88v_125c.db}
vol_cpu {0.72 0.80 0.88} nom_cpu 0.80
vol_gpu {0.60 0.72} nom_gpu 0.60
spef soc_top.cworst.spef
sdc soc_top_func.sdc }
ss_rcworst { temp 125
libs {std_ss_0p72v_125c.db std_ss_0p80v_125c.db std_ss_0p88v_125c.db}
vol_cpu {0.72 0.80 0.88} nom_cpu 0.80
vol_gpu {0.60 0.72} nom_gpu 0.72
spef soc_top.rcworst.spef
sdc soc_top_func.sdc }
tt_typ { temp 25 ... }
ff_cbest { temp -40 ... }
}

4. DMSA 主控脚本(scripts/master.tcl)

#============================================================
# DMSA + SMVA master script
#============================================================
set sh_enable_page_mode false

# ---------------- DMSA 全局设置 ----------------
set_app_var multi_scenario_enable_analysis true
set_app_var multi_scenario_working_directory ./ms_work
# set_app_var multi_scenario_license_mode ... ;# 视 license 策略

# 计算资源:每服务器 8 核、共 4 进程(视机器情况)
set_host_options -name farm -max_cores 8 -num_processes 4
start_servers ;# 部分版本为 start_hosts,以 man 为准

# ---------------- 公共数据:master 读一次,scenario 共享 ----------------
source scripts/corner_def.tcl

set search_path [concat $search_path /data/netlist /data/upf]
read_verilog /data/netlist/soc_top.pg.v
link_design soc_top
load_upf /data/upf/soc_top.upf

# ---------------- 创建 scenarios ----------------
foreach corner [array names CORNER_TABLE] {
create_scenario -name $corner
}
puts "Created scenarios: [all_scenarios]"

# ---------------- 每个 scenario 内执行完整 SMVA 设置 ----------------
foreach corner [array names CORNER_TABLE] {
current_scenario $corner

# SMVA 开关(每 scenario 独立进程,需各自设置)
set timing_enable_cross_voltage_domain_analysis true
set timing_cross_voltage_domain_analysis_mode full

# scaling 库组
set libs [dict get [set CORNER_TABLE($corner)] libs] ;# 简化示意
define_scaling_lib_group -name SLG_CPU $libs
define_scaling_lib_group -name SLG_GPU $libs

# 电压点
set_voltage_levels -levels [dict get [set CORNER_TABLE($corner)] vol_cpu]
[get_supply_groups VDD_CPU]
set_voltage_levels -levels [dict get [set CORNER_TABLE($corner)] vol_gpu]
[get_supply_groups VDD_GPU]
set_voltage [dict get [set CORNER_TABLE($corner)] nom_cpu]
-object_list [get_supply_nets VDD_CPU]
set_voltage [dict get [set CORNER_TABLE($corner)] nom_gpu]
-object_list [get_supply_nets VDD_GPU]

# 寄生 / 约束
read_parasitics -keep_capacitive_coupling
/data/spef/[dict get [set CORNER_TABLE($corner)] spef]
read_sdc /constraints/[dict get [set CORNER_TABLE($corner)] sdc]
}

# ---------------- 分布式更新时序 ----------------
remote_execute -scenarios [all_scenarios] { update_timing -full }

# ---------------- 汇总报告 ----------------
# 跨 scenario 的 worst slack 对比(每行标注 scenario 名)
report_multi_scenario_slack -slacks_from_all_scenarios
> rpt/merged_worst_slack.rpt

# 跨电压域路径的跨 scenario 汇总
foreach corner [all_scenarios] {
current_scenario $corner
report_timing -delay_type max -max_paths 50 -slack_lesser_than 0
> rpt/smva_${corner}_worst.rpt
save_session sessions/${corner}_smva
}

说明:`current_scenario` 之后的命令自动分发到对应 slave 进程执行`remote_execute` 用于把同一段命令广播到多个 scenario。

如果 scenario 不多(≤4)或机器内存吃紧,也可以顺序串行跑:一个循环脚本内对不同 corner 分别启动独立 `pt_shell`(每个内部都是完整 SMVA),最后用文本工具合并 worst slack 表。这种"伪 DMSA"没有分布式 license 开销,调试也更方便,适合 corner 数少的项目。

相关推荐

与非网2022影响力创作者TOP2,与非网2023最佳创作者TOP10,与非网2024年度创作者。

微信公众号