网表解析工具入门:Verilog/VHDL 网表结构、使用 Yosys 进行网表综合与可视化、Netlist 的层次化结构
各位同行,欢迎来到第四讲。前面几章我们聊了网表是什么、怎么读、怎么找关键信号。今天咱们来点实操——上手工具。
说实话,我刚入行那会儿,面对几十万行的门级网表,头都是大的。后来发现,工欲善其事,必先利其器。你光靠肉眼去翻网表,效率太低了。今天我就带大家认识两个核心工具:Yosys 和 Netlist 的层次化结构。
一、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
这几行命令的意思是:
read_verilog:读入网表hierarchy -check:检查模块层次proc:把 always 块转成逻辑门flatten:把层次展平(去掉子模块边界)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 生成的一个简单网表结构图:
注意:Yosys 的 show 命令生成的图形,如果网表太大,可能会非常复杂。我建议先用 select 命令缩小范围,或者用 hierarchy 命令只看顶层模块的接口。
六、避坑指南
最后,分享几个我踩过的坑:
- 不要迷信图形化:Yosys 生成的图形虽然直观,但复杂网表看起来像一团乱麻。我建议图形只用来快速定位,具体分析还是得看代码。
- 注意网表版本:Yosys 对 Verilog 2001 支持很好,但有些老网表用 Verilog 95 语法,可能会报错。遇到这种情况,可以用
read_verilog -sv试试。 - 展平后记得备份:
flatten命令会把层次去掉,但有时候你还需要保留层次信息。我习惯先备份原网表,再展平。
总结一下:Yosys 是网表逆向的瑞士军刀。它能帮你读入、优化、展平、可视化网表。层次化结构是网表的骨架,先看顶层、再看底层,是逆向的黄金法则。
好了,这一讲就到这里。工具只是手段,关键还是你的分析思路。下一讲咱们会深入具体案例,看看怎么用这些工具去逆向一个真实的芯片网表。