网表基础与格式解析:Verilog网表结构、EDIF格式、SPICE网表、Liberty库文件解析

做网表逆向这么多年,我最大的感触就是——你得先看懂别人留下的「乐高说明书」。网表就是这份说明书。它把芯片里成千上万个晶体管、标准单元、连线关系,用特定的格式记录下来。今天咱们就把四种最常见的网表格式掰开揉碎,看看它们到底长什么样。

Verilog网表结构:最熟悉的陌生人

Verilog网表,说白了就是用Verilog语言描述的门级连接关系。你写RTL代码时用的是always块、assign语句,但综合之后生成的网表,全是and、or、nand、flip-flop这些基本单元。

我刚开始做逆向时,拿到一个几百万门的Verilog网表,打开一看密密麻麻全是实例化语句。嗯,这时候千万别慌,抓住三个核心要素就行:

  • 模块声明:每个网表文件最外层肯定有个module...endmodule
  • 端口定义:input、output、inout,告诉你信号从哪里来、到哪里去
  • 实例化语句:这是网表的主体,每个标准单元怎么连、连到哪

给你看个典型的例子:

module top (clk, rst_n, data_in, data_out);
  input  clk, rst_n;
  input  [7:0] data_in;
  output [7:0] data_out;

  wire [7:0] net_a, net_b;

  // 实例化一个D触发器
  DFF_X1 u_dff0 (
    .CK(clk),
    .D(data_in[0]),
    .Q(net_a[0])
  );

  // 实例化一个与门
  AND2_X1 u_and0 (
    .A(net_a[0]),
    .B(rst_n),
    .Z(net_b[0])
  );
endmodule

注意看,每个实例化单元的名字(比如u_dff0)后面跟着的是标准单元库里的名字(DFF_X1)。括号里就是端口映射关系。我在项目中遇到过有人把端口顺序搞反了,结果仿真怎么都不对。所以我的习惯是:拿到网表先检查端口映射,别急着往下看。

小技巧:逆向时如果网表太大,可以用grep命令先提取所有实例化语句,看看用了哪些标准单元类型。这能帮你快速判断设计的大致规模。

EDIF格式:EDA工具的通用语言

EDIF(Electronic Design Interchange Format)是EDA工具之间交换网表的标准格式。说实话,这玩意儿可读性很差,但你在逆向工作中一定会碰到它。

EDIF文件的结构有点像Lisp语言,全是括号嵌套括号。核心结构是这样的:

(edif top
  (edifVersion 2 0 0)
  (cell top
    (cellType GENERIC)
    (view netlist
      (viewType NETLIST)
      (interface
        (port clk (direction INPUT))
        (port data_in (direction INPUT))
        (port data_out (direction OUTPUT))
      )
      (contents
        (instance u_dff0
          (cellRef DFF_X1 (libraryRef std_cells))
        )
        (net net_a
          (joined
            (portRef clk (instanceRef u_dff0))
            (portRef D (instanceRef u_dff0))
          )
        )
      )
    )
  )
)

你看,EDIF用cell表示模块,instance表示实例化,net表示连线。每个net下面用joined把端口连起来。我刚开始看EDIF时头都大了,后来发现一个规律:先找cell定义,再看instance引用,最后追net连接。按这个顺序来,再复杂的EDIF也能理清楚。

注意:EDIF格式对大小写敏感,而且不同EDA工具生成的EDIF在细节上可能有差异。我曾经被一个EDIF文件坑过——它把端口名里的下划线全替换成了连字符,害我查了半天。

SPICE网表:晶体管级的终极真相

如果你做的是模拟电路逆向,或者数字芯片的底层分析,SPICE网表是绕不过去的。它描述的是晶体管级别的连接关系,精度最高,但信息量也最大。

SPICE网表的基本单元是器件模型:MOS管用M开头,电阻用R,电容用C。每个器件后面跟着它的节点连接关系:

* 一个简单的反相器网表
.SUBCKT inv A Y VDD VSS
M1 Y A VSS VSS NMOS W=0.5u L=0.18u
M2 Y A VDD VDD PMOS W=1.0u L=0.18u
.ENDS inv

* 主电路
X1 A B VDD VSS inv
X2 B C VDD VSS inv

这里M1和M2是MOS管,X1和X2是子电路调用。每个MOS管有四个节点:漏极、栅极、源极、衬底。W和L是宽长比参数。

我个人习惯在做SPICE网表逆向时,先用HSPICE或Spectre跑一遍DC仿真,确认每个节点的电压状态。这能帮你快速定位哪些管子是导通的,哪些是截止的。有一次我逆向一个运放,就是靠这个方法找到了偏置电路的结构。

核心要点:SPICE网表里,节点编号或名称就是连线的标识。同一个节点名出现在不同器件上,说明它们物理上是连在一起的。逆向时建议用电路图软件(比如Cadence Composer)把网表导入成原理图,可视化之后好理解得多。

Liberty库文件:标准单元的「身份证」

Liberty文件(.lib)不是网表,但它和网表逆向密不可分。它记录了每个标准单元的时序、功耗、面积等信息。你拿到一个网表,想知道某个单元是干嘛的,查.lib文件就对了。

一个典型的.lib文件结构如下:

library (my_library) {
  delay_model : "table_lookup";
  cell (DFF_X1) {
    area : 10.5;
    pin (CK) {
      direction : input;
      capacitance : 0.02;
    }
    pin (D) {
      direction : input;
      capacitance : 0.015;
    }
    pin (Q) {
      direction : output;
      function : "IQ";
      timing () {
        related_pin : "CK";
        timing_type : "rising_edge";
        cell_rise (delay_template_7x7) {
          index_1 ("0.1, 0.2, 0.5, 1.0, 2.0, 5.0, 10.0");
          index_2 ("0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1.0");
          values ( \
            "0.12, 0.15, 0.20, 0.28, 0.40, 0.65, 1.10", \
            ...
          );
        }
      }
    }
  }
}

你看,每个cell下面有area(面积)、pin(引脚)信息。每个pin有direction(方向)、capacitance(电容)。最关键的是timing部分,它告诉你从时钟沿到输出变化的延迟时间。

我在逆向时经常用.lib文件来验证自己的判断。比如看到一个单元叫DFF_X1,查.lib发现它有CK、D、Q三个引脚,而且Q的输出函数是"IQ"(即Q = D在时钟上升沿采样),那基本可以确定这是个D触发器。

避坑指南:我曾经遇到过一个.lib文件里把某个单元的area写成了0,结果综合工具报错。后来发现是库文件版本不匹配。所以拿到.lib文件后,先检查一下版本号和工具兼容性,别一上来就闷头用。

四种格式的关系与选择

这四种格式各有各的用途,我画了张图帮你理清它们之间的关系:

网表格式关系图 Verilog网表 门级连接描述 EDIF格式 EDA交换标准 SPICE网表 晶体管级描述 Liberty库 单元时序/功耗 可转换 可转换 提供单元定义 逆向时:Verilog/EDIF看结构 → SPICE看细节 → Liberty查参数

实际工作中,我的流程一般是这样的:

  1. 先看Verilog或EDIF:了解顶层模块划分和信号流向
  2. 遇到关键路径再查SPICE:确认晶体管级的实现细节
  3. 随时翻Liberty库:确认每个标准单元的功能和时序

说白了,这四种格式就是不同抽象层次的「语言」。你掌握得越熟练,逆向时就越能快速定位问题。我见过有人只懂Verilog网表,结果碰到EDIF就傻眼了。所以我的建议是:四种格式都要会看,但不用每种都精通。根据你手头的项目需求,选一两种作为主攻方向就行。

总结一下:网表逆向的第一步,就是能读懂别人留下的「乐高说明书」。Verilog网表最直观,EDIF最通用,SPICE最底层,Liberty库最辅助。把这四种格式吃透了,后面分析逻辑功能、恢复电路结构就轻松多了。


专注资料整理