3. 可编程逻辑PL架构深入
Versal 的可编程逻辑(PL)并不是“一堆等价的可编程门”,而是由若干功能差异极大的硬核资源拼装成的异构阵列。理解 PL 的第一步,是把它看成一张“资源地图”:CLB 提供组合逻辑与寄存器,进位链提供快速算术,Block RAM 与 UltraRAM 提供不同容量的片上存储,DSP58 提供高吞吐乘加。资源规划的本质,就是判断一段逻辑应该落在哪类资源上,以及这类资源在目标器件里够不够、放得下、跑得动。
CLB:逻辑的基本容器
CLB(Configurable Logic Block)是 PL 中最基础的逻辑单元。在 Versal 中,一个 CLB 通常包含多个 Slice,每个 Slice 内含有查找表(LUT)、触发器(FF)、进位链(Carry Chain)以及宽功能多路复用器。LUT 实现任意组合逻辑函数,FF 负责时序寄存,进位链把相邻 Slice 的算术逻辑串起来形成快速加法/比较结构。因此,CLB 不是“一个逻辑门”,而是一个能同时提供组合、时序和算术能力的复合容器。
LUT 的规模决定了单个逻辑函数的实现能力。以常见的 6 输入 LUT(LUT6)为例,它可以实现任意 6 变量以内的组合函数;当函数变量更多时,需要多个 LUT 级联。这里有一个非常实用的判断:如果一个组合逻辑表达式在综合后映射到超过 4~5 级 LUT,那么它的组合延迟会明显上升,往往需要插入流水寄存器来改善时序。资源规划时,不能只看 LUT 总数,还要看 LUT 的级联深度。
FF 与 LUT 的比例同样关键。不同设计对寄存的需求差异很大:纯组合控制逻辑可能 LUT 多、FF 少;而流水线密集的数据通路则 FF 需求很高。Versal 的 CLB 中 FF 与 LUT 数量大致相当,但若设计中大量使用“打拍”而组合逻辑很浅,就可能出现 FF 先耗尽、LUT 仍有富余的情况。因此,在资源评估阶段应分别统计 LUT、FF、Slice 的占用率,而不是只看一个笼统的“逻辑利用率”。
进位链:算术的快速通道
进位链是 CLB 内专门为算术运算优化的硬连接结构。它把相邻 Slice 的进位输入/输出直接相连,避免进位信号绕行通用布线,从而显著降低加法器、计数器、比较器和累加器的延迟。对于位宽较大的算术操作,综合工具会优先把逻辑映射到进位链上,而不是用普通 LUT 搭建。
进位链的使用有一个重要约束:它沿 Slice 的固定方向级联,因此长位宽算术会占用连续的 Slice 列。如果设计中存在大量宽位加法器或计数器,这些逻辑会集中占用某一区域的进位链资源,可能造成局部拥塞。规划时,应关注进位链的长度和分布,必要时通过插入寄存器切断长进位链,或把宽算术拆分为多级流水。
Block RAM 与 UltraRAM:片上存储的两级层次
Block RAM(BRAM)是 PL 中传统的块状存储资源,通常为 36Kb 或 18Kb 粒度,支持真双端口、多种位宽配置和可选的输出寄存器。它适合实现中小容量的 FIFO、查找表、行缓冲、系数存储等。BRAM 的优点是配置灵活、延迟确定、与逻辑资源耦合紧密;缺点是容量有限,当需要大容量缓存时,数量会迅速成为瓶颈。
UltraRAM(URAM)是 Versal 中更大容量的片上存储资源,单块容量通常为 288Kb,适合实现大容量数据缓冲、视频帧缓存、深度学习激活/权重缓存等。URAM 的位宽和端口配置与 BRAM 不同,使用时需要关注其级联方式和时序特性。一个常见的规划策略是:小容量、多端口、低延迟的存储优先用 BRAM;大容量、连续地址、吞吐优先的存储优先用 URAM。两者不是替代关系,而是层次互补关系。
DSP58 Slice:乘加运算的硬核
DSP58 是 Versal 中的 DSP 硬核,支持 58 位宽的乘法与累加运算,并可在不同精度模式下拆分使用。它适合实现滤波器、矩阵乘、相关器、FFT 蝶形等运算密集型功能。DSP58 的关键价值在于:把乘法、累加、舍入、饱和等操作从 LUT/FF 中解放出来,既节省逻辑资源,又获得更高的频率和更低的功耗。
但 DSP58 不是“万能乘法器”。它的输入位宽、流水级数、累加器结构都有固定模式。若算法中的乘法位宽、符号处理或累加方式与 DSP58 的原生模式不匹配,可能需要额外的逻辑做预处理或后处理,反而降低效率。因此,在资源规划时,应先判断算法能否自然映射到 DSP58 的乘加模式,再决定是否使用 DSP。
资源规划方法:从算法到资源地图
资源规划不是简单地“数一数用了多少 LUT”,而是把算法结构映射到 PL 的异构资源上,并检查各类资源的占用率、时序和布线可行性。一个可操作的流程如下:
- 分解算法:把设计拆成控制逻辑、数据通路、存储和算术四类。控制逻辑主要消耗 LUT/FF;数据通路消耗 FF 和布线;存储消耗 BRAM/URAM;算术消耗 DSP 和进位链。
- 估算资源量:对每类功能给出初步估算。例如,一个 1024 点、16 位复数 FFT 的蝶形运算,可估算需要的 DSP 数量、旋转因子存储的 BRAM 容量、以及流水寄存器的 FF 数量。
- 检查比例:把估算结果与目标器件的资源总量对比,重点关注 LUT/FF 比例、BRAM/URAM 容量、DSP 数量是否匹配。若某一类资源占用率明显偏高,应优先调整算法结构。
- 验证时序与布局:在实现阶段观察进位链长度、BRAM/URAM 的布局位置、DSP 的级联路径,判断是否存在局部拥塞或长路径。
下面这张图把 PL 的主要资源及其关系放在同一张“资源地图”中,便于在规划时快速定位每类逻辑应该落在哪类资源上。
一个可执行的资源估算示例
假设要在 Versal 上实现一个 256 阶 FIR 滤波器,输入 16 位、系数 16 位、输出 32 位,采样率 200 MSPS。可以按以下方式估算:
- DSP:每个抽头一次乘加,256 个抽头需要 256 个乘法。若 DSP58 工作在单乘法模式,则约需 256 个 DSP;若采用时分复用,可减少 DSP 数量,但需要更高的时钟频率。
- BRAM/URAM:系数存储 256×16 位 = 4Kb,可放入一个 18Kb BRAM;若需要多组系数切换,则按组数倍增。
- FF:输入采样移位寄存器 256×16 位 = 4096 个 FF;若采用 BRAM 实现移位寄存器(SRL),可节省 FF,但会消耗 BRAM。
- LUT:控制逻辑、地址生成、舍入饱和等约需数百到数千 LUT,取决于具体实现。
这个例子说明:资源规划不是单一数字,而是 LUT、FF、BRAM、DSP 之间的权衡。把移位寄存器从 FF 改为 BRAM,会减少 FF 但增加 BRAM 占用;把乘法从 DSP 改为 LUT,会节省 DSP 但大幅增加 LUT 和延迟。规划的目标,是找到与目标器件资源分布最匹配的那组选择。
资源规划中的常见误区
第一个误区是只看 LUT 利用率。实际上,FF、BRAM、DSP 的耗尽往往比 LUT 更早发生。第二个误区是忽略进位链的布局约束。宽位加法器会占用连续 Slice 列,若这些位置已被其他逻辑占用,工具只能绕行,导致时序恶化。第三个误区是把 URAM 当作“更大的 BRAM”随意使用。URAM 的端口配置和时序特性与 BRAM 不同,需要按其原生模式设计。第四个误区是低估 DSP58 的预处理开销。若乘法位宽或符号处理与 DSP58 模式不匹配,额外的逻辑可能抵消 DSP 带来的收益。
因此,资源规划应尽早进行,并在实现过程中持续修正。综合后的资源报告、布局后的拥塞报告、时序报告,都是判断规划是否合理的依据。只有把算法结构、资源类型和器件分布三者对齐,PL 设计才能在面积、频率和功耗之间取得稳定平衡。