跳到主要内容
Clock Engine · CURRENT

iCTS · 时钟树综合

时钟树综合引擎。Agent 可以 inspect 时钟树结构、获取 common path timing、对局部子树做调整——而不是把时钟树当作黑盒。

开源 EDAAgent 可调用可观测时钟树GPL-3.0
agent — icts
# Agent-driven clock tree synthesis
[iCTS ] skew achieved     0.042
[iCTS ] latency achieved   0.89
[iCTS ] buffers inserted     78
→ inspect clock paths interactively
iMapsynthesisiFPfloorplaniPDNpoweriPLplacementiCTSclockiTOoptimizationiRTroutingiSTAtimingAiEDAdesign dataiPCLlayout modeliMapsynthesisiFPfloorplaniPDNpoweriPLplacementiCTSclockiTOoptimizationiRTroutingiSTAtimingAiEDAdesign dataiPCLlayout model
布局后关键步骤
Agent可调用
DME+Slew-Aware算法框架
GPL-3.0开源许可

核心能力

iCTS(Clock Tree Synthesis)负责在标准单元布局完成后,构建从时钟源(PLL/OSC)到所有时序寄存器时钟引脚的缓冲树网络。目标是控制时钟偏斜(skew)在约束范围内、最小化插入延时(latency)、并保证时钟信号的转换时间(transition/slew)满足工艺要求。iCTS 基于 DME(Deferred-Merge Embedding)与 Slew-Aware 的双重框架——自底向上做几何合并、自顶向下做时序传播与矫正。

Agent 可以将 iCTS 从一个"一键构建"的工具升级为可交互的时钟树调试平台。具体场景包括:时钟树结构巡检——Agent 调用 iCTS 的 inspect 能力,遍历时钟树拓扑、检查每个缓冲级的扇出和负载、识别异常长的支路或扇出过大的节点;局部时钟树重综合——在 STA 发现某条时钟路径 skew 超标后,Agent 不是重跑整个 CTS,而是仅对问题子树做局部 rebuild(调整缓冲类型、插入额外缓冲级、或修改走线拓扑);skew 目标调优——Agent 可尝试不同的 skew_target(如 0.02ns vs 0.05ns),观察对 buffer count 和 total latency 的 trade-off,为 PPA 优化提供依据。

在多时钟域设计中,iCTS 先为每个时钟域独立构建时钟树,再通过 iSTA 评估跨域 skew 后做顶层平衡。Agent 可以在多时钟场景下做更智能的协调——识别哪些时钟域之间存在严格的 skew 约束(如源同步接口),优先平衡这些域的时钟树;而对异步时钟域放宽约束以节省面积和功耗。

iCTS 支持可扩展的时序模型:互连线使用 PERI 模型计算 slew、Elmore 模型计算延迟;缓冲器插入延时使用查表法(LUT)加双线性插值。Agent 可以切换为机器学习模型(XGBoost / CatBoost)做更精确的缓冲器延时预测。大规模设计下(寄存器 > 3000),iCTS 自动启用 K-Means 聚类将时钟网分割为子区域分别构建局部树后合并。

Agent 调用方式

Python
MCP
Tcl
# Agent 调用 iCTS 进行时钟树综合
from ieda_client import IEDAClient

client = IEDAClient()

# 基础时钟树构建
result = client.call("iCTS.synthesize",
    design_ref="snap_7f3a",
    skew_target=0.05,
    latency_target=1.0)

# Agent 检查结果,必要时局部重综合
if result['achieved_skew'] > 0.05:
    # 对超标子树做 rebuild
    repair = client.call("iCTS.rebuild_subtree",
        clock_tree_ref=result['clock_tree_ref'],
        subtree_root="clk_buf_42",
        target_skew=0.03)

# Agent 遍历时钟路径,提取用于 AI 的特征
for path in result['clock_paths']:
    print(f"Path: {path['name']}, levels: {path['levels']}")
{
  "tool": "iCTS.synthesize",
  "arguments": {
    "design_ref": "snap_7f3a",
    "skew_target": 0.05,
    "latency_target": 1.0
  }
}
# Tcl 交互式时钟树综合
iCTS::set_design snap_7f3a
iCTS::set_skew_target 0.05
iCTS::set_latency_target 1.0
iCTS::set_buffer_types {BUF_X1 BUF_X2 BUF_X4}
iCTS::synthesize
iCTS::report_clock_tree
iCTS::check_skew -threshold 0.05
iCTS::write_def -output snap_7f3a.cts.def

输入 / 输出契约

字段类型必需说明
design_refstring设计实例标识符(含布局后数据)
skew_targetfloat目标时钟偏斜(ns),典型值 0.02–0.10
latency_targetfloat目标插入延迟(ns)
clock_portsstring[]需构建时钟树的时钟端口列表
buffer_typesstring[]可用缓冲器类型列表(默认自动选择)
返回字段类型说明
clock_tree_refstring时钟树在 iDB 中的引用 ID
achieved_skewfloat实际达成的全局偏斜(ns)
achieved_latencyfloat实际平均插入延迟(ns)
buffer_countint插入的时钟缓冲器总数
clock_pathsClockPath[]各条时钟路径的详细信息(延迟、级数、slew)

在流程中的位置

    ··· 前置步骤 ···
         │
  ┌─────────────┐
  │    iPL      │  标准单元布局完成
  │  Placement   │
  └──────┬──────┘
         │  placed design
         ▼
  ┌─────────────┐
  │   iCTS     │  ← 当前工具:时钟树综合
  │ Clock Tree   │
  └──────┬──────┘
         │  clock_tree_ref
         ▼
  ┌─────────────┐
  │    iTO      │  时序优化(hold/DRV 修复)
  │ Timing Opt   │
  └──────┬──────┘
         │
         ▼
  ┌─────────────┐
  │    iRT      │  布线
  │   Routing    │
  └──────┬──────┘
    ··· 后续步骤 ···
上游:iPL(标准单元布局完成) 下游:iTO(时序优化)→ iRT(布线) 协同:iSTA(CTS 后时序验证)

相关资源

论文

Tsay RS. "An Exact Zero-Skew Clock Routing Algorithm." IEEE TCAD, 1993. DME 算法奠基性工作。

查看 →

论文

Lin X, et al. "Slew-Aware Clock Tree Synthesis with Buffer Sizing." IEEE TVLSI, 2018.

查看 →

关联工具

iPL · 布局 —— 时钟树综合的输入来自布局完成的单元位置。

iPL →

关联工具

iTO · 时序优化 —— CTS 后进行的 hold/setup 时序修复。

iTO →

GitHub

iCTS 源代码于 iEDA 仓库 src/iCTS 路径下。

GitHub →

关联工具

iSTA · 时序分析 —— CTS 后验证时钟树 timing 的必备工具。

iSTA →

把时钟树从黑盒变白盒

Agent 可 inspect 每条时钟路径、诊断 skew 热点、对局部子树做精准修复。