第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 # 看网表图用的
嗯,这里要注意:flex和bison是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),别轻易用 rewrite 或 resyn 命令。我吃过这个亏——优化完的网表虽然小了,但跟原始设计对不上了。
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 知识体系总览
下面这张图,是我自己总结的逆向工程环境搭建的完整流程。你照着这个走,不会迷路。
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