第二章:STA基础回顾——建立时间与保持时间、时序路径分类、时钟域与跨时钟域
各位同学,咱们今天聊聊STA的基础。说实话,这部分内容看起来简单,但很多工程师工作三五年了,遇到建立时间违例还是抓瞎。我自己的经验是,基础不牢,地动山摇。咱们先把这几个核心概念掰扯清楚。
2.1 建立时间与保持时间——触发器的“脾气”
触发器这玩意儿,说白了就是个“听话”的存储单元。但它有个脾气:你得在时钟沿到来之前,把数据稳稳地送到它门口,而且时钟沿之后,数据还得再待一会儿才能走。这就是建立时间和保持时间的由来。
建立时间(Setup Time, Tsu):时钟有效沿到来之前,数据必须保持稳定的最短时间。
保持时间(Hold Time, Th):时钟有效沿到来之后,数据必须保持稳定的最短时间。
我刚开始做设计时,总觉得保持时间无所谓。直到有一次,一个简单的计数器在高温下疯狂出错,查了三天才发现是保持时间违例。嗯,从那以后我再也不敢小看保持时间了。
为什么会发生违例?你想想看:
- 建立时间违例:路径太长,组合逻辑太多,数据跑得太慢,没赶上时钟沿。
- 保持时间违例:路径太短,数据跑得太快,把上一拍的数据冲掉了。
这里有个经验公式,我个人习惯记在笔记本上:
建立时间检查:Tclk >= Tcq + Tcomb + Tsu - Tskew
保持时间检查:Tcq + Tcomb >= Th + Tskew
其中Tskew是时钟偏斜。注意看,建立时间公式里Tskew是减号,保持时间公式里是加号。这个符号千万别搞反了,我曾经见过一个工程师把符号弄反,结果修了半个月的时序。
避坑指南:我曾经在项目里遇到一个奇葩问题——建立时间裕量明明够,但芯片就是跑不到目标频率。后来发现是时钟树综合时,工具把时钟偏斜做得太大了。记住,时钟偏斜是把双刃剑,太大太小都不行。
2.2 时序路径分类——四种路径,四种套路
STA把时序路径分成四类。说白了,就是看起点和终点分别是什么。我习惯用“源-目标”来记忆:
| 路径类型 | 起点 | 终点 | 典型场景 |
|---|---|---|---|
| reg2reg | 寄存器时钟端 | 寄存器数据端 | 流水线、状态机 |
| reg2out | 寄存器时钟端 | 输出端口 | 数据输出到片外 |
| in2reg | 输入端口 | 寄存器数据端 | 片外数据输入 |
| in2out | 输入端口 | 输出端口 | 纯组合逻辑路径 |
你想想看,这四种路径的约束方法完全不一样:
- reg2reg:最省心,只要设好时钟周期,工具自动算。
- reg2out:需要设output delay,告诉工具片外器件要等多久。
- in2reg:需要设input delay,告诉工具片外数据什么时候到。
- in2out:最麻烦,通常用set_max_delay约束,因为没时钟参考。
注意:in2out路径在STA里经常被忽略。我见过一个项目,所有in2out路径都没约束,结果芯片在低温下输出数据不稳定。记住,只要芯片有输入直接到输出的路径,就必须约束。
2.3 时钟域与跨时钟域——同步与异步的博弈
时钟域,说白了就是被同一个时钟(或同源时钟)驱动的所有寄存器集合。跨时钟域(CDC),就是数据从一个时钟域跑到另一个时钟域。
为什么CDC这么重要?因为两个时钟的频率、相位可能完全不同。数据从快时钟域到慢时钟域,或者反过来,都可能出问题。最典型的就是亚稳态——数据在时钟沿附近变化,导致采样结果不确定。
我个人习惯把CDC问题分成两类:
- 单比特CDC:用两级同步器(双触发器)搞定。
- 多比特CDC:用异步FIFO或者握手协议。
这里有个常见的误区:很多人以为两级同步器能解决所有CDC问题。其实不然。你想想看,如果数据变化太快,两级同步器也只能降低亚稳态概率,不能完全消除。而且,多比特信号用两级同步器同步,会导致数据错位。
单比特CDC标准电路(两级同步器):
always @(posedge clk_dst or negedge rst_n) begin
if (!rst_n) begin
sync_reg1 <= 1'b0;
sync_reg2 <= 1'b0;
end else begin
sync_reg1 <= data_src;
sync_reg2 <= sync_reg1;
end
end
注意,这里data_src是源时钟域的信号,sync_reg2是同步到目标时钟域后的信号。两级寄存器之间不能有任何组合逻辑,否则会破坏同步效果。我曾经在代码审查时看到有人在这两级之间插了个与门,差点没把我气晕过去。
避坑指南:我曾经在一个项目中,用异步FIFO处理多比特CDC。结果仿真没问题,上板就出错。查了三天发现是FIFO的读指针同步到写时钟域时,格雷码转换出了bug。记住,异步FIFO的核心是格雷码,格雷码的每一位必须单独同步。
最后,咱们用一张图来总结本章的知识体系:
这张图把咱们今天讲的内容串起来了。三大模块——建立时间与保持时间、时序路径分类、时钟域与跨时钟域,每个模块都有各自的核心知识点。你想想看,STA说白了就是围绕这三件事展开的:检查时间是否够、路径是否对、时钟域是否安全。
好了,今天就到这儿。记住,STA不是跑个脚本就完事的,你得理解背后的原理。下次遇到时序违例,先想想是建立时间还是保持时间,再想想是哪条路径,最后看看是不是跨时钟域的问题。按这个思路排查,90%的问题都能搞定。
可可精品资料库