2. 时序分析基础

各位同学,今天我们来聊聊时序分析里最核心的几个概念。说实话,我刚入行那会儿,觉得时序分析就是跑个工具看看有没有红色报错。直到有一次,一个项目在实验室里怎么都跑不稳,我才真正体会到——不懂时序基础,你连问题出在哪都找不到。

建立时间与保持时间:寄存器的“脾气”

每个寄存器都有两个“脾气”:

  • 建立时间(Tsu):时钟有效沿到来之前,数据必须提前稳定下来的最短时间。
  • 保持时间(Th):时钟有效沿到来之后,数据必须继续稳定的最短时间。

说白了,寄存器就是个“拍照”的家伙。它只在时钟沿那一瞬间采样数据。但你不能在快门按下的瞬间才把数据摆好——它需要一点准备时间(建立时间),拍完之后也不能马上把数据拿走(保持时间)。

核心公式(建立时间检查):

数据到达时间 + Tsetup ≤ 时钟到达时间 + 时钟周期

核心公式(保持时间检查):

数据到达时间 ≥ 时钟到达时间 + Thold

我在项目中遇到过这样一个坑:一个高速接口,时序报告里建立时间余量是正的,但板子就是跑不稳。后来一查,是保持时间违例了。你想想看,建立时间不够,工具会报红色;保持时间不够,有时候工具不报,但芯片就是会随机出错。嗯,这个要特别注意。

时钟偏斜与抖动:时钟不是完美的

理想情况下,时钟信号应该同时到达所有寄存器。但现实是——时钟走线有长度差异,有负载差异,还有工艺偏差。这就引出了两个概念:

  • 时钟偏斜(Skew):同一个时钟沿到达不同寄存器的时间差。说白了就是“时钟走得快慢不一”。
  • 时钟抖动(Jitter):同一个时钟沿在时间轴上的随机波动。说白了就是“时钟沿在抖”。

我的经验:时钟偏斜可以“利用”。如果你把时钟偏斜设计成“有利偏斜”——让接收寄存器的时钟晚到一点点,反而能增加建立时间余量。但保持时间会变差。这是个跷跷板,你得权衡。

我曾经在一个多时钟域的设计里,因为没处理好时钟偏斜,导致跨时钟域的数据总是采样错。后来加了一级同步器,才把问题解决。记住:时钟偏斜是确定的,可以分析;抖动是随机的,只能留余量。

时序路径的组成:三大类路径

时序分析说白了就是检查三类路径:

  1. 输入路径(Input Path):从芯片引脚到第一个寄存器
  2. 寄存器到寄存器路径(Reg-to-Reg Path):从发送寄存器到接收寄存器
  3. 输出路径(Output Path):从最后一个寄存器到芯片引脚

我习惯把这三类路径想象成“三段接力赛”:

  • 输入路径:外部数据跑进芯片,第一棒交给内部寄存器
  • 寄存器到寄存器:数据在内部寄存器之间传递,这是最核心的一段
  • 输出路径:内部寄存器把数据交给芯片引脚,送出去给外部

注意:输入路径和输出路径的约束,需要你告诉工具“外部延迟是多少”。很多新手只约束内部路径,结果芯片内部跑得飞快,但输入输出接口却跟不上。我曾经就吃过这个亏——一个SPI接口,内部逻辑跑200MHz没问题,但输入路径没约束好,结果数据采进来就是错的。

知识体系结构图

下面这张图,是我自己总结的时序分析知识体系。你看一眼,就能明白今天讲的内容在整个时序分析里处于什么位置:

时序分析基础:知识体系 建立时间与保持时间 时钟偏斜与抖动 时序路径组成 建立时间检查 数据到达 + Tsu ≤ 时钟 + T 保持时间检查 数据到达 ≥ 时钟 + Th 违例后果:采样错误 时钟偏斜(Skew) 确定性延迟差异 时钟抖动(Jitter) 随机性时间波动 处理方式:留余量 输入路径 引脚 → 寄存器 寄存器到寄存器 发送 → 接收 输出路径 寄存器 → 引脚 三者共同决定:芯片能否稳定运行 任何一环出问题,时序分析都会报错 注:箭头表示概念之间的依赖关系,虚线表示共同作用于最终结果 掌握这些基础,你就能看懂时序报告,知道该从哪里下手优化

三类路径的约束要点

路径类型 约束命令 关键参数 常见问题
输入路径 set_input_delay 外部延迟、时钟边沿 外部延迟估计不准
寄存器到寄存器 create_clock 时钟周期、时钟偏斜 组合逻辑延迟过大
输出路径 set_output_delay 外部负载、时钟边沿 输出驱动能力不足

我的建议:刚开始做时序约束时,先把寄存器到寄存器路径搞定。这是最核心的部分,也是工具最容易帮你优化的。输入输出路径需要你了解外部器件的时序参数,这个得慢慢积累经验。

好了,今天的内容就到这里。记住:建立时间和保持时间是寄存器的“底线”,时钟偏斜和抖动是现实世界的“不完美”,而三类路径是你需要关注的“战场”。把这些基础打牢,后面学时序约束脚本就会轻松很多。

可可精品资料库