3、FPGA架构基础:LUT、FF、BRAM、DSP、IO、路由资源

做逆向工程,你得先知道手里这块芯片长什么样。

FPGA说白了就是一大片可编程的逻辑单元,外加一堆硬核IP。我刚开始接触逆向时,以为FPGA就是个“万能芯片”,后来拆开一个Xilinx的片子,用显微镜一看——好家伙,密密麻麻的格子,跟城市地图似的。

这一章,咱们就把FPGA的六大核心资源掰开揉碎讲清楚。你搞懂了这些,后面看网表、还原RTL代码,心里就有底了。

3.1 LUT——查找表,FPGA的“大脑细胞”

LUT,全称Look-Up Table,查找表。它是FPGA里最基础的计算单元。

你可以把LUT想象成一个“真值表”。输入几个信号,输出一个结果。比如一个4输入LUT,它有16种输入组合,每种组合对应一个输出值。这16个值存在SRAM里,输入信号就是地址,直接查表输出。

核心要点:

  • LUT本质上是一个小容量RAM(2ⁿ × 1 bit)
  • 常见规格:4输入LUT、5输入LUT、6输入LUT
  • 一个LUT可以实现任意n输入组合逻辑

我在逆向一个通信芯片时,发现一个模块用了大量6输入LUT。当时我纳闷:为什么不用更小的LUT?后来一分析,原来是为了减少逻辑级数,提升时序性能。嗯,这里要注意:LUT输入越多,面积越大,但延迟反而可能更小。

个人经验:

我曾经在逆向一个老款Altera芯片时,发现它的LUT是4输入的。但新款的Xilinx已经用6输入LUT了。如果你在网表中看到大量LUT被级联使用,说明设计者可能在用老架构的芯片,或者逻辑优化没做好。

3.2 FF——触发器,时序逻辑的基石

LUT负责组合逻辑,FF(Flip-Flop)负责时序逻辑。说白了,FF就是存一个比特的寄存器。

每个LUT后面通常跟着一个FF,它们俩组成一个“逻辑单元”(Slice或Logic Element)。LUT算完结果,可以立即存入FF,等下一个时钟沿再输出。

FF有几个关键参数:

  • 时钟边沿:上升沿触发还是下降沿触发
  • 复位方式:同步复位还是异步复位
  • 使能信号:有没有CE(Clock Enable)

我见过一个坑:某逆向项目里,网表显示FF用的是异步复位,但还原出的RTL代码写的是同步复位。结果仿真对不上。后来查了半天,发现是工具在综合时把同步复位优化成了异步复位——因为异步复位面积更小。所以,你看到的网表不一定和原始RTL一一对应。

避坑指南:

我曾经在逆向一个军工级FPGA时,发现它的FF支持“双沿触发”(DDR)。这种FF在普通芯片里很少见。如果你遇到,说明这个设计对吞吐率要求极高,或者是在做高速接口。

3.3 BRAM——块RAM,片上存储的“水库”

LUT和FF只能存少量数据。要存大量数据,得靠BRAM(Block RAM)。

BRAM是FPGA内部专用的SRAM块。常见规格有:

厂商 BRAM大小 典型配置
Xilinx 36Kb 可拆成两个18Kb
Altera/Intel 20Kb M20K块
Lattice 18Kb EBR块

BRAM可以配置成单口RAM、双口RAM、FIFO、ROM等。在逆向工程中,识别BRAM的配置方式非常关键。比如,一个双口RAM,一端写一端读,很可能是个FIFO;如果两端都读写,那可能是共享内存。

我记得有一次逆向一个视频处理芯片,里面用了大量BRAM做行缓冲。每个BRAM存一行图像数据,总共1080行。通过分析BRAM的地址映射关系,我反推出了图像的分辨率和像素格式。

实用技巧:

在网表中,BRAM的初始化内容(INIT值)往往包含关键信息。比如一个ROM的初始化数据,可能就是查找表或微代码。把这些数据dump出来,用Python解析,经常能发现设计者的“小心思”。

3.4 DSP——数字信号处理单元

DSP Slice是FPGA里的“硬核计算器”。它专门做乘法、加法、乘累加这些运算。

为什么不用LUT做乘法?因为LUT做乘法太费资源了。一个16×16的乘法器,用LUT实现需要几百个逻辑单元,而DSP Slice一个周期就搞定。

