F
版块:EDA
数字后端同学看 STA 报告最忌讳"读单行数字"。setup/hold 各自在哪个工艺角检查、为什么、怎么对——这篇把 corner、lib、SDC 三者关系一次梳理清。
一、工艺角(process corner)与 lib 的关系
Foundry 给一组 PVT 组合(如 ss_0.72v_125c、tt_0.9v_25c、ff_0.9v_-40c),库文件按角分开。STA 工具对 setup 与 hold 选择互补的角:
- Setup 检查:数据路径取"最慢"角、时钟取"最快/偏慢"角组合(launch 快、capture 慢 → 留最少时间),关注最高温最低压;
- Hold 检查:反向——数据最快角 vs 时钟最慢角(数据飞快追上下一拍 launch 沿);
- 所以签核必须用多角(如 MMMC:setup 在 ss/慢 + hold 在 ff/快),"setup 在 ss 过了、hold 也在 ss 看"这种单角误读是新人第一大坑。
二、SDC 里各条约束影响的 corner/时钟域
| SDC 命令 | 作用 | corner 视角 |
|----------|------|-------------|
| create_clock / create_generated_clock | 时钟树时间关系基础 | 全角生效 |
| set_clock_latency / uncertainty | 建模 skew+jitter,setup 扣时间 | jitter 通常按 ns 级统一注入;OCV 的 skew 走 derate |
| set_input_delay / output_delay | 外部逻辑占用 | I/O 路径两角都要查 |
| set_driving_cell / load | 边缘斜率模型 | load 大时快角反而 setup 更坏(大线延迟依赖 RC)|
| set_max_delay / false path / multicycle | 路径分类 | multicycle 在快角对 hold 有害,需确认 hold 也被覆盖 |
| set_derate / variation | OCV/AOCV/POCV 幅度 | POCV 按 sigma 模式,corner 敏感度降低,但 mean shift 要单独报 |
| set_clock_transition / propageted clock | NDR 时钟线规则 | 快角下 transition 大反而恶化时序 |
三、读报告的顺序模板(以一条 setup 违例为例)
1. 确认 startpoint/endpoint 的时钟(launch/capture,注意是同一时钟还是跨域);
2. 看 data arrive 的逐段 breakdown:cell vs net 比例,net 里 wire vs RC derate 比例 → 定位"逻辑深"还是"布线远";
3. 看 required:clock period − capture 路径(latency + skew + uncertainty)− setup;
4. slack 负多少 → 判断是修逻辑(加流水平板)还是修时钟树(插 buffer 增加 skew);
5. 同一路径在 hold 角是否也看一遍——为修这条 setup 加的 buffer 会让 hold 恶化。
四、OCV 演进一句话
global derate → 线性 OCV → AOCV(按深度和距离表)→ POCV/SOCV(sigma 统计),签核工具默认越来越保守。同一份 RTL,在 AOCV 与 POCV 下 slack 会差 5~8%,跨角对比报告前先看"同一份 flow 设置"(含 derate view、CRPR 开没开、SDC 版本)。
五、三个高频疑问
1. "slack 是 0 要不要修":工具内 0 slack = 量产边缘,按工艺余量再留;
2. "hold 靠 DFT 插的 delay cell 要不要功能修":尽量交后端,功能改动重排 pipeline 才自己来;
3. "max transition 违例算不算时序":算,它是 NDR 类检查,快角下过大的 slew 直接污染相邻路径的 delay 模型。
有做后端签核流建设的同事欢迎补充 MMMC 设置模板,我来编合订版。
数字后端同学看 STA 报告最忌讳"读单行数字"。setup/hold 各自在哪个工艺角检查、为什么、怎么对——这篇把 corner、lib、SDC 三者关系一次梳理清。
一、工艺角(process corner)与 lib 的关系
Foundry 给一组 PVT 组合(如 ss_0.72v_125c、tt_0.9v_25c、ff_0.9v_-40c),库文件按角分开。STA 工具对 setup 与 hold 选择互补的角:
- Setup 检查:数据路径取"最慢"角、时钟取"最快/偏慢"角组合(launch 快、capture 慢 → 留最少时间),关注最高温最低压;
- Hold 检查:反向——数据最快角 vs 时钟最慢角(数据飞快追上下一拍 launch 沿);
- 所以签核必须用多角(如 MMMC:setup 在 ss/慢 + hold 在 ff/快),"setup 在 ss 过了、hold 也在 ss 看"这种单角误读是新人第一大坑。
二、SDC 里各条约束影响的 corner/时钟域
| SDC 命令 | 作用 | corner 视角 |
|----------|------|-------------|
| create_clock / create_generated_clock | 时钟树时间关系基础 | 全角生效 |
| set_clock_latency / uncertainty | 建模 skew+jitter,setup 扣时间 | jitter 通常按 ns 级统一注入;OCV 的 skew 走 derate |
| set_input_delay / output_delay | 外部逻辑占用 | I/O 路径两角都要查 |
| set_driving_cell / load | 边缘斜率模型 | load 大时快角反而 setup 更坏(大线延迟依赖 RC)|
| set_max_delay / false path / multicycle | 路径分类 | multicycle 在快角对 hold 有害,需确认 hold 也被覆盖 |
| set_derate / variation | OCV/AOCV/POCV 幅度 | POCV 按 sigma 模式,corner 敏感度降低,但 mean shift 要单独报 |
| set_clock_transition / propageted clock | NDR 时钟线规则 | 快角下 transition 大反而恶化时序 |
三、读报告的顺序模板(以一条 setup 违例为例)
1. 确认 startpoint/endpoint 的时钟(launch/capture,注意是同一时钟还是跨域);
2. 看 data arrive 的逐段 breakdown:cell vs net 比例,net 里 wire vs RC derate 比例 → 定位"逻辑深"还是"布线远";
3. 看 required:clock period − capture 路径(latency + skew + uncertainty)− setup;
4. slack 负多少 → 判断是修逻辑(加流水平板)还是修时钟树(插 buffer 增加 skew);
5. 同一路径在 hold 角是否也看一遍——为修这条 setup 加的 buffer 会让 hold 恶化。
四、OCV 演进一句话
global derate → 线性 OCV → AOCV(按深度和距离表)→ POCV/SOCV(sigma 统计),签核工具默认越来越保守。同一份 RTL,在 AOCV 与 POCV 下 slack 会差 5~8%,跨角对比报告前先看"同一份 flow 设置"(含 derate view、CRPR 开没开、SDC 版本)。
五、三个高频疑问
1. "slack 是 0 要不要修":工具内 0 slack = 量产边缘,按工艺余量再留;
2. "hold 靠 DFT 插的 delay cell 要不要功能修":尽量交后端,功能改动重排 pipeline 才自己来;
3. "max transition 违例算不算时序":算,它是 NDR 类检查,快角下过大的 slew 直接污染相邻路径的 delay 模型。
有做后端签核流建设的同事欢迎补充 MMMC 设置模板,我来编合订版。

