数字电路基础回顾:组合逻辑与时序逻辑、寄存器传输级(RTL)与网表的关系、时钟与复位信号识别

各位好,欢迎来到《网表逆向工程》的第二讲。今天我们要聊的,是逆向工程中最基础、也最绕不开的一块——数字电路的基本概念。

你可能会想:「这些我大学都学过,还用再讲?」嗯,我理解。但做逆向和做设计,视角完全不同。设计时你关心功能对不对,逆向时你关心的是——这堆门级网表到底在干什么。所以,我们得换个角度,重新审视这些老朋友。

网表逆向核心基础 组合逻辑 无记忆,输出仅由输入决定 时序逻辑 有记忆,依赖时钟边沿 RTL → 网表 综合工具的行为到结构映射 时钟信号识别 复位信号识别 目标:从门级网表中还原出寄存器传输级行为

1. 组合逻辑 vs 时序逻辑:本质区别在哪?

先问个问题:你拿到一个网表,怎么一眼看出哪些是组合逻辑,哪些是时序逻辑?

组合逻辑,说白了就是「没有记忆」的电路。输入一变,输出立马跟着变。比如与门、或门、加法器。在网表里,你看到的只是一堆逻辑门连来连去,没有反馈环路(至少正常情况下没有)。

时序逻辑就不一样了。它「记得」之前的状态。触发器(Flip-Flop)就是典型代表。输出不仅取决于当前输入,还取决于之前存的值。

逆向工程中的实用判断法则:

  • 组合逻辑:输出路径上只有逻辑门,没有时钟控制的存储单元
  • 时序逻辑:网表中出现带时钟引脚(CK/CLK)的单元,且输出会反馈到输入

我记得有一次逆向一个老芯片的网表,看到一堆门连来连去,以为是纯组合逻辑。结果一仿真,发现输出变化有延迟。仔细一看,原来有个反馈环路藏在里面——那其实是个锁存器(Latch)。所以啊,别光看门类型,要看信号流向

2. 寄存器传输级(RTL)与网表的关系

做逆向的,天天跟网表打交道。但网表是怎么来的?它是从RTL代码综合出来的。

RTL(Register Transfer Level)描述的是「数据在寄存器之间怎么流动、怎么处理」。而网表,是这些描述被映射到具体标准单元库后的结果。

举个例子,一段简单的Verilog:

always @(posedge clk) begin
    if (rst)
        q <= 8'b0;
    else
        q <= d;
end

综合成网表后,你会看到什么?一个8位的D触发器阵列,每个触发器有一个时钟引脚连到clk,一个复位引脚连到rst,数据输入是d[7:0],输出是q[7:0]。但中间可能还插入了扫描链(scan chain)的逻辑——这是逆向时容易踩的坑。

我的个人习惯:拿到网表后,先找所有带时钟引脚的单元。把它们标记出来,剩下的就是组合逻辑。这样一下子就把电路分成了「记忆体」和「计算逻辑」两块。

你想想看,RTL是行为级的描述,网表是结构级的实现。逆向的本质,就是从结构反推行为。说白了,我们要把一堆门级连线,还原成「什么时候数据从哪个寄存器传到哪个寄存器」的时序行为。

3. 时钟信号识别:网表中的「心跳」

时钟是数字电路的脉搏。没有时钟,时序逻辑就是一潭死水。在网表里,时钟信号通常有这些特征:

特征 说明 逆向识别技巧
扇出极大 时钟会连到大量触发器的CK引脚 找网表中连线数量最多的信号
命名规律 常包含 clk、clock、CK、CLK 等关键词 直接搜索这些关键词(但注意混淆)
驱动来源 通常来自PLL、时钟缓冲器或顶层输入 反向追踪信号源,看是否经过缓冲树
波形特征 仿真时呈现周期性方波 用EDA工具做简单仿真验证

我曾经遇到过一个芯片,时钟信号被故意重命名成了「data_sel_0」。乍一看以为是个普通数据选择信号。但一查扇出——好家伙,连了上千个触发器。这明显是时钟。所以,别只看名字,要看连接关系

避坑指南:有些芯片会使用门控时钟(gated clock),即时钟经过一个与门后再送到触发器。这种情况下,时钟路径上会有额外的组合逻辑。我曾经因为这个,把门控时钟误认成了数据信号,浪费了两天时间。

4. 复位信号识别:芯片的「重启键」

复位信号和时钟一样重要。它决定了芯片上电后从哪里开始跑。在网表里,复位信号通常连到触发器的复位端(RN、RST、CLR等)。

复位有两种常见类型:

  • 同步复位:只在时钟边沿有效。网表中表现为复位信号参与触发器的数据路径逻辑。
  • 异步复位:立即生效,不依赖时钟。网表中表现为复位信号直接连到触发器的异步复位引脚。

怎么区分?看网表里触发器的引脚定义。如果复位信号连到的是类似「CDN」「RN」这样的引脚,那就是异步复位。如果连到的是数据路径上的逻辑门,那就是同步复位。

实用技巧:找复位信号,可以先找所有触发器的复位引脚,然后看它们连到哪个公共信号上。如果所有触发器的复位引脚都连到同一个信号,那基本就是全局复位了。

嗯,这里要注意一点:有些芯片为了省面积,会把某些触发器的复位引脚悬空(不接)。这意味着这些寄存器上电后状态不确定。逆向时如果遇到这种情况,要特别小心——可能是个状态机,也可能是个随机数发生器

5. 从网表中提取时钟和复位:实战思路

好了,理论讲完了。咱们说说实战中怎么操作。

我个人习惯的步骤是这样的:

  1. 扫描所有标准单元,找出所有带时钟引脚(CK/CLK)的触发器
  2. 统计每个信号的扇出,扇出最大的那个大概率是时钟
  3. 检查触发器的复位引脚,看它们连到哪个公共信号
  4. 反向追踪时钟源,看是否经过缓冲器或门控逻辑
  5. 做简单的功能仿真,验证时钟和复位的波形

你可能会问:「如果芯片用了多时钟域怎么办?」嗯,那就更复杂了。每个时钟域要单独分析,还要看跨时钟域的同步电路。这个我们后面章节会专门讲。

一个小工具推荐:我常用Python写脚本,解析网表文件(如Verilog网表或SPICE网表),自动统计信号扇出和连接关系。几百行代码就能搞定,比手动翻网表快多了。

最后说一句:时钟和复位是网表逆向的入口。找到它们,你就找到了芯片的「骨架」。剩下的组合逻辑,不过是骨架上的「血肉」而已。


公众号:蓝海资料掘金营,微信deep3321