时序约束入门:SDC文件结构、时钟定义与IO约束
大家好,我是你们的讲师。今天咱们聊聊时序约束的入门内容。说实话,我刚入行那会儿,觉得SDC文件就是个麻烦事,随便写几条就完事了。结果呢?后端同事天天来找我,说时序跑不过。后来我才明白——时序约束,是芯片设计的“法律条文”。你不写清楚,工具就不知道该怎么干活。
1. SDC文件结构:约束的骨架
SDC,全称Synopsys Design Constraints。说白了,就是告诉EDA工具:
“我的芯片要跑多快?数据什么时候来?什么时候走?”
一个典型的SDC文件,我习惯把它分成三大块:
- 时钟约束:定义时钟周期、波形、抖动
- IO约束:定义输入输出延迟
- 例外约束:定义false path、multicycle path等
我个人习惯把SDC文件按模块拆分。比如top.sdc只放顶层约束,子模块的约束单独放。这样后期调试时,一眼就能找到问题在哪。
2. 时钟定义:create_clock
时钟是时序分析的“心跳”。没有时钟,STA就没法跑。
最基本的写法:
create_clock -name clk_sys -period 10.0 [get_ports clk]
这条命令的意思是:
- 创建一个叫clk_sys的时钟
- 周期10ns(也就是100MHz)
- 端口是clk
嗯,这里要注意:时钟的占空比默认是50%。如果你的时钟不是50%占空比,需要显式指定:
create_clock -name clk_ddr -period 5.0 -waveform {0 2.5} [get_ports ddr_clk]
这个-waveform参数,第一个值是上升沿时间,第二个值是下降沿时间。单位是ns。
你可能会问:多个时钟源怎么办?比如芯片有外部晶振,还有内部PLL。那就分别定义:
create_clock -name clk_osc -period 20.0 [get_ports osc_in]
create_clock -name clk_pll -period 5.0 [get_pins pll/clk_out]
工具会自动分析它们之间的跨时钟域路径。
3. 生成时钟:create_generated_clock
生成时钟,说白了就是从已有时钟分频或倍频出来的时钟。比如PLL输出、分频器输出。
举个例子:
create_generated_clock -name clk_div2 -source [get_ports clk_in] \
-divide_by 2 [get_pins divider/q]
这条命令告诉工具:
- clk_div2是从clk_in分频得到的
- 分频系数是2
- 输出引脚是divider/q
我曾经遇到过一个坑:生成时钟的-source要写对。如果你写成了分频器的输入引脚,工具会认为这是另一个时钟源,导致时序分析出错。
生成时钟还有几个常用参数:
- -multiply_by:倍频系数(比如PLL)
- -invert:反相时钟
- -edges:自定义边沿关系
比如一个2倍频的PLL输出:
create_generated_clock -name clk_pll_2x -source [get_ports clk_in] \
-multiply_by 2 [get_pins pll/clk_out]
4. 输入延迟与输出延迟约束
这部分是新手最容易懵的。输入延迟和输出延迟,说白了就是告诉工具:芯片外面的数据是什么时候来的,什么时候走的。
4.1 输入延迟
输入延迟,是指数据从外部芯片发出,到到达我们芯片输入引脚的时间。
set_input_delay -clock clk_sys -max 2.0 [get_ports data_in]
set_input_delay -clock clk_sys -min 0.5 [get_ports data_in]
这里:
- -max:最大延迟(setup检查用)
- -min:最小延迟(hold检查用)
- 单位是ns
你想想看,为什么要有max和min?因为外部芯片的延迟不是固定的。温度、电压变化都会影响。所以我们要给一个范围。
T_input_delay = T_co(外部芯片时钟到输出延迟) + T_pcb(PCB走线延迟)
我一般会留20%的裕量,防止实际板子有偏差。
4.2 输出延迟
输出延迟正好相反,是数据从我们芯片输出,到被外部芯片采样的时间。
set_output_delay -clock clk_sys -max 3.0 [get_ports data_out]
set_output_delay -clock clk_sys -min 1.0 [get_ports data_out]
输出延迟的计算公式:
T_output_delay = T_setup(外部芯片建立时间) + T_pcb(PCB走线延迟)
嗯,这里要注意:输出延迟的参考时钟,是外部芯片的采样时钟。如果外部芯片用的是我们输出的时钟,那就要用那个时钟作为参考。
set INPUT_DELAY_MAX 2.0set INPUT_DELAY_MIN 0.5这样后期调整时,改一个地方就行。
5. 知识体系图
下面这张图,是我自己总结的时序约束知识体系。你可以把它当成一张“地图”,随时回来对照:
6. 实战小贴士
最后,分享几个我这些年积累的经验:
- 先写时钟,再写IO:时钟是基础,没有时钟,IO约束就没法写。
- 用report_timing验证:写完约束后,跑一下report_timing,看看路径是不是按你期望的方式分析。
- 不要过度约束:我曾经见过有人把false path写了一大堆,结果把关键路径给false掉了。流片回来芯片不工作,查了两个月才发现是约束写错了。
- 版本管理:SDC文件一定要纳入版本管理。每次修改都要写changelog。
好了,这一章的内容就到这里。时序约束入门,说白了就是三件事:定义时钟、定义IO、定义例外。把这三点搞明白,你就已经掌握了STA的80%。剩下的,就是在项目中慢慢积累经验了。
可可精品资料库