3. 逻辑资源与LUT结构
PolarFire FPGA 的逻辑资源以“逻辑单元(Logic Element,LE)”为基本粒度组织。每个 LE 内部并不是一个简单的查找表,而是由 4 输入 LUT、专用进位链、可旁路的触发器和若干可配置旁路通路共同构成的复合结构。理解这一结构,是后续做资源估算、时序收敛和面积优化的前提。本节围绕 LUT4 的映射原理、进位链的算术通路、寄存器配置方式,以及分布式 RAM 与移位寄存器的实现机制展开,并给出可操作的资源估算与优化方法。
一、4 输入 LUT 的映射原理
4 输入 LUT 本质上是一块 16×1 的分布式存储阵列,4 个输入作为地址线选中其中一位输出。综合工具把任意 4 变量以内的组合逻辑函数写成真值表,再将该真值表写入 LUT 的 16 个配置位。例如要实现 y = (a & b) | (c & ~d),工具会枚举 a、b、c、d 的 16 种组合,把每种组合下的 y 值填入配置位,运行时输入变化即等价于查表。
关键约束在于“输入数不超过 4”。若一个逻辑函数有 5 个或更多输入,综合器必须把它拆成多个 LUT 级联。例如 y = a&b&c&d&e 需要两级:第一级用 LUT4 计算 t = a&b&c&d,第二级用 LUT4 计算 y = t&e。因此,减少高扇入逻辑、把宽与/或树改写成平衡结构,往往能直接降低 LUT 用量。此外,PolarFire 的部分 LE 支持将 LUT4 与相邻资源组合成更大函数,但基础映射仍以 LUT4 为单位,估算时应以 LUT4 为基准。
二、进位链:算术逻辑的专用通路
加法器、计数器、比较器和累加器如果完全用 LUT 实现,进位需要逐级经过 LUT 和布线,延迟大且占用多。PolarFire 在每个 LE 中提供专用进位链(Carry Chain),进位信号在相邻 LE 之间以极短的专用连线传递,不占用通用布线资源。一个典型的 1 位全加器在 LE 内实现为:LUT4 计算本位和 sum = a ^ b ^ cin,进位链计算 cout = (a & b) | (cin & (a ^ b))。
进位链的方向是固定的,通常自下而上或自左向右贯穿一列 LE。这意味着算术逻辑的布局对性能影响很大:把参与同一次加法的位放在同一列相邻 LE 中,进位延迟最小;若被综合器打散到不同列,进位需要绕行,时序会明显恶化。实践中,对宽加法器或计数器,应尽量让工具保持进位链的连续性,必要时通过位置约束或代码风格(如使用 + 而非手工展开的与或逻辑)引导映射。
三、寄存器配置与旁路
每个 LE 的触发器支持多种配置:可作为普通 D 触发器、可带异步/同步复位或置位、可配置为电平敏感锁存器,也可被旁路使 LE 只输出组合逻辑。触发器时钟可来自全局时钟网络、区域时钟或本地布线,复位/置位极性也可配置。这些配置由综合与布局布线工具根据 RTL 推断结果自动设定,但设计者可以通过代码风格影响推断结果。
一个常见误区是把所有中间信号都打拍,导致寄存器用量激增。实际上,若某段组合逻辑的延迟在时钟周期内可以接受,就不必插入寄存器。反之,对跨时钟域信号,必须使用同步器结构(如两级触发器),此时寄存器不是可选项。资源估算时,寄存器数量通常与 LUT 数量同量级,但纯组合逻辑密集的设计中寄存器占比会明显偏低。
四、分布式 RAM 与移位寄存器
PolarFire 的 LE 除了实现组合逻辑,还可把多个 LUT 的配置存储阵列组织成分布式 RAM(Distributed RAM)或只读存储器。典型配置包括 32×1、64×1 等小容量存储,适合实现小 FIFO、查找表、系数表或状态编码表。分布式 RAM 的优点是就近实现、无需占用专用块 RAM 资源;缺点是容量小、写端口有限,且会消耗本可用于逻辑的 LE。
移位寄存器(SRL)是另一种复用方式:把 LUT 配置为串行移位通路,一个 LE 可提供若干级延迟。例如用 4 个 LUT4 可构成 16 级、每级 1 位的移位寄存器,常用于数据对齐、流水线延迟和滤波器的延迟线。与用触发器逐级打拍相比,SRL 在面积上更省,但需要注意其复位行为和时序特性与触发器不同,不能简单互换。
五、资源估算与优化策略
资源估算的基本方法是:先统计设计中的组合逻辑函数数量与位宽,按每个 LUT4 覆盖 4 输入函数估算 LUT 用量;再统计需要寄存的信号数量估算 FF 用量;对算术逻辑,按位宽估算进位链长度;对存储需求,判断用分布式 RAM 还是块 RAM。以下给出一个示例估算表,参数为合理假设,用于说明方法而非实测结果。
| 资源类型 | 估算依据 | 示例设计用量 | 优化方向 |
|---|---|---|---|
| LUT4 | 组合函数数 × 平均级数 | 约 1200 个 | 减少高扇入、平衡逻辑树 |
| 触发器 FF | 需寄存信号数 | 约 800 个 | 去掉不必要的打拍 |
| 进位链 | 加法器/计数器位宽 | 32 位 × 4 条 | 保持同列连续布局 |
| 分布式 RAM | 小容量存储需求 | 2 块 64×1 | 大容量改用块 RAM |
| 移位寄存器 | 延迟线级数 | 16 级 × 8 位 | 用 SRL 替代逐级 FF |
优化策略可归纳为几条可执行的做法。第一,对宽与/或逻辑,改写为平衡树结构,减少 LUT 级联深度。第二,对算术逻辑,尽量使用 +、- 等运算符让工具推断进位链,避免手工展开成与或逻辑而丢失进位链。第三,对延迟线,优先考虑 SRL 而非逐级触发器。第四,对小容量存储,评估分布式 RAM 与块 RAM 的取舍:容量小于约 64 位且读写简单时用分布式 RAM,容量大或需要双端口时用块 RAM。第五,对跨时钟域信号,保留必要的同步器寄存器,不要为了省资源而省略。
综合来看,PolarFire 的逻辑资源并非“越多越好”,而是要在 LUT、进位链、寄存器和存储之间取得平衡。掌握 LUT4 的映射边界、进位链的布局约束、寄存器的推断规则以及分布式 RAM 与 SRL 的适用场景,才能在资源估算阶段做出合理判断,并在实现阶段有针对性地优化。