3. 设计导入与初始化

数字后端流程的起点不是摆放标准单元,而是把前端交付的多种设计描述“翻译”成后端工具能够理解、并且彼此一致的数据库。Cadence Innovus 的初始化阶段通常要同时吃进四类输入:门级 Verilog 网表、工艺库与 MMMC 视图、SDC 时序约束、UPF/CPF 低功耗意图。它们分别回答“电路是什么”“在什么条件下工作”“时间上要满足什么”“电源上怎么切换”四个问题。任何一类输入缺失或互相矛盾,后续的布局、时钟树综合和时序签核都会建立在错误前提上,因此初始化检查的核心不是“命令跑通”,而是“四类视图在同一个设计上自洽”。

四类输入的导入顺序与依赖关系

推荐顺序是:先读入工艺库与网表建立设计骨架,再定义 MMMC 视图,然后读入 SDC,最后导入 UPF/CPF。原因是 SDC 中的时钟、输入输出延迟需要绑定到具体视图,而 UPF 的电源域、隔离单元、电平转换器会改变网表结构,必须在时序约束之前或同步建立。若先读 SDC 再定义视图,约束可能被挂到默认视图上,后续多角分析时出现“约束找不到时钟”的报错。

一个典型的初始化脚本骨架如下,参数为教学示例,实际项目需替换为真实库名与文件名:

# 1. 建立设计与工艺库
set init_design_uniquify 1
set init_verilog "./netlist/top_syn.v"
set init_top_cell "top"
set init_lef_file "./lef/tech.lef ./lef/stdcell.lef ./lef/sram.lef"
set init_mmmc_file "./mmmc/view_definition.tcl"
set init_pwr_net "VDD"
set init_gnd_net "VSS"

# 2. 读入网表与库
init_design

# 3. 读入 SDC 与低功耗意图
read_sdc ./sdc/top_func.sdc
read_power_intent -upf ./upf/top.upf
commit_power_intent

# 4. 初始化检查
check_design -all
check_timing -verbose
check_power_intent

其中 init_mmmc_file 指向的视图定义文件是 MMMC 的核心。它把“模式(mode)”和“角(corner)”组合成分析视图。模式描述功能场景,例如功能模式、扫描测试模式、低功耗休眠模式;角描述工艺、电压、温度的组合,例如 ss_0p72v_125c、tt_0p80v_25c、ff_0p88v_m40c。一个视图就是一次“模式×角”的分析上下文。

MMMC 视图定义的实际写法

MMMC 文件通常包含库集、延迟角、约束模式和视图四部分。下面是一个简化示例,用于说明结构而非真实项目数值:

create_library_set -name lib_ss -timing {ss_0p72v_125c.lib}
create_library_set -name lib_ff -timing {ff_0p88v_m40c.lib}

create_rc_corner -name rc_worst -cap_table worst.capTbl -temperature 125
create_rc_corner -name rc_best  -cap_table best.capTbl  -temperature -40

create_delay_corner -name dc_slow -library_set lib_ss -rc_corner rc_worst
create_delay_corner -name dc_fast -library_set lib_ff -rc_corner rc_best

create_constraint_mode -name func -sdc_files {./sdc/top_func.sdc}
create_constraint_mode -name scan -sdc_files {./sdc/top_scan.sdc}

create_analysis_view -name av_func_slow -constraint_mode func -delay_corner dc_slow
create_analysis_view -name av_func_fast -constraint_mode func -delay_corner dc_fast
create_analysis_view -name av_scan_slow -constraint_mode scan -delay_corner dc_slow

set_analysis_view -setup {av_func_slow av_scan_slow} \
                  -hold {av_func_fast}

这里 set_analysis_view 指定了哪些视图参与建立时间检查、哪些参与保持时间检查。常见错误是把所有视图都塞进 setup 和 hold,导致运行时间暴涨且报告难以阅读。工程上通常 setup 用慢角、hold 用快角,扫描模式单独建视图,避免功能约束与测试约束互相污染。