典型的DSP Slice包含:

  • 一个乘法器(18×18或25×18)
  • 一个加法器/累加器
  • 若干流水寄存器

在逆向工程中,DSP的配置模式能告诉你很多信息。比如:

  • 如果DSP配置成“乘法+累加”,那很可能是个FIR滤波器
  • 如果配置成“乘法+加法”,那可能是FFT的蝶形运算
  • 如果多个DSP级联,那可能是高精度乘法或复数乘法

我曾经逆向一个雷达信号处理芯片,里面用了上百个DSP Slice。通过分析它们的连接关系,我还原出了一个128点的FFT处理器。嗯,这个过程就像拼图一样,很有意思。

个人建议:

如果你在网表中看到DSP的输入数据位宽是18位,输出是48位,那基本可以断定这是个乘累加器。因为18×18=36,累加后扩展到48位,这是标准套路。

3.5 IO——输入输出,芯片的“嘴巴和耳朵”

IO资源是FPGA和外界通信的通道。每个IO引脚背后都有一堆可配置的电路。

IO资源主要包括:

  • 输入缓冲:LVCMOS、LVDS、HSTL等电平标准
  • 输出缓冲:驱动能力可调
  • IOB(IO Block):包含寄存器,可实现DDR输入输出
  • 延迟单元:可编程延迟,用于调整时序

在逆向工程中,IO配置是突破口。比如:

  • 如果某个IO配置成LVDS,那它大概率是高速差分信号
  • 如果IO配置成ODDR模式,那它可能是DDR内存接口
  • 如果IO内部有大量延迟链,那它可能是源同步接口

我记得有一次,一个客户拿来一块板子,说某个FPGA的IO烧了。我通过分析IO的配置,发现它被设置成了3.3V的LVCMOS输出,但实际外接设备是1.8V的。这就是典型的电平不匹配——IO资源虽然灵活,但用错了会出大问题。

注意:

IO资源里有个东西叫“IOB寄存器”。它可以把输入信号延迟半个时钟周期,实现DDR采样。如果你在网表中看到IOB寄存器被使用,说明这个接口跑得很快,至少是几百兆赫兹。

3.6 路由资源——FPGA的“高速公路网”

前面说的LUT、FF、BRAM、DSP、IO,它们之间怎么连接?靠的就是路由资源。

路由资源是FPGA里最复杂的部分,也是逆向工程中最难啃的骨头。它主要包括:

  • 连线:各种长度和方向的金属线
  • 开关矩阵:可编程的连接点
  • PI(Programmable Interconnect):可编程互连点

路由资源分层次:

  • 本地路由:同一个Slice内部的连接
  • 短距离路由:相邻几个Slice之间的连接
  • 长距离路由:跨芯片的长线
  • 全局路由:时钟、复位等全局信号

在逆向工程中,分析路由可以帮你理解信号的流向。比如,一个信号走了长距离路由,说明它要跨越很远的逻辑区域;如果走了本地路由,那说明它只在局部使用。

我曾经在逆向一个网络处理器时,发现一个控制信号走了全局路由。我一开始以为它是时钟,后来一分析,发现它是个“全局使能”信号——设计者用全局路由来降低延迟,保证所有模块同时响应。

核心观点:

路由资源决定了FPGA的“可布线性”。一个设计能不能跑得通,很多时候不取决于逻辑资源够不够,而取决于路由资源够不够。我见过一个项目,逻辑用了80%,但路由用了95%,结果布局布线死活过不了。

3.7 知识体系总览

下面这张图,把FPGA的六大资源串起来了。你仔细看看,它们之间是怎么配合的。

FPGA六大核心资源架构图 FPGA芯片 路由资源(可编程互连网络) LUT FF BRAM DSP IO IO LUT FF BRAM DSP IO 路由

这张图里,LUT和FF是“逻辑细胞”,BRAM是“存储水库”,DSP是“计算引擎”,IO是“对外接口”,路由是“交通网络”。它们组合在一起,构成了一个完整的FPGA。

做逆向工程时,你得学会“看资源说话”。看到大量LUT+FF,说明是控制逻辑;看到BRAM,说明有数据缓存;看到DSP,说明有数学运算;看到IO配置,说明有外部接口。把这些信息拼起来,你就能还原出芯片的“骨架”。

好了,这一章就到这里。记住这六大资源,后面咱们开始实战——从比特流里把这些资源一个个挖出来。


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