unconstrained endpoint / no clock:OpenSTA 端点没挂上时钟排查
更新时间:2026-10-25。排错速查页,面向第一次接触 SDC 的读者。OpenSTA 报告里路径落进
Path Group: unconstrained、开头还有一行clock arg 'clk' clock not found——意思是:你要分析的端点根本没被任何时钟约束罩住,工具无从检查它的建立/保持时间。这类问题在约束侧的系统审计见 unconstrained endpoint 审计方法,环境没装好的先看 OpenLane Docker 排错。
答案块(赶时间先看这里)
- 报错原文:
Warning: c9_noclock.sdc line 2, clock arg 'clk' clock not found.+ 路径组Path Group: unconstrained,结尾(Path is unconstrained),全程没有任何 slack 数值 - 环境:OpenLane 流程内嵌 OpenSTA,sky130A,SDC 里的
create_clock被删掉 - 根因:
set_input_delay -clock clk引用了一个从未用create_clock定义过的时钟对象,约束链从根上断掉 - 修复:补回
create_clock -name clk -period 20 [get_ports clk],再跑 STA - 验证:路径组从
unconstrained变回clk,出现正常的 slack(MET)数值,worst slack 18.61,证明约束链已恢复完整
本文要回答的问题
clock not found和unconstrained endpoint是什么关系?- 为什么约束文件少一行,整条时钟域都「隐身」了?
- 怎么区分「create_clock 漏写」和「false path 误伤」两种来历?
- 一份最小可用的 SDC 至少要写哪几条?
一、报错原文与现象
复现方式:把 SDC 里的 create_clock 整行删掉,只留 set_input_delay / set_output_delay,再让 OpenSTA 读约束跑分析:
Warning: c9_noclock.sdc line 2, clock arg 'clk' clock not found.
Startpoint: clk (input port)
Endpoint: _45_/CLK (internal pin)
Path Group: unconstrained
Path Type: max
...
(Path is unconstrained)这张实录的信息密度很高:第一行 Warning 直接点出 c9_noclock.sdc line 2 的 set_input_delay 引用了一个不存在的时钟 clk;下面的路径报告里 Path Group 是 unconstrained 而不是正常的 clk;最后 (Path is unconstrained) 收尾,没有任何 slack 数值——注意这不是 slack 为负的违例(那是 slack (VIOLATED) 排查 的场景),而是工具压根没做时序检查。unconstrained 路径不会报 VIOLATED,所以最危险的情况是:整个流程跑完一片绿,其实一大半路径根本没被检查过。真正的 signoff 审查里,unconstrained endpoint 计数为 0 是和 setup/hold 全过并列的硬性条件。
二、根因:约束是链式的,create_clock 是链头
SDC 约束不是一堆独立语句,而是一条引用链:create_clock 先造出时钟对象,set_input_delay -clock clk、set_output_delay -clock clk、create_generated_clock 这些都挂在这个对象上;STA 工具再按「时钟对象 → 时钟网络 → 寄存器时钟引脚」把约束传播到每个端点。链头一断,下游全部失效:
set_input_delay -clock clk找不到clk这个对象,直接报clock not found,这条约束作废;- 寄存器的 CLK 引脚没有任何时钟波形到达,工具不知道按什么周期检查它,于是归入
unconstrained; - 端口到寄存器、寄存器到端口、寄存器到寄存器三类路径全部不做建立/保持检查。
这个机制和商用工具完全一致——Design Compiler 里同类问题的对照见 DC clock constraint missing,PrimeTime 侧见 PrimeTime clock constraint missing。三家报错措辞不同,根因模型是同一个。
还有一个初学者常问的疑问:为什么端口 clk 明明存在,工具却说 clock not found?因为「端口」和「时钟对象」是两个概念。端口是网表里的物理引脚,create_clock 是在这个引脚上定义一个时钟波形对象(名字、周期、占空比),后续的建立/保持时间检查、跨时钟域分析全部围绕这个对象展开。没有定义之前,clk 只是一根普通信号线——set_input_delay -clock clk 里的 -clock 参数要的是时钟对象,找不到对象名就报 not found。同理,如果你写的是 create_clock -name sys_clk ...,那后面所有 -clock 引用都得用 sys_clk,用端口本名 clk 同样 not found。名字对不上是新手期仅次于「整行漏写」的高发坑。
三、约束覆盖检查流:两种来历分层排
同样是 unconstrained,来历主要两种:链头缺失(create_clock 没写/写错端口名)和误伤(false path 把不该豁免的路径豁免了)。按下面的检查流逐层核对:
颜色按角色分:红是现象与根因、蓝是排查动作(两条 OpenSTA 命令)、橙是修复、绿是通过状态。主线一句话:先 report_clocks 确认时钟对象存在——列不出来就是链头缺失,补 create_clock(注意端口名大小写、有没有写错成 [get_ports clock] 之类的笔误);时钟明明在、路径却还是 unconstrained,就 report_exceptions 查是不是某条 set_false_path 写得太宽(比如 -from [all_inputs] 把真实时序路径一锅端),这种「误伤」的审计方法展开见 false path 审计方法。false path 和 disable_timing 的取舍见 disable_timing 与 false path 辨析。
四、修复与最小 SDC 速查
本次实验的修复就是把删掉的那行补回来,再重跑 STA。修复后的报告里路径组变回 clk、出现正常的 slack (MET):
Startpoint: _45_ (rising edge-triggered flip-flop clocked by clk)
Endpoint: q[0] (output port clocked by clk)
Path Group: clk
...
18.61 slack (MET)
worst slack 18.61顺手把一份「最小可用 SDC」整理成速查卡——80% 的 unconstrained 问题都是缺了前两行之一:
读法:蓝区是链头,没有它后面全白搭;紫区(plan)是端口预算,决定 I/O 路径被检查得多严;红区(decision)是例外,双刃剑;绿区是两条自查命令,写完 SDC 先自查再跑全量分析。养成习惯:每次改完约束先 check_timing,把 unconstrained endpoint 清零再看 slack。
最后说一类容易误判的「假 unconstrained」:异步路径和跨时钟域路径如果已经被设计者有意识地 set_false_path 或 set_clock_groups -asynchronous 豁免,它们出现在报告里的方式与「漏约束」很像,但性质完全不同——前者是有意的豁免,后者是事故。区分方法还是 report_exceptions:能对上明确例外条目的是有意豁免,对不上任何例外、又没有任何时钟覆盖的才是真漏约束。约束的 lint 与系统化自查见 SDC 约束 lint。
再补一个流程层面的提醒:OpenLane 这类流程通常从设计的 config.json 或 SDC 文件读约束,改了 RTL 里的端口名(比如把 clk 改名成 clock)却忘了同步改 SDC,也会出现一模一样的 not found 告警。所以遇到这个报错,第二个要核对的就是「SDC 里引用的端口名和综合后网表里的端口名是否还一致」——综合、展平、改名每一步都可能让约束和网表脱节。
实验环境
- 机器/系统:云主机 16C32G / Ubuntu 22.04(eda-golden-v1 镜像,预装 OpenLANE 2023 版流程 + OpenSTA 2.4.0,PDK sky130A)
- 工具版本:OpenSTA 2.4.0(efabless/openlane 镜像 d054702b 内嵌)
- 日期:2026-10-24
- 完整命令:
docker run --rm -v /tmp/errlog-evidence:/tmp/errlog-evidence -v /home/ubuntu/.volare:/home/ubuntu/.volare efabless/openlane:d054702b2cce04761cc2bc598f6b95c9d8ca7c6c-amd64 sta -no_init -exit /tmp/errlog-evidence/src/c9_err.tcl(删 create_clock 复现),同路径换c9_fix.tcl(补回后验证)
这一篇在知识体系里的位置
本篇是开源 EDA 排错簇中「约束缺失」节点的入门页:上游概念是 SDC 数据格式与生命周期 与 综合约束 SDC 编写;系统化审计方法见 unconstrained endpoint 审计方法 与 约束 lint;姊妹篇 slack (VIOLATED) 排查 处理「约束有了但时序不满足」的下一阶段问题;商用工具侧同类报错对照 DC clock constraint missing。
一句话总结
unconstrained endpoint / clock not found 的本质是 SDC 引用链断在链头:set_input_delay -clock clk 引用了从未 create_clock 过的对象,整条时钟域因此不做时序检查且不报违例(比 slack 为负更隐蔽);排查先 report_clocks 确认时钟对象、再 report_exceptions 排除 false path 误伤,修复是补 create_clock -name clk -period <周期> [get_ports clk],路径组从 unconstrained 回到 clk、出现正常 slack 即收敛。