3. SDC约束入门:时钟定义、时钟不确定性、输入输出延迟

好,咱们今天聊聊SDC约束。说实话,很多刚入行的朋友觉得写约束就是走个过场,随便抄几个命令完事。我当年也这么干过,结果呢?流片回来芯片跑不到目标频率,查了三天才发现是时钟定义少了个参数。从那以后,我对SDC再也不敢马虎了。

3.1 时钟定义:create_clock

时钟是时序分析的“心跳”。没有时钟,STA根本没法干活。最基本的命令就是create_clock

create_clock -name clk -period 10 -waveform {0 5} [get_ports clk_in]

这条命令干了三件事:

  • -name:给时钟起个名字,方便后面引用。我个人习惯用信号名,比如clksys_clk
  • -period:时钟周期,单位ns。10ns对应100MHz。
  • -waveform:定义上升沿和下降沿的位置。默认是50%占空比,也就是{0 5}。

你可能会问:波形参数能不能不写?可以。但我不建议你偷这个懒。为什么?因为有些工具默认波形是{0 period/2},但万一你用的工具版本不一样,默认值变了呢?我在项目中就吃过这个亏,两个工具对同一个SDC解析结果不同,查了半天才发现是波形默认值不一致。

重要原则:时钟定义要精确到每个细节。哪怕你确定是50%占空比,也请把-waveform写出来。这是专业习惯。

3.2 时钟不确定性:clock uncertainty

时钟不确定性,说白了就是给时序分析留点余量。真实芯片里,时钟信号不可能完美无缺——有抖动、有偏差、有工艺波动。这些都会吃掉你的时序裕量。

set_clock_uncertainty -setup 0.2 [get_clocks clk]
set_clock_uncertainty -hold 0.05 [get_clocks clk]

这里要注意:setup和hold的uncertainty通常不一样。setup留的余量更大,因为setup对时钟抖动更敏感。hold的uncertainty可以小一些,因为hold主要受局部偏差影响。

我记得有一次,一个同事把setup uncertainty设成了0.5ns,结果所有路径都报violation。他跑来问我怎么回事。我一看,他的时钟周期才2ns,0.5ns的uncertainty占了25%!这显然不合理。后来我们改成0.15ns,问题就解决了。

我的经验:对于普通设计,setup uncertainty取时钟周期的3%~5%比较合理。hold uncertainty取0.05~0.1ns就够了。当然,具体数值要跟后端团队对齐,他们手里有更精确的工艺数据。

3.3 输入延迟:set_input_delay

芯片不是孤岛。它要跟外部器件通信。输入延迟描述的就是:数据从外部时钟沿到芯片输入引脚,中间花了多少时间。

set_input_delay -clock clk -max 2.5 [get_ports data_in]
set_input_delay -clock clk -min 1.0 [get_ports data_in]

这里有两个关键点:

  • -max:最大延迟,用于setup分析。数据来得越晚,setup越紧张。
  • -min:最小延迟,用于hold分析。数据来得越早,hold越容易出问题。

你想想看,如果外部器件输出数据需要1~2ns,PCB走线再花0.5ns,那输入延迟就是1.5~2.5ns。这个范围要跟系统工程师确认,不能自己瞎猜。

避坑指南:我曾经遇到一个案例,输入延迟设得太乐观(只设了1ns),结果芯片在低温下hold violation。因为低温下外部器件输出变快,数据提前到达,芯片内部hold检查就过不去了。所以,min值一定要留够余量。

3.4 输出延迟:set_output_delay

输出延迟跟输入延迟是对称的。它描述的是:芯片输出数据到外部器件,需要提前多久准备好。

set_output_delay -clock clk -max 2.0 [get_ports data_out]
set_output_delay -clock clk -min 0.5 [get_ports data_out]

这里有个容易混淆的地方:输出延迟是相对于时钟沿的“提前量”。比如-max 2.0,意思是数据必须在时钟沿前2.0ns就稳定下来,这样外部器件才能正确采样。

嗯,这里要注意:输出延迟的参考点是芯片内部的时钟。所以你要确保时钟定义正确,否则输出延迟算出来全是错的。

3.5 实战小贴士

最后分享几个我常用的检查方法:

  1. 先看时钟:用report_clock检查时钟定义是否正确。我每次都会跑一遍这个命令,确认period、waveform、uncertainty都对了再往下走。
  2. 输入输出延迟要成对检查:输入延迟对应外部器件的输出延迟,输出延迟对应外部器件的建立/保持时间。两边要对得上。
  3. 留点余量:SDC里的数值不要卡着边界设。比如外部器件要求setup time是1ns,你设输出延迟1.2ns,给自己留0.2ns的余量。这样即使工艺波动也不怕。

好了,这一章的内容就这些。时钟定义、不确定性、输入输出延迟,这三块是SDC的基石。你把这几个命令用熟了,后面学生成时钟、多周期路径什么的就轻松多了。