4. 网表解析工具链:Yosys、ABC、Vivado Tcl、自定义脚本工具选型
做FPGA逆向,工具选型是个大问题。我见过不少新手,一上来就想着自己写脚本解析网表,结果折腾两周连个基本模块都没拆出来。其实,选对工具链,你的效率能翻好几倍。
今天咱们聊聊市面上主流的几套工具,以及我个人的使用心得。
4.1 Yosys:开源界的瑞士军刀
Yosys 是我最常用的工具之一。它最初是为数字综合设计的,但逆向工程里同样好用。为什么?因为它能读入 Verilog 网表,还能做各种转换和优化。
我个人习惯用 Yosys 做网表预处理。比如,把厂商的加密网表转成标准格式,或者把 LUT 级别的网表映射成更高级的单元。
核心用法:
- 读入网表:
read_verilog netlist.v - 层次化展开:
flatten - 统计单元:
stat - 输出修改后的网表:
write_verilog output.v
我在项目中遇到过一个问题:某款国产 FPGA 的网表里,所有寄存器都被重命名成了 _R_xxx 格式。用 Yosys 的 rename 命令,几行脚本就恢复了可读性。
小技巧:Yosys 的 proc 命令可以把行为级描述转换成寄存器传输级,这对理解控制逻辑特别有帮助。
4.2 ABC:逻辑优化的幕后英雄
ABC 是 Berkeley 开发的逻辑综合与验证工具。它和 Yosys 经常搭配使用。说白了,Yosys 负责前端处理,ABC 负责后端优化。
你想想看,逆向出来的网表往往很乱——冗余逻辑、重复单元到处都是。ABC 能帮你做两件事:
- 逻辑简化:把复杂的布尔表达式化简成最简形式
- 技术映射:把通用逻辑映射到目标工艺库
我记得有一次,从某款芯片里提取的网表有 10 万个节点。用 ABC 的 resyn2 脚本跑一遍,节点数直接降到 6 万。嗯,这省了我大量手动分析的时间。
注意:ABC 的优化可能会改变网表的结构。如果你需要保持原始逻辑的对应关系,记得在优化前备份一份原始网表。我曾经因为没备份,结果优化后的网表跟原始行为对不上,排查了两天才发现是优化过度了。
4.3 Vivado Tcl:厂商工具的正统玩法
如果你逆向的是 Xilinx 的芯片,Vivado Tcl 是绕不开的。它不像 Yosys 那样通用,但胜在原生支持 Xilinx 的所有原语和属性。
我一般用 Vivado Tcl 做两件事:
- 读取设计数据:
open_checkpoint加载 DCP 文件,然后用get_cells、get_nets遍历网表 - 提取约束信息:时序约束、位置约束,这些在逆向分析中很有价值
实战片段:
# 打开已综合的设计
open_checkpoint synth.dcp
# 列出所有 LUT 及其输入
foreach cell [get_cells -hier -filter {PRIMITIVE_TYPE =~ "SLICE.LUT*"}] {
set inputs [get_pins -of $cell -filter {DIRECTION == IN}]
puts "$cell: [join [get_property NAME $inputs] ", "]"
}
为什么会推荐用 Vivado Tcl?因为有些属性,比如 INIT 值(LUT 的查找表内容),只有通过厂商工具才能直接读取。Yosys 读 Xilinx 的网表时,这些信息可能会丢失。
4.4 自定义脚本:最后的杀手锏
工具再强,也有覆盖不到的地方。这时候就得自己写脚本了。我常用的语言是 Python,配合 pyverilog 或 verilog-parser 库。
自定义脚本适合的场景:
- 特殊格式解析:比如某些厂商自定义的网表格式
- 批量重命名:把无意义的信号名改成有意义的名称
- 模式匹配:查找特定结构的逻辑(比如加法器、状态机)
我的经验:不要一开始就写大而全的脚本。先用手动方式分析一小块网表,搞清楚结构后,再写脚本自动化。我曾经一上来就写了个 500 行的解析器,结果发现解析逻辑完全错了,白白浪费了两天。
4.5 工具链选型对比
为了方便你选择,我整理了一张对比表:
| 工具 | 优势 | 劣势 | 推荐场景 |
|---|---|---|---|
| Yosys | 开源、灵活、支持多种格式 | 对厂商原语支持有限 | 通用网表预处理、逻辑分析 |
| ABC | 逻辑优化能力强 | 学习曲线陡峭 | 大规模网表化简 |
| Vivado Tcl | 原生支持 Xilinx 器件 | 仅限 Xilinx 平台 | Xilinx 芯片逆向 |
| 自定义脚本 | 完全可控、可定制 | 开发成本高 | 特殊格式、批量处理 |
4.6 我的推荐组合
如果你问我个人怎么选,我的答案是:Yosys + ABC 打底,Vivado Tcl 辅助,自定义脚本兜底。
具体来说:
- 先用 Yosys 读入网表,做初步的层次化展开和信号重命名
- 如果网表规模大,丢给 ABC 做逻辑优化
- 需要厂商特定信息时,用 Vivado Tcl 提取
- 遇到工具搞不定的,写 Python 脚本处理
这套组合我用了三年,基本覆盖了 90% 的逆向场景。剩下的 10%,嗯,那就得靠经验和耐心了。
一句话总结:工具是死的,人是活的。别迷信某个工具,也别排斥某个工具。根据手头的网表特点,灵活搭配才是正道。
公众号:蓝海资料掘金营,微信deep3321