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 用快角,扫描模式单独建视图,避免功能约束与测试约束互相污染。
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 -all | unresolved reference | 补 LEF/lib 或修正模块名 |
| 时钟与约束覆盖 | check_timing -verbose | no clock / unconstrained | 检查 SDC 与视图绑定 |
| 视图绑定 | report_analysis_view | view not found | 确认 MMMC 中视图名拼写 |
| 电源域与隔离 | check_power_intent | isolation missing | 补 set_isolation 作用域 |
| 电平转换 | check_power_intent | level shifter required | 补 set_level_shifter |
| 电源网络 | report_power_domain | domain boundary mismatch | 核对 UPF 与网表层次 |
set_false_path 或 set_disable_timing 掩盖初始化阶段的未约束路径。这些命令会真实地关闭时序检查,若在导入阶段误用,问题会一直隐藏到签核阶段才暴露,返工成本极高。完成上述检查后,可以用一条汇总命令确认数据库状态:report_design -summary 查看实例数、端口数、库单元数;report_analysis_view 确认 setup/hold 视图;check_power_intent 确认低功耗结构。只有这些输出都符合预期,才进入 floorplan 阶段。初始化不是“跑完脚本”,而是把前端交付的四种描述收敛成一个自洽、可分析、可布线的后端数据库。