三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

别再乱用create_generated_clock了!Synopsys SDC生成时钟约束的5个实战避坑点

别再乱用create_generated_clock了!Synopsys SDC生成时钟约束的5个实战避坑点

别再乱用create_generated_clock了!Synopsys SDC生成时钟约束的5个实战避坑点

在数字芯片设计中,时钟约束的准确性直接影响时序收敛的效率与质量。作为Synopsys设计约束(SDC)中最易被误用的命令之一,create_generated_clock的陷阱往往隐藏在看似合理的语法背后。本文将结合真实项目案例,剖析工程师最常踩中的五个技术深坑。

1. -source选项的定位误区:物理连接≠逻辑源头

新手最典型的错误是将物理连接路径逻辑时钟源混为一谈。假设有一个通过PLL生成的时钟网络:

create_clock -period 10 -name PLL_CLK [get_pins PLL/CLKOUT] create_generated_clock -name DIV_CLK -source [get_pins Divider/CLKIN] \ -divide_by 2 [get_pins Divider/Q]

表面上看,分频器的输入引脚确实连接着PLL输出,但这里的-source应该指向原始时钟的物理节点而非中间缓冲器。正确写法应为:

create_generated_clock -name DIV_CLK -source [get_pins PLL/CLKOUT] \ -divide_by 2 [get_pins Divider/Q]

关键区别

错误用法正确用法
指向中间缓冲节点直接关联主时钟源
导致时钟路径分段分析保持完整时钟树追溯

提示:用report_generated_clock -sources命令验证时钟链路是否完整

2. -master_clock在多时钟域中的致命遗漏

当同一个物理网络承载多个逻辑时钟时(如时钟切换电路),仅用-source无法区分时钟域关联性。某次芯片回流测试中出现的setup违例,最终追溯到以下错误约束:

create_clock -name CLK_A -period 10 [get_ports CLK_SEL] create_clock -name CLK_B -period 15 [get_ports CLK_SEL] -add create_generated_clock -name GEN_A -source [get_pins MUX/OUT] \ -divide_by 2 [get_pins Divider/Q] # 缺少master_clock指定

修复方案需显式声明主从关系:

create_generated_clock -name GEN_A -source [get_pins MUX/OUT] \ -master_clock CLK_A -divide_by 2 [get_pins Divider/Q] -add create_generated_clock -name GEN_B -source [get_pins MUX/OUT] \ -master_clock CLK_B -divide_by 2 [get_pins Divider/Q] -add

典型故障现象

  • 时钟切换后保持时间违例
  • 跨时钟域路径分析结果异常
  • 功耗分析报告中时钟树激活比例错误

3. -add选项的隐蔽覆盖风险

在时钟门控单元约束中,工程师常忘记-add会导致前一个约束被静默覆盖。例如某低功耗模块的时钟使能电路:

create_generated_clock -name GATED_CLK -source [get_pins EN_GATE/CLK] \ [get_pins EN_GATE/OUT] # 第一个约束 create_generated_clock -name GATED_CLK -source [get_pins EN_GATE/CLK] \ -combinational [get_pins EN_GATE/OUT] # 覆盖前一个约束!

正确做法是通过-add保留两种工作模式:

create_generated_clock -name GATED_CLK -source [get_pins EN_GATE/CLK] \ [get_pins EN_GATE/OUT] create_generated_clock -name GATED_CLK_COMB -source [get_pins EN_GATE/CLK] \ -combinational [get_pins EN_GATE/OUT] -add

验证方法

# 检查是否生成多个时钟对象 report_generated_clock [get_pins EN_GATE/OUT]

4. -combinational在混合路径中的精确控制

当信号同时穿越时序单元和组合逻辑时(如某些时钟数据恢复电路),盲目使用-combinational会导致时序分析不完整。某SerDes接口曾因以下约束丢失关键路径检查:

create_generated_clock -name RECOVERED_CLK -combinational \ -source [get_pins CDR/DATA_IN] [get_pins CDR/CLK_OUT]

实际上需要区分处理两种路径:

# 时序路径部分 create_generated_clock -name SYNC_CLK -source [get_pins FF/Q] \ [get_pins MUX/SEL] # 组合路径部分 create_generated_clock -name ASYNC_CLK -combinational \ -source [get_pins MUX/DATA] [get_pins MUX/OUT] -add

电路特征识别技巧

  • 查找路径中的寄存器单元
  • 检查信号是否参与时钟树综合
  • 验证是否存在明确的启动-捕获寄存器对

5. 边沿定义与相位偏移的协同陷阱

使用-edges-edge_shift组合时,数值对应关系极易出错。某DDR接口时钟因以下错误约束导致数据眼图异常:

create_generated_clock -name DDR_CLK -source [get_ports SYS_CLK] \ -edges [1 2 3] -edge_shift [0 1.5] [get_pins PHY/CLK_OUT] # 偏移项不足

修正后的约束需严格匹配边沿数量:

create_generated_clock -name DDR_CLK -source [get_ports SYS_CLK] \ -edges [1 1 3] -edge_shift [0 2.5 0] [get_pins PHY/CLK_OUT]

参数对照表

边沿位置偏移量(ns)对应波形动作
第一个上升沿0基准对齐
第一个下降沿2.5延迟2.5ns产生下降沿
第二个上升沿0回到基准相位

在最近一次28nm项目签核中,修正这五个典型错误使时序收敛周期缩短了37%。建议在项目关键节点使用以下检查清单:

  1. 运行check_timing -verbose验证时钟约束完整性
  2. write_generated_clock_template导出约束模板进行交叉检查
  3. 对复杂时钟结构进行波形可视化确认
# 生成时钟波形示意图 report_clock_tree -generated -waveform
← 返回列表