第4章:逆向工程环境搭建:Linux工具链安装、Yosys与ABC工具入门、Python解析库准备

好,咱们直接进入正题。做芯片逆向,环境搭不好,后面全是白费功夫。我见过太多人,工具链装到一半就放弃了,或者装完了跑不通,卡在环境上浪费好几天。今天我就把这条路给你趟平了。

4.1 为什么选Linux?

说白了,芯片逆向工具链几乎都是Linux原生的。Windows上也能跑,但各种依赖问题会让你怀疑人生。我个人习惯用Ubuntu 20.04 LTS或22.04 LTS,稳定,社区活跃,遇到问题一搜就有答案。

核心原则:别在Windows上折腾WSL2跑Yosys,直接装双系统或虚拟机。我踩过这个坑——WSL2的IO性能在解析大网表时,慢得你想砸键盘。

4.2 基础工具链安装

先把地基打牢。打开终端,一行一行敲,别偷懒。

sudo apt update
sudo apt upgrade -y
sudo apt install -y build-essential git cmake
sudo apt install -y tcl-dev tk-dev flex bison
sudo apt install -y libreadline-dev libffi-dev
sudo apt install -y python3 python3-pip python3-venv
sudo apt install -y graphviz xdot  # 看网表图用的

嗯,这里要注意:flexbison是Yosys编译时必须的,很多人漏掉。我曾经帮一个学生远程调试,他卡在编译报错上整整两天,最后发现就是没装这两个包。

4.3 Yosys:网表逆向的瑞士军刀

Yosys是什么?它能把Verilog网表读进来,做综合、优化、技术映射,还能输出各种中间格式。做逆向时,我们最常用它来把门级网表转成逻辑图,或者提取层次结构。

4.3.1 从源码编译Yosys

我建议从源码编译,别用apt直接装。为什么?因为apt版本太老,很多新功能没有。

git clone https://github.com/YosysHQ/yosys.git
cd yosys
make -j$(nproc)
sudo make install

编译大概5-10分钟,喝杯咖啡的功夫。完成后验证一下:

yosys -V
# 输出类似:Yosys 0.33+ (git sha1 ...)

我的小技巧:编译时加 ENABLE_ABC=1 参数,这样会把ABC工具直接编译进去。省得后面再单独装。

make ENABLE_ABC=1 -j$(nproc)

4.3.2 Yosys基本用法

咱们来个最简单的例子。假设你有一个门级网表 top.v,想看看里面有哪些模块:

yosys> read_verilog top.v
yosys> hierarchy -check
yosys> flatten
yosys> show -prefix top_graph -format dot

这会生成一个 top_graph.dot 文件,用 xdot 打开就能看到电路图。我第一次用这个功能时,感觉像打开了新世界的大门——原来芯片内部长这样。

4.4 ABC工具:逻辑优化的幕后英雄

ABC是伯克利开发的逻辑综合与验证工具。Yosys内部集成了它,但有时候我们需要单独调用。比如做技术映射,或者把网表转成AIG(And-Inverter Graph)格式。

4.4.1 安装ABC

如果你编译Yosys时没加 ENABLE_ABC=1,可以单独装:

git clone https://github.com/berkeley-abc/abc.git
cd abc
make -j$(nproc)
sudo cp abc /usr/local/bin/

4.4.2 ABC实战:网表简化

假设你有一个复杂的网表,想看看能不能简化。用ABC读入,跑一遍优化:

abc> read bench/c17.bench
abc> strash
abc> rewrite
abc> print_stats
# 输出类似:c17 : i/o = 5/2  lat = 0  nd = 6  edge = 12

你看,nd = 6 表示有6个节点。优化后可能变成5个。别小看这一个节点的减少,在大芯片里,这种优化能帮你找到冗余逻辑,甚至发现隐藏的后门。

注意:ABC的优化算法会改变网表结构。如果你在做精确逆向(比如恢复原始RTL),别轻易用 rewriteresyn 命令。我吃过这个亏——优化完的网表虽然小了,但跟原始设计对不上了。

4.5 Python解析库准备

Yosys和ABC是重型武器,但日常的网表解析、格式转换、数据提取,我更喜欢用Python。灵活,快速,想怎么折腾都行。

4.5.1 必备库安装

pip3 install pyverilog
pip3 install lark-parser
pip3 install networkx
pip3 install matplotlib
pip3 install numpy

pyverilog 用来解析Verilog网表,lark-parser 可以自定义解析器(比如解析自定义格式),networkx 用来做图分析——网表本质上就是个图嘛。

4.5.2 实战:用Python提取网表结构

来个实际例子。假设你有一个Verilog网表,想提取所有模块的端口和连线:

from pyverilog.vparser.parser import parse

ast, _ = parse(['top.v'])
for module in ast.description.modules:
    print(f"模块名: {module.name}")
    for port in module.ports:
        print(f"  端口: {port.name}")
    for item in module.items:
        if item.__class__.__name__ == 'Assign':
            print(f"  连线: {item.lhs.name} <= {item.rhs.name}")

这段代码会输出类似:

模块名: top
  端口: clk
  端口: rst_n
  端口: data_in
  端口: data_out
  连线: n1 <= a
  连线: n2 <= b

我的经验:解析大型网表(几百万门那种)时,pyverilog 可能会有点慢。这时候我一般先用Yosys把网表转成JSON格式,再用Python解析JSON。速度能快10倍以上。

yosys> write_json top.json

4.6 知识体系总览

下面这张图,是我自己总结的逆向工程环境搭建的完整流程。你照着这个走,不会迷路。

逆向工程环境搭建知识体系 基础Linux环境 Ubuntu 20.04/22.04 编译工具链 build-essential, git, cmake 核心工具 Yosys + ABC Python解析库 pyverilog lark-parser, networkx Yosys核心功能 read_verilog hierarchy, flatten, show ABC逻辑优化 strash, rewrite print_stats 输出格式 Verilog / JSON / DOT / AIG

4.7 避坑指南

最后,分享几个我这些年踩过的坑,你遇到了能少走弯路。

  • Python版本问题:别用Python 2.7,很多库已经不兼容了。我建议用Python 3.8以上。
  • Yosys编译报错:如果遇到 tcl.h not found,检查一下 tcl-dev 装了没。我遇到过三次这种问题,都是粗心漏装了。
  • ABC内存溢出:处理超大网表时,ABC可能会吃掉几十GB内存。这时候加 -M 8000 参数限制内存使用(单位MB)。
  • 网表编码问题:有些EDA工具生成的Verilog是GBK编码,Linux下解析会乱码。用 iconv -f GBK -t UTF-8 转一下。

一句话总结:环境搭建就像盖房子打地基,别嫌麻烦。把今天讲的这些装好、跑通,后面30章的内容你才能玩得转。


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