设计导入与初始化:四类输入汇聚为可分析数据库 门级 Verilog 网表 top_syn.v / 实例与连接 MMMC 视图定义 mode × corner 组合 SDC 时序约束 时钟 / IO 延迟 / 例外 UPF / CPF 低功耗意图 电源域 / 隔离 / 电平转换 Innovus 设计数据库 网表 + 库 + 视图 + 约束 + 电源意图 init_design 后建立 check_design -all 未解析引用 / 重复实例 / 悬空端口 check_timing -verbose 无时钟 / 无输入延迟 / 未约束路径 check_power_intent 域边界 / 隔离缺失 / 电平不匹配 report_analysis_view 确认 setup / hold 视图绑定 初始化通过判据:四类输入全部解析成功,且视图、约束、电源域三者无冲突 任一检查报错未清零前,不进入 floorplan 与 place 阶段

SDC 读入的关键检查点

SDC 读入后不要只看“读入成功”,要确认约束真正生效。最容易被忽略的是时钟定义与视图的绑定:如果 create_clock 写在某个 SDC 中,而该 SDC 只被部分约束模式引用,那么在其他模式下这条时钟不存在,工具会报“no clock found”或把路径当作未约束。另一个高频问题是输入输出延迟没有按视图区分,导致慢角下 IO 路径过约束、快角下过松。

建议在初始化后立即执行 report_clocks 和 report_timing -unconstrained,前者确认每个视图下时钟周期、波形、来源正确,后者列出没有被约束覆盖的路径。若未约束路径数量异常大,通常说明 SDC 中的 set_input_delay/set_output_delay 端口名与网表端口不匹配,或 set_false_path 写得过宽。

UPF/CPF 导入与低功耗一致性

低功耗意图导入后,网表会被插入隔离单元、电平转换器、电源开关等特殊单元。此时必须检查三件事:电源域边界是否与网表层次一致;跨域信号是否都有隔离或电平转换;常开域(always-on)路径是否被正确保留。常见报错如“isolation cell missing on domain crossing”或“level shifter required but not found”,本质是 UPF 中 set_isolation、set_level_shifter 的作用范围没有覆盖实际跨域信号。

处理这类报错时,先确认电源域划分与 RTL 中的电源意图是否一致,再检查 UPF 中的 -domain、-applies_to、-location 参数。若隔离单元被插入到错误层次,可用 report_power_domain 查看域边界,用 report_isolation 确认隔离策略生效位置。

初始化检查清单与常见报错处理

检查项命令常见报错处理方向
网表与库一致性check_design -allunresolved reference补 LEF/lib 或修正模块名
时钟与约束覆盖check_timing -verboseno clock / unconstrained检查 SDC 与视图绑定
视图绑定report_analysis_viewview not found确认 MMMC 中视图名拼写
电源域与隔离check_power_intentisolation missing补 set_isolation 作用域
电平转换check_power_intentlevel shifter required补 set_level_shifter
电源网络report_power_domaindomain boundary mismatch核对 UPF 与网表层次
初始化阶段最值得投入时间的动作是“让四类输入互相印证”:网表端口与 SDC 端口对齐、SDC 时钟与 MMMC 模式对齐、UPF 电源域与网表层次对齐。三者对齐后,后续时序报告和功耗报告才具备可信度。
不要用 set_false_path 或 set_disable_timing 掩盖初始化阶段的未约束路径。这些命令会真实地关闭时序检查,若在导入阶段误用,问题会一直隐藏到签核阶段才暴露,返工成本极高。

完成上述检查后,可以用一条汇总命令确认数据库状态:report_design -summary 查看实例数、端口数、库单元数;report_analysis_view 确认 setup/hold 视图;check_power_intent 确认低功耗结构。只有这些输出都符合预期,才进入 floorplan 阶段。初始化不是“跑完脚本”,而是把前端交付的四种描述收敛成一个自洽、可分析、可布线的后端数据库。