3. 时序基础回顾:组合逻辑与时序逻辑、建立时间与保持时间、时钟周期与路径延迟
做逆向分析,说白了就是在没有原始设计文档的情况下,把网表里的电路逻辑给“读”出来。但不管你怎么读,最终都绕不开一个核心问题——时序。你想想看,一个芯片能不能正常工作,能不能跑到目标频率,全看时序满不满足。我这些年拆过的网表,十有八九的bug都跟时序理解不到位有关。
所以这一节,咱们把时序基础好好捋一捋。别嫌基础,越是基础的东西,越容易在关键时刻掉链子。
3.1 组合逻辑与时序逻辑
先问个问题:网表里那么多标准单元,你怎么一眼看出哪些是组合逻辑,哪些是时序逻辑?
组合逻辑,输出只取决于当前输入。说白了就是“即时响应”——输入一变,输出跟着变。常见的组合逻辑单元有:AND、OR、NAND、NOR、XOR、MUX、AOI(与或非)、OAI(或与非)等等。
时序逻辑,输出不仅取决于当前输入,还取决于之前的状态。它是有“记忆”的。最常见的时序单元就是D触发器(DFF),还有锁存器(Latch)。
关键区别:组合逻辑没有存储能力,时序逻辑有存储能力。在网表里,时序逻辑的输入端通常有一个时钟引脚(CK或CLK),这是最明显的识别标志。
我在项目中遇到过一种情况:有人把锁存器当成了组合逻辑来分析,结果整个路径的时序分析全错了。嗯,这里要注意——锁存器虽然是时序逻辑,但它在电平敏感期间是“透明”的,这个特性经常让人混淆。
举个简单的例子,一个D触发器的Verilog描述:
always @(posedge clk)
q <= d;
这个DFF在时钟上升沿采样数据。而组合逻辑呢,比如一个二输入与门:
assign y = a & b;
没有时钟,没有存储,纯粹的组合。
3.2 建立时间与保持时间
这两个概念,是时序分析的基石。我建议你把它刻在脑子里。
建立时间(Setup Time, Tsu):在时钟有效沿到来之前,数据必须保持稳定的最短时间。
保持时间(Hold Time, Th):在时钟有效沿到来之后,数据必须保持稳定的最短时间。
为什么会这样?因为D触发器内部是靠电容存储电荷的。数据需要提前稳定下来,让电容充到正确的电压(建立时间)。时钟沿来了之后,数据还不能马上撤,得让电容把电荷“锁住”(保持时间)。
避坑指南:我曾经在分析一个老工艺的网表时,发现保持时间违例特别多。后来一查,是因为那个工艺库的保持时间参数给得特别保守。如果你在做逆向分析时发现时序报告里保持时间违例一大堆,先别急着改电路,看看是不是工艺库参数的问题。
建立时间和保持时间的关系,可以用一个简单的时序图来表示:
3.3 时钟周期与路径延迟
时钟周期(Tclk)就是时钟信号重复一次的时间。比如一个1GHz的时钟,周期就是1ns。这个很好理解。
但真正关键的是——路径延迟。一条时序路径,从起点(通常是DFF的时钟端)到终点(下一个DFF的数据输入端),中间经过的所有组合逻辑和互连线的延迟之和,就是路径延迟。
路径延迟必须满足两个条件:
- 建立时间约束: Tclk >= Tck2q + Tcomb + Tsu + Tmargin
- 保持时间约束: Tck2q + Tcomb >= Th + Tmargin
其中:
- Tck2q:时钟到Q输出的延迟
- Tcomb:组合逻辑延迟
- Tsu:建立时间
- Th:保持时间
- Tmargin:时序裕量
个人经验:我习惯在逆向分析时,先找出所有DFF的时钟端,然后沿着数据路径往前推。这样能快速定位关键路径。说白了,关键路径就是延迟最大的那条路,它决定了芯片能跑多快。
举个例子,假设一个路径的Tck2q=0.2ns,Tcomb=0.6ns,Tsu=0.1ns,那么最小时钟周期就是0.2+0.6+0.1=0.9ns,对应的最高频率约1.11GHz。如果实际时钟周期是1ns(1GHz),那还有0.1ns的裕量,没问题。
但如果Tcomb变成了0.7ns,那最小周期就是1.0ns,刚好卡在边界上。这种路径就是关键路径,需要重点关注。
| 参数 | 含义 | 典型值(28nm工艺) |
|---|---|---|
| Tck2q | 时钟到Q输出延迟 | 0.1~0.3 ns |
| Tcomb | 组合逻辑延迟 | 0.2~2.0 ns(取决于逻辑深度) |
| Tsu | 建立时间 | 0.05~0.15 ns |
| Th | 保持时间 | 0.02~0.08 ns |
你想想看,如果保持时间不满足,数据还没锁住就被新数据冲掉了,这叫“保持时间违例”。这种问题在低速下可能测不出来,但一上高频就崩。我见过一个案例,芯片在实验室跑得好好的,到客户那边死活不稳定,最后查出来就是保持时间差了0.01ns。
嗯,这一节的内容就这些。记住:组合逻辑和时序逻辑的区别、建立时间和保持时间的含义、时钟周期和路径延迟的关系——这三样东西,是你在网表逆向分析中每天都要用的。