3. 工艺角与PVT建模

多模式多角STA的第一块地基,不是写约束,而是把“工艺、电压、温度、寄生”这四类物理条件,翻译成PrimeTime能识别的corner对象。很多时序报告看起来矛盾,根源往往不在约束,而在于corner定义与库、设计三者没有对齐:库里的PVT命名、设计里例化的cell、以及脚本中声明的operating condition各说各话。

一、PVT与RC corner到底描述了什么

PVT是Process、Voltage、Temperature的缩写。Process指晶体管与互连的制造偏差,通常用SS(slow-slow)、TT(typical)、FF(fast-fast)等工艺角表示;Voltage是供电电压,例如0.72V、0.80V、0.88V;Temperature是结温,例如-40℃、25℃、125℃。三者组合决定标准单元和宏单元的延迟特性。

RC corner描述的是互连寄生参数。Cbest/Cworst/Rbest/Rworst是四种极端组合:Cworst表示电容最大、Rworst表示电阻最大,二者组合成Cworst_Rworst(常称RCmax),延迟最大;Cbest_Rbest(RCmin)延迟最小。需要注意的是,先进工艺中互连延迟的“最坏”并不总是RCmax,长线上RCmax更慢,而短线上Cbest可能因驱动负载轻、信号翻转快而更关键,因此不能只建一个RC corner。

PrimeTime本身不计算寄生,它读取的是已经抽取好的SPEF或寄生参数文件,因此RC corner在PT中体现为“同一设计、不同寄生文件”的映射关系。

二、从库到corner:映射关系怎么建立

标准单元库通常以.lib/.db形式提供,库名里已经编码了PVT信息,例如:

slow_0p72v_125c_ccs.db
typical_0p80v_25c_ccs.db
fast_0p88v_m40c_ccs.db

PrimeTime通过set_operating_conditions把库中的PVT条件绑定到当前分析场景,再用set_timing_derate补充片上偏差(OCV)。一个典型的corner定义如下:

set_operating_conditions -library slow_0p72v_125c_ccs \
    -max slow_0p72v_125c -min fast_0p88v_m40c

set_timing_derate -early 0.95 -late 1.05

这里-max用于建立时间(setup)分析,取慢条件;-min用于保持时间(hold)分析,取快条件。这种“max/min混搭”正是多角STA的常见做法:setup看最慢路径,hold看最快路径。

RC corner则通过读入不同SPEF来体现:

read_parasitics -path ./spef/rcmax.spef
# 或
read_parasitics -path ./spef/rcmin.spef

把PVT与RC组合起来,就得到完整的corner,例如“ss_0p72v_125c_rcmax”用于setup,“ff_0p88v_m40c_rcmin”用于hold。工程上通常建立一张corner映射表,把逻辑名、库文件、SPEF、分析类型一一对应。

PVT + RC Corner 到 PrimeTime Corner 的映射 物理条件 Process: SS / TT / FF Voltage: 0.72 / 0.80 / 0.88V Temperature: -40 / 25 / 125℃ RC: Cworst_Rworst / Cbest_Rbest 库与寄生文件 slow_0p72v_125c.db fast_0p88v_m40c.db rcmax.spef rcmin.spef (.db 与 .spef 一一对应) PrimeTime Corner setup: ss_0p72v_125c_rcmax hold: ff_0p88v_m40c_rcmin set_operating_conditions read_parasitics set_timing_derate 库与设计一致性检查要点 库名与PVT是否匹配 report_lib / get_libs 设计cell是否都在库中 check_design / link_design SPEF与corner是否对应 report_annotated_parasitics 任一环节不匹配 → 时序结果不可信,需先修正corner定义

三、一致性检查:让报告可信的前提

corner定义完成后,必须做三类检查,否则后续所有时序数字都不可信。

第一,库与PVT是否匹配。用report_lib或get_libs查看当前加载的库,确认库名中的电压、温度与set_operating_conditions声明的一致。常见错误是脚本里写了0.72V,实际加载的却是0.80V的库,此时PT不会报错,但延迟值已经偏离。

第二,设计中的cell是否都能在库中找到。执行link_design后,用check_design检查是否有unresolved reference。若某个cell在slow库中存在、在fast库中缺失,hold分析就会失败或使用错误模型。多角STA中每个corner都要单独link一次,不能只link一个角就复用。

第三,SPEF与corner是否对应。用report_annotated_parasitics查看寄生标注率。若标注率低于预期,说明SPEF中的net名与当前设计不匹配,可能是综合后网表与布局后网表版本不一致。标注率不足时,PT会退回使用WLM(wire load model),延迟估算会明显偏乐观。

注意:不同corner的SPEF必须来自同一版物理设计。若rcmax.spef来自布局版本A、rcmin.spef来自版本B,两个角的比较就失去意义,setup与hold的结论会互相矛盾。

四、一个可复用的corner定义模板

把上述内容整理成脚本模板,便于在项目中复用。以下示例参数为教学假设,实际项目需按库和工艺替换:

# corner: ss_0p72v_125c_rcmax  (setup)
set_operating_conditions -library slow_0p72v_125c_ccs \
    -max slow_0p72v_125c -min fast_0p88v_m40c
read_parasitics -path ./spef/rcmax.spef
set_timing_derate -late 1.05 -early 0.95

# corner: ff_0p88v_m40c_rcmin  (hold)
set_operating_conditions -library fast_0p88v_m40c_ccs \
    -max slow_0p72v_125c -min fast_0p88v_m40c
read_parasitics -path ./spef/rcmin.spef
set_timing_derate -late 1.05 -early 0.95

可以看到,两个corner的-max与-min组合相同,区别在于主库和SPEF。这正是多角STA的组织方式:把“分析类型”与“物理条件”解耦,用corner名统一管理。

五、常见陷阱与判断依据

实践中三个陷阱最常出现。其一,库的默认operating condition被忽略:某些库自带default operating condition,若不显式set_operating_conditions,PT会使用库默认值,可能与预期PVT不符。其二,温度反转效应:在先进工艺低电压下,125℃不一定比-40℃慢,需通过实际库数据确认,不能凭经验假设。其三,RC corner与分析类型错配:setup用rcmin、hold用rcmax会得到过于乐观的setup和过于悲观的hold,掩盖真实违例。

判断corner定义是否正确的最终依据,是让PT分别报告每个corner下的WNS/TNS,并检查:setup的WNS应出现在慢角,hold的WNS应出现在快角;若出现反常,优先回查库、SPEF、derate三者是否与corner名一致。只有corner定义可信,后续的多模式约束与报告分析才有意义。