第三节:网表结构基础——门级网表的构成与时钟复位单元
各位同学,今天咱们聊聊门级网表。这东西说白了,就是芯片设计的「施工图纸」。RTL 代码是建筑师的概念图,而门级网表就是给施工队看的钢筋水泥布置图。
我刚开始接触逆向工程时,面对一堆门级网表,说实话,头大。但后来发现,只要抓住几个关键点,这东西其实挺有规律的。
3.1 门级网表长什么样?
门级网表,本质上是一个文本文件。它描述的是:哪些标准单元被使用了,它们之间怎么连线的。
举个例子,一个简单的 D 触发器(DFF)在网表里可能是这样的:
DFF_X1 U_FF1 ( .CK(clk), .D(data_in), .Q(data_out) );
你看,这行代码告诉了我们三件事:
- 单元类型:DFF_X1 —— 这是一个 D 触发器,驱动能力为 X1
- 实例名:U_FF1 —— 这个单元在电路里的名字
- 端口连接:.CK(clk) 表示时钟引脚接在 clk 网络上
我个人习惯,拿到网表第一件事,就是先扫一遍所有的单元类型。看看有哪些 DFF、哪些 latch、哪些 buffer。这能快速判断出设计的大致风格。
3.2 标准单元库里的时钟与复位单元
标准单元库,你可以把它想象成一个乐高零件箱。里面摆满了各种功能的小积木。对于时钟和复位网络,我们最关心的是以下几类:
3.2.1 时钟缓冲器(Clock Buffer)
时钟信号在芯片里要跑很长的距离,还要驱动很多触发器。信号会衰减,会变形。这时候就需要时钟缓冲器来「接力」。
常见的时钟缓冲器有:
- CLKBUF_X1, CLKBUF_X2:普通时钟缓冲器,数字越大驱动能力越强
- CLKINV_X1:时钟反相器,用于产生反相时钟
- ICG_X1:集成时钟门控单元,这个后面会重点讲
关键点:时钟缓冲器和普通缓冲器有什么区别?
说白了,时钟缓冲器在版图设计上更讲究。它的上升沿和下降沿的延迟更对称,占空比失真更小。我在项目中遇到过,有人用普通 buffer 代替时钟 buffer,结果时钟占空比歪了,芯片直接没法正常工作。
3.2.2 复位单元
复位信号负责把电路初始化到一个已知状态。常见的复位单元有:
| 单元名称 | 功能描述 | 典型应用场景 |
|---|---|---|
| DFF_X1 | 不带复位的 D 触发器 | 数据路径,不需要复位 |
| DFFR_X1 | 带异步复位的 D 触发器 | 复位信号不依赖时钟 |
| DFFS_X1 | 带异步置位的 D 触发器 | 需要初始化为高电平 |
| DFFRN_X1 | 带异步低电平有效复位的 D 触发器 | 低电平复位设计 |
嗯,这里要注意:复位信号的名字往往能透露很多信息。比如叫 rst_n 的,大概率是低电平有效;叫 reset 的,可能是高电平有效。但别太相信名字,我见过太多命名不规范的设计了。
3.2.3 时钟门控单元(ICG)
ICG 是低功耗设计里的明星单元。它的作用很简单:当不需要时钟时,把时钟关掉。
一个典型的 ICG 单元内部结构是这样的:
// 集成时钟门控单元的内部逻辑
// 输入:CLK, EN
// 输出:GCLK
// 实际上是一个 latch + AND 门
latch (EN, CLK, EN_LATCHED);
AND (CLK, EN_LATCHED, GCLK);
为什么用 latch 而不用触发器?因为 latch 是电平敏感的,可以避免毛刺。我曾经在逆向一个低功耗芯片时,发现整个时钟树里密密麻麻全是 ICG 单元。那感觉,就像在迷宫里找路标一样。
3.3 如何快速识别时钟和复位网络?
拿到网表后,我一般按这个步骤来:
- 找全局信号:扫描网表里出现频率最高的网络名。通常
clk、clock、rst、reset这些名字会反复出现。 - 找特殊单元:搜索
CLKBUF、ICG、DFFR这些关键词。它们的位置就是时钟和复位的「骨架」。 - 追踪扇出:从时钟输入端口开始,一路追踪 buffer 链。看看哪些单元被同一个时钟信号驱动。
小技巧:在大型网表里,直接用文本搜索 .CK( 可以快速找到所有触发器的时钟引脚连接。再用 .RN( 或 .SN( 找到复位和置位引脚。
3.4 知识体系结构图
下面这张图,是我自己总结的门级网表分析框架。你看一眼,心里就有谱了:
3.5 避坑指南
我曾经踩过的坑,你们别踩了:
- 别信名字:网表里叫
clk的不一定是时钟,可能是数据信号。一定要看它连到了什么单元上。 - 注意电平极性:复位信号有高有效和低有效之分。搞反了,整个分析就全错了。
- 小心时钟门控:ICG 单元的输出才是真正的时钟。别把 ICG 的输入时钟当成最终时钟。
好了,这一节的内容就这些。记住,门级网表分析的核心就是:认单元、追连线、找结构。多练几次,你也能一眼看出门道。
公众号:蓝海资料掘金营,微信deep3321