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 能帮你做两件事:

  1. 逻辑简化:把复杂的布尔表达式化简成最简形式
  2. 技术映射:把通用逻辑映射到目标工艺库

我记得有一次,从某款芯片里提取的网表有 10 万个节点。用 ABC 的 resyn2 脚本跑一遍,节点数直接降到 6 万。嗯,这省了我大量手动分析的时间。

注意:ABC 的优化可能会改变网表的结构。如果你需要保持原始逻辑的对应关系,记得在优化前备份一份原始网表。我曾经因为没备份,结果优化后的网表跟原始行为对不上,排查了两天才发现是优化过度了。

4.3 Vivado Tcl:厂商工具的正统玩法

如果你逆向的是 Xilinx 的芯片,Vivado Tcl 是绕不开的。它不像 Yosys 那样通用,但胜在原生支持 Xilinx 的所有原语和属性。

我一般用 Vivado Tcl 做两件事:

  • 读取设计数据open_checkpoint 加载 DCP 文件,然后用 get_cellsget_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,配合 pyverilogverilog-parser 库。

自定义脚本适合的场景:

  • 特殊格式解析:比如某些厂商自定义的网表格式
  • 批量重命名:把无意义的信号名改成有意义的名称
  • 模式匹配:查找特定结构的逻辑(比如加法器、状态机)

我的经验:不要一开始就写大而全的脚本。先用手动方式分析一小块网表,搞清楚结构后,再写脚本自动化。我曾经一上来就写了个 500 行的解析器,结果发现解析逻辑完全错了,白白浪费了两天。

4.5 工具链选型对比

为了方便你选择,我整理了一张对比表:

工具 优势 劣势 推荐场景
Yosys 开源、灵活、支持多种格式 对厂商原语支持有限 通用网表预处理、逻辑分析
ABC 逻辑优化能力强 学习曲线陡峭 大规模网表化简
Vivado Tcl 原生支持 Xilinx 器件 仅限 Xilinx 平台 Xilinx 芯片逆向
自定义脚本 完全可控、可定制 开发成本高 特殊格式、批量处理

4.6 我的推荐组合

如果你问我个人怎么选,我的答案是:Yosys + ABC 打底,Vivado Tcl 辅助,自定义脚本兜底

具体来说:

  1. 先用 Yosys 读入网表,做初步的层次化展开和信号重命名
  2. 如果网表规模大,丢给 ABC 做逻辑优化
  3. 需要厂商特定信息时,用 Vivado Tcl 提取
  4. 遇到工具搞不定的,写 Python 脚本处理

这套组合我用了三年,基本覆盖了 90% 的逆向场景。剩下的 10%,嗯,那就得靠经验和耐心了。

一句话总结:工具是死的,人是活的。别迷信某个工具,也别排斥某个工具。根据手头的网表特点,灵活搭配才是正道。

网表解析工具链选型流程图 原始网表 厂商类型? 非Xilinx Xilinx Yosys 预处理 Vivado Tcl ABC 逻辑优化 自定义脚本(Python)兜底处理 最终输出:标准化、可分析的网表

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