3. 时序约束基础与MMMC视图映射
在单模式单角(Single-Corner)时代,一个设计通常只对应一份 SDC 文件,工具读入后即可完成时序分析。进入多模式多角(MMMC)流程后,同一份网表需要在多个工作模式(Function Mode、Test Mode、Scan Shift、Scan Capture 等)与多个工艺角(SS、TT、FF、以及不同温度/电压组合)下分别收敛。此时约束不再是"一份文件",而是一组按模式与角组织、再通过视图(View)绑定到具体分析场景的约束集合。理解 SDC 的组织方式、视图绑定关系与约束复用策略,是 MMMC 时序收敛的第一道工程门槛。
一、从 SDC 到 MMMC:约束的三个层次
SDC(Synopsys Design Constraints)本质是一组 Tcl 命令,描述时钟、输入输出延迟、时序例外、工作条件等。在 MMMC 中,约束被拆分为三个层次:
- 基础约束(Common SDC):所有模式共享的部分,如时钟定义、时钟不确定性、驱动/负载、单位设置。这部分通常放在
common.sdc中,被所有模式 source。 - 模式约束(Mode SDC):与功能模式强相关的部分,如功能模式下的
set_false_path、测试模式下的set_case_analysis、扫描链路径的set_multicycle_path。每个模式一份,例如func.sdc、scan_shift.sdc、scan_capture.sdc。 - 角约束(Corner SDC):与工艺角相关的部分,主要是
set_operating_conditions、set_timing_derate、set_voltage等。这部分通常由库和 PVT 决定,可独立成corner_ss.sdc、corner_ff.sdc。
三层约束通过 MMMC 配置文件(如 Cadence Innovus 的 mmmc.tcl 或 Genus 的 mmmc.view)组合成视图。一个视图 = 一个模式 + 一个角 + 一组约束文件。工具在分析时,按视图逐一加载约束并执行时序计算。
二、视图绑定:模式与角的笛卡尔组合
假设设计有 3 个模式(func、scan_shift、scan_capture)和 3 个角(ss_125c、tt_25c、ff_m40c),理论上可产生 9 个视图。但工程上并非所有组合都有意义:例如 scan_shift 模式通常只在 ss 角下检查保持时间,ff 角下检查建立时间;func 模式则需要在所有角下检查。因此实际视图数量往往小于笛卡尔积,需要按收敛目标裁剪。
视图绑定的核心是"约束文件与视图一一对应"。在 Cadence Innovus 中,典型写法如下:
create_analysis_view -name func_ss \
-constraint_mode func_mode \
-delay_corner ss_125c
create_analysis_view -name scan_shift_ff \
-constraint_mode scan_shift_mode \
-delay_corner ff_m40c
set_analysis_view -setup {func_ss scan_capture_ss} \
-hold {func_ff scan_shift_ff}
其中 constraint_mode 指向模式约束集合,delay_corner 指向角约束集合。set_analysis_view 则指定哪些视图参与 setup 检查、哪些参与 hold 检查。这一步是 MMMC 流程中最容易出错的地方:如果某个视图未被列入 setup 或 hold 列表,工具会静默跳过该视图的时序检查,导致"看起来收敛、实际漏检"。
三、约束复用策略:避免重复与冲突
当视图数量增长到十几个甚至几十个时,约束文件的维护成本会迅速上升。工程上常用的复用策略有三种:
1. 公共约束下沉。 将时钟定义、时钟不确定性、输入输出延迟、驱动/负载等与模式无关的约束统一放入 common.sdc,各模式 SDC 只保留差异部分。这样修改时钟周期时只需改一处,避免多份文件不同步。
2. 模式约束参数化。 对于同一模式在不同角下需要微调的参数(如 derate 系数、时钟不确定性),可用 Tcl 变量在角 SDC 中定义,模式 SDC 引用变量。例如:
# corner_ss.sdc
set CLK_UNCERTAINTY 0.15
set INPUT_DELAY 1.2
# func.sdc
set_clock_uncertainty $CLK_UNCERTAINTY [get_clocks clk_core]
set_input_delay $INPUT_DELAY -clock clk_core [get_ports data_in*]
这样同一份 func.sdc 可被多个角视图复用,只需切换角 SDC 中的变量值。
3. 例外约束按模式隔离。 set_false_path、set_multicycle_path、set_case_analysis 等例外约束对模式高度敏感。功能模式下的异步跨时钟域路径在扫描模式下可能变成真实路径,必须分别定义。建议每个模式 SDC 独立维护例外约束,不要跨模式复用,否则极易产生"功能模式收敛、扫描模式违例"的假象。
四、常见陷阱与检查方法
MMMC 约束组织中最常见的三类问题:
- 视图遗漏:
set_analysis_view未列出某视图,工具不报错但跳过检查。检查方法:用report_analysis_view或report_timing -view all确认所有预期视图都有时序报告输出。 - 约束冲突:同一对象在不同模式 SDC 中被赋予矛盾的约束(如一个模式设 false_path,另一个模式设 max_delay)。检查方法:用
report_sdc -verbose逐视图导出约束,对比同一对象在各视图下的约束值。 - 时钟定义不一致:不同模式 SDC 中同名时钟的周期或波形不同,导致跨模式比较时结论失真。检查方法:统一在
common.sdc中定义时钟,模式 SDC 只做例外和 case_analysis。
set_analysis_view 中的列表逐项比对。这一步只需几分钟,却能避免后期因漏检导致的流片风险。
总结来说,SDC 在 MMMC 中的组织核心是"分层 + 绑定 + 复用":公共约束下沉到 common,模式约束按功能隔离,角约束按 PVT 独立,再通过 create_analysis_view 与 set_analysis_view 将三者绑定为可分析视图。约束复用不是简单复制文件,而是通过参数化和分层,让同一份模式约束服务于多个角,同时保证例外约束的模式专属性。掌握这套组织方式,后续的时序收敛才有可靠的约束基础。