2. 时钟树基础与Cadence实现语境

在数字后端实现中,时钟信号并不是一根理想导线,而是一张覆盖全芯片的分配网络。它从时钟源出发,经过根缓冲、主干、分支、叶节点,最终到达每一个时序单元的时钟引脚。这张网络就是时钟树。Cadence 的 Innovus 与 Tempus 把这张网络抽象为可约束、可分析、可优化的对象,本节要建立的就是“物理结构—时序参数—工具约束”三者之间的对应关系。

一、时钟树的物理结构

一个典型的时钟树从时钟定义点(create_clock 指定的源点)开始,向下分为若干层级。根节点通常位于芯片边缘或 PLL 输出附近,经过一级或多级根缓冲后进入主干;主干在芯片中部形成 H 型或鱼骨型骨架,再通过分支缓冲逐级扇出到叶节点。叶节点直接驱动触发器、锁存器或宏单元的 CK 引脚。Cadence 工具中,这条路径上的每个缓冲、反相器、时钟门控单元都被识别为时钟单元,其连线被识别为时钟网络。

理解结构的关键在于区分时钟路径与数据路径。时钟路径从时钟源到触发器 CK 端,数据路径从上一级触发器 Q 端到下一级 D 端。时序收敛的本质,就是让数据到达时间与时钟到达时间满足建立/保持关系。因此,时钟树上的任何延迟、偏差和不确定性,都会直接改变时序余量。

时钟树结构与关键参数示意 PLL 时钟源 根缓冲 主干 分支B1 分支B2 分支B3 FF1 FF2 FF3 FF4 FF5 FF6 t_root t_trunk t_branch t_leaf skew 时钟不确定性 jitter + OCV + margin set_clock_uncertainty setup / hold 分别约束 时钟延迟 source latency network latency set_clock_latency 时钟偏差 global skew local skew set_clock_uncertainty

二、时钟延迟:源延迟与网络延迟

时钟延迟分为两部分。源延迟(source latency)指时钟从真实源点(如 PLL 输出或外部晶振)到芯片时钟定义点之间的延迟,通常由时钟源特性或板级走线决定,在 SDC 中用 set_clock_latency -source 描述。网络延迟(network latency)指从时钟定义点到触发器 CK 引脚之间的片上延迟,由时钟树综合结果决定,用 set_clock_latency 描述。

在 Cadence 语境中,时钟树综合前,工具使用预估的 network latency 进行时序分析;时钟树综合后,工具用实际提取的延迟替代预估值。如果 CTS 后不更新 latency,时序报告会严重失真。因此,Innovus 流程中通常在 ccopt_design 之后执行 set_propagated_clock,让工具基于真实时钟网络传播计算到达时间。

三、时钟偏差:全局与局部

时钟偏差(skew)是同一时钟域内两个触发器 CK 引脚到达时间之差。它分为全局偏差和局部偏差。全局偏差关注整个芯片范围内最大到达时间与最小到达时间之差;局部偏差关注相邻或同一路径上两个触发器之间的到达时间差。对建立时间而言,捕获时钟比发射时钟晚到会减少余量;对保持时间而言,捕获时钟比发射时钟早到会减少余量。

Cadence 工具在 CTS 阶段以 ccopt 引擎同时优化插入延迟和偏差。用户通过 set_clock_tree_options 指定目标偏差,例如 -target_skew 100ps。工具会在满足偏差目标的前提下尽量减小插入延迟和功耗。需要注意的是,偏差目标不是越小越好:过度收紧偏差会引入更多缓冲、增大面积和功耗,甚至恶化 OCV 余量。

四、时钟不确定性:约束表达与含义

时钟不确定性(clock uncertainty)是 SDC 中用于覆盖抖动、OCV、时钟树偏差残余和设计余量的统一参数。它通过 set_clock_uncertainty 施加,且必须分别指定 setup 和 hold 值。例如:

set_clock_uncertainty -setup 0.15 [get_clocks clk_core]
set_clock_uncertainty -hold  0.08 [get_clocks clk_core]

在 Innovus 中,setup uncertainty 会从建立时间余量中扣除,hold uncertainty 会从保持时间余量中扣除。CTS 前,uncertainty 通常包含预估 skew;CTS 后,实际 skew 已由时钟树决定,uncertainty 应相应减小,只保留 jitter、OCV 和设计余量。如果 CTS 后仍保留过大的 uncertainty,会掩盖真实偏差问题,导致过度优化。

实践要点:CTS 前 uncertainty 可设为 0.15~0.25ns 覆盖预估 skew;CTS 后建议降至 0.05~0.10ns,仅保留 jitter 与 OCV。具体数值需根据工艺节点和时钟频率调整。

五、Cadence 中的约束表达与检查

在 Innovus 中,时钟树约束主要通过以下命令表达:

  • create_clock:定义时钟源、周期和波形。
  • set_clock_latency:设置源延迟或网络延迟。
  • set_clock_uncertainty:设置建立/保持不确定性。
  • set_clock_transition:设置时钟转换时间约束。
  • set_clock_tree_options:设置 CTS 目标偏差、缓冲类型、最大电容等。

完成约束后,可用 report_clock_tree 查看时钟树结构,用 report_clock_timing -type skew 查看偏差报告,用 report_timing 检查建立/保持余量。判断时钟树是否达标,关键看三项:插入延迟是否在预算内、全局偏差是否满足目标、各叶节点转换时间是否在约束范围内。

常见误区:把 uncertainty 当作 skew 的替代品。CTS 后实际 skew 已由时钟树决定,若仍用大 uncertainty 覆盖,时序报告会偏悲观,导致工具过度插入缓冲,反而恶化偏差和功耗。

六、参数关系小结

时钟树、延迟、偏差、不确定性四者构成一个闭环:时钟树结构决定网络延迟和偏差;偏差和抖动共同影响不确定性;不确定性又反过来约束 CTS 的优化目标。在 Cadence 工具中,这个闭环通过 SDC 约束和 CTS 引擎参数共同表达。理解每个参数在工具中的定义位置和生效阶段,是后续时钟树综合与时序收敛的基础。