网表解析工具入门:Verilog/VHDL 网表结构、使用 Yosys 进行网表综合与可视化、Netlist 的层次化结构

各位同行,欢迎来到第四讲。前面几章我们聊了网表是什么、怎么读、怎么找关键信号。今天咱们来点实操——上手工具。

说实话,我刚入行那会儿,面对几十万行的门级网表,头都是大的。后来发现,工欲善其事,必先利其器。你光靠肉眼去翻网表,效率太低了。今天我就带大家认识两个核心工具:YosysNetlist 的层次化结构

一、Verilog / VHDL 网表长什么样?

先别急着上工具,咱们得先搞清楚网表本身的结构。说白了,网表就是一堆 模块(module)连线(wire) 的集合。

我举个例子,一个简单的 D 触发器网表,用 Verilog 写出来大概是这样:

module dff (clk, d, q);
  input clk, d;
  output q;
  reg q;
  always @(posedge clk) q <= d;
endmodule

这是 RTL 级的。但综合成门级网表后,会变成这样:

module dff_gate (clk, d, q);
  input clk, d;
  output q;
  wire n1, n2;
  NAND2 U1 (.A(d), .B(clk), .Y(n1));
  NAND2 U2 (.A(n1), .B(clk), .Y(n2));
  NAND2 U3 (.A(n1), .B(n2), .Y(q));
endmodule

看到了吗?RTL 是行为描述,门级网表是结构描述。每个门(NAND2、INV、DFF)都是标准单元库里的实例化。连线(wire)就是它们之间的信号。

核心要点:网表逆向的第一步,就是识别出这些标准单元。你不需要记住每个门的真值表,但要知道常见门(NAND、NOR、INV、DFF)的符号和功能。

二、Yosys 是什么?为什么选它?

Yosys 是一个开源的 Verilog 综合工具。你可能觉得「综合」是前端设计的事,跟逆向有什么关系?

关系大了。Yosys 能帮你做三件事:

  • 读入网表:支持 Verilog 2001、SystemVerilog 子集
  • 优化与转换:比如把门级网表转成更易读的形式
  • 可视化:生成图形化的电路图

我个人习惯用 Yosys 来做网表的「预处理」。比如你拿到一个混乱的网表,先用 Yosys 跑一遍 synth,它会自动把冗余逻辑去掉,把层次展平。嗯,这一步能省你不少时间。

三、用 Yosys 进行网表综合与可视化

咱们直接上手。假设你有一个网表文件 top.v,里面包含几个子模块。你想看看它的结构,怎么办?

打开终端,输入:

yosys
read_verilog top.v
hierarchy -check
proc
flatten
show -format dot -prefix top_netlist

这几行命令的意思是:

  1. read_verilog:读入网表
  2. hierarchy -check:检查模块层次
  3. proc:把 always 块转成逻辑门
  4. flatten:把层次展平(去掉子模块边界)
  5. show:生成 DOT 格式的图形文件

然后你可以用 Graphviz 把 DOT 文件转成 PNG 或 SVG:

dot -Tpng top_netlist.dot -o top_netlist.png

打开图片,你就能看到整个网路的连接图了。说实话,我第一次看到自己逆向的网表变成图形时,那种感觉——就像拼图终于拼上了最后一块。

小技巧:如果网表太大,图形会乱成一团。我建议先用 flatten 展平,再用 select 命令只显示某个子模块。比如 select t:my_module 只显示名为 my_module 的模块。

四、Netlist 的层次化结构

网表不是一坨平铺的代码,它是有层次的。就像一本书有章、节、段一样,网表也有顶层模块、子模块、叶子模块。

举个例子,一个 SoC 芯片的网表可能长这样:

top
├── cpu_core
│   ├── alu
│   ├── regfile
│   └── ctrl
├── memory_controller
│   ├── arbiter
│   └── ddr_phy
└── peripheral_bus
    ├── uart
    ├── spi
    └── gpio

每个子模块内部又包含更小的单元。逆向的时候,你不需要一开始就钻进最底层。我建议先看顶层,搞清楚模块间的连接关系,再逐层深入。

为什么会这样?因为很多芯片设计者会在顶层用「胶连逻辑」把各个 IP 粘起来。你找到这些胶连逻辑,就能快速定位关键信号。

我曾经逆向过一个加密芯片,顶层网表有 5000 多行。我一开始直接看底层,结果越看越晕。后来用 Yosys 的 hierarchy 命令把层次列出来,才发现顶层只有 3 个主要模块:控制模块、运算模块、存储模块。嗯,方向一下子就清晰了。

五、实战:用 Yosys 分析层次化网表

咱们来点实际的。假设你有一个网表 aes_top.v,你想知道它有哪些子模块,以及它们之间的连接。

在 Yosys 里输入:

yosys
read_verilog aes_top.v
hierarchy -check
write_verilog -noattr aes_top_flat.v

这会生成一个展平后的网表 aes_top_flat.v。然后你可以用 show 命令生成图形:

show aes_top -format dot -prefix aes_top

生成的 DOT 文件里,每个子模块会显示为一个方框,连线就是信号。你可以用 Graphviz 打开,或者用在线工具查看。

下面是我用 Yosys 生成的一个简单网表结构图:

网表层次化结构示例 top (顶层) cpu_core memory_ctrl periph_bus alu regfile arbiter ddr_phy uart/spi 顶层模块 子模块 叶子模块 图:网表层次化结构示意图(Yosys 生成)

注意:Yosys 的 show 命令生成的图形,如果网表太大,可能会非常复杂。我建议先用 select 命令缩小范围,或者用 hierarchy 命令只看顶层模块的接口。

六、避坑指南

最后,分享几个我踩过的坑:

  • 不要迷信图形化:Yosys 生成的图形虽然直观,但复杂网表看起来像一团乱麻。我建议图形只用来快速定位,具体分析还是得看代码。
  • 注意网表版本:Yosys 对 Verilog 2001 支持很好,但有些老网表用 Verilog 95 语法,可能会报错。遇到这种情况,可以用 read_verilog -sv 试试。
  • 展平后记得备份flatten 命令会把层次去掉,但有时候你还需要保留层次信息。我习惯先备份原网表,再展平。

总结一下:Yosys 是网表逆向的瑞士军刀。它能帮你读入、优化、展平、可视化网表。层次化结构是网表的骨架,先看顶层、再看底层,是逆向的黄金法则。

好了,这一讲就到这里。工具只是手段,关键还是你的分析思路。下一讲咱们会深入具体案例,看看怎么用这些工具去逆向一个真实的芯片网表。


专注资料整理