一、时序检查概述

什么是时序检查?

时序检查,说白了就是验证你的芯片能不能在规定的时钟频率下正常工作。我刚开始做验证那会儿,总觉得时序检查是后端的事,跟我一个仿真验证工程师没啥关系。直到有一次,我负责的一个模块在仿真时一切正常,结果流片回来却频繁出错……嗯,从那以后我再也不敢小看时序检查了。

时序检查的核心,就是确保数据在正确的时间窗口内被正确采样。你可以把它想象成一场接力赛——上一棒选手(发送端)必须在规定时间内把接力棒(数据)交到下一棒选手(接收端)手里。交早了不行,交晚了也不行。

时序检查的本质:验证数据信号相对于时钟边沿的到达时间是否满足触发器的建立时间和保持时间要求。

为什么需要时序检查?

你可能会问:仿真不是已经验证了功能正确吗?为什么还要专门做时序检查?

这里有个关键点:功能仿真默认所有信号都是理想延迟,也就是信号瞬间到达。但实际芯片中,信号从A点传到B点需要时间,这个时间受工艺、电压、温度等因素影响。我在项目中遇到过这样的情况——功能仿真跑了一万遍都没问题,但后仿(带时序信息的仿真)一跑就报错。原因就是信号路径上的延迟导致数据没能在正确的时间窗口内到达。

具体来说,时序检查能帮我们解决以下几个问题:

  • 保证芯片能跑在目标频率——如果时序不满足,芯片要么降频使用,要么直接报废
  • 发现潜在的竞争风险——比如两个信号同时变化导致的亚稳态问题
  • 验证跨时钟域(CDC)路径——不同时钟域之间的数据传输最容易出问题
  • 确认异步复位/置位信号的释放时序——复位释放时机不对,芯片可能直接死机

个人经验:我建议在项目早期就把时序检查纳入验证计划。别等到后仿阶段才想起来,那时候发现问题改起来成本太高了。

Setup/Hold Violation 的概念

说到时序检查,就绕不开两个最基础的概念:建立时间(Setup Time)和保持时间(Hold Time)。

建立时间(Setup Time)

建立时间是指:在时钟有效沿到来之前,数据信号必须保持稳定的最短时间。如果数据在这段时间内发生了变化,触发器就可能无法正确采样。

用大白话说:你必须在考试铃响之前把答案写在答题卡上。铃响前最后一秒还在改答案?对不起,老师可能看不清你写的是什么。

建立时间违例(Setup Violation)通常发生在:

  • 组合逻辑路径太长,信号传播延迟过大
  • 时钟频率太高,留给数据传播的时间不够
  • 工艺角(PVT)变化导致延迟增加

保持时间(Hold Time)

保持时间是指:在时钟有效沿到来之后,数据信号必须保持稳定的最短时间。如果数据变化得太快,触发器同样无法正确锁存。

还是那个考试的例子:铃响之后,你不能马上把答案擦掉重写。老师需要一点时间来确认你写的是什么。

保持时间违例(Hold Violation)通常发生在:

  • 数据路径延迟太小,比时钟路径快太多
  • 时钟偏斜(Clock Skew)导致时钟到达时间不一致
  • 使用了过快的触发器或逻辑单元

注意:我曾经在一个项目中遇到保持时间违例,原因是综合工具优化过度,把一条路径上的缓冲器(Buffer)全优化掉了。结果数据跑得比时钟还快,导致采样错误。所以保持时间违例往往比建立时间违例更难排查。

Setup 和 Hold 的对比

对比项 Setup Violation Hold Violation
发生原因 数据到达太晚 数据变化太快
影响因素 时钟频率、逻辑深度 时钟偏斜、路径延迟差
修复方法 降低频率、减少逻辑级数 插入缓冲器、增加延迟
随PVT变化 慢工艺角更严重 快工艺角更严重
仿真中表现 采样到错误数据 采样到不稳定数据

时序检查在仿真中的实现

在仿真验证中,时序检查通常通过以下方式实现:

  1. SDF反标(SDF Back-Annotation)——把综合或布局布线后的延迟信息反标到仿真模型中
  2. 时序断言(Timing Assertion)——在RTL代码中嵌入$setup、$hold等系统函数
  3. 门级仿真(Gate-Level Simulation)——使用带时序信息的网表进行仿真

举个简单的例子,在Verilog中检查建立时间和保持时间:

// 检查数据d相对于时钟clk的建立时间
specify
  $setup(d, posedge clk, 1.0);  // 建立时间要求1ns
  $hold(posedge clk, d, 0.5);   // 保持时间要求0.5ns
endspecify

这段代码的意思是:在时钟上升沿之前1ns,数据d必须稳定;在时钟上升沿之后0.5ns,数据d也必须稳定。如果仿真过程中违反了这些约束,仿真器会报出时序违例。

避坑指南:我曾经在调试一个时序违例时,发现SDF文件中的延迟值跟预期不符。后来查了半天,原来是反标时用了错误的工艺角文件。所以做时序仿真前,一定要确认SDF文件跟当前仿真场景匹配。

小结

时序检查是数字芯片验证中不可或缺的一环。它不像功能验证那样直观——功能对了就是对了,时序检查更像是在跟物理世界打交道。你想想看,同样的RTL代码,在不同的工艺、电压、温度下,表现可能完全不同。

建立时间和保持时间是最基本的两个时序概念。理解它们,是做好时序验证的第一步。在后续的章节中,我会结合实际项目经验,深入讲解各种时序检查的方法和技巧。

记住一句话:功能正确是芯片能工作的前提,时序正确是芯片能稳定工作的保障。两者缺一不可。