数字电路基础回顾:组合逻辑与时序逻辑、寄存器传输级(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. 从网表中提取时钟和复位:实战思路
好了,理论讲完了。咱们说说实战中怎么操作。
我个人习惯的步骤是这样的:
- 扫描所有标准单元,找出所有带时钟引脚(CK/CLK)的触发器
- 统计每个信号的扇出,扇出最大的那个大概率是时钟
- 检查触发器的复位引脚,看它们连到哪个公共信号
- 反向追踪时钟源,看是否经过缓冲器或门控逻辑
- 做简单的功能仿真,验证时钟和复位的波形
你可能会问:「如果芯片用了多时钟域怎么办?」嗯,那就更复杂了。每个时钟域要单独分析,还要看跨时钟域的同步电路。这个我们后面章节会专门讲。
一个小工具推荐:我常用Python写脚本,解析网表文件(如Verilog网表或SPICE网表),自动统计信号扇出和连接关系。几百行代码就能搞定,比手动翻网表快多了。
最后说一句:时钟和复位是网表逆向的入口。找到它们,你就找到了芯片的「骨架」。剩下的组合逻辑,不过是骨架上的「血肉」而已。
公众号:蓝海资料掘金营,微信deep3321