4. PolarFire FPGA架构与资源规划

PolarFire 系列 FPGA 的资源规划,本质上不是“把设计塞进去”,而是围绕四类硬核资源与两类全局资源做匹配:逻辑单元(4 输入 LUT + 进位链 + 寄存器)、LSRAM(大容量块 RAM)、uSRAM(微容量分布式块 RAM)、DSP 块(Math Block),以及时钟资源(CCC/PLL、全局网络、区域时钟)与 I/O Bank(含 HSIO/GPIO、SERDES 通道)。规划的目标是让综合、布局布线(P&R)在时序、面积、功耗三个维度同时收敛,而不是仅看“资源占用百分比”。

一、先建立资源账本:把设计需求映射到器件列

PolarFire 的器件结构是“列式”布局:逻辑列、LSRAM 列、uSRAM 列、DSP 列、时钟列与 I/O 环。规划的第一步是建立资源账本,把 RTL 中的存储、运算、接口分别折算成硬核数量。以 MPF300T 为例(示例参数,实际以数据手册为准):约 30 万逻辑单元、约 21 Mb LSRAM、约 5.6 Mb uSRAM、约 924 个 18×18 乘法器 DSP 块。规划时不要只看总量,要看“列分布”——同一功能若跨列过远,布线延迟会显著上升。

一个实用的折算方法是:

  • 存储:按位宽×深度算出总 bit,再除以单块容量。LSRAM 单块 20 Kb(可配置为 512×40 等),uSRAM 单块 1 Kb(可配置为 64×18 等)。
  • 运算:DSP 块按 18×18 乘法累加计,若做 27×27 或浮点需多块级联,需预留 2~4 倍余量。
  • 逻辑:LUT 用量按综合报告估算,但寄存器、进位链、移位寄存器会额外占用,建议预留 20%~30%。
规划顺序建议:先定 I/O Bank 与高速接口位置,再定时钟树,最后把存储与 DSP 就近放在对应列,逻辑填充剩余区域。这样能避免后期因跨 Bank 或跨列导致的时序返工。

二、LSRAM 与 uSRAM 的分工与选型

LSRAM 适合大块、连续、位宽规整的存储,例如帧缓存、查找表、FIFO 主体;uSRAM 适合小容量、分散、低延迟的存储,例如寄存器堆、小 FIFO、系数表、状态缓存。选型时先看深度与位宽:若深度大于 512、位宽大于 18,优先 LSRAM;若深度小于 64、位宽小于 18,优先 uSRAM。混合使用时,注意 LSRAM 的级联会引入额外布线,uSRAM 的分布式特性则更贴近逻辑。

以视频行缓存为例:1920×10 bit 的行缓存约 19.2 Kb,可用 1 块 LSRAM 实现;若拆成 8 个 240×10 bit 的小缓存,则更适合用 uSRAM 分散到逻辑列中,减少单点拥塞。规划时要检查“存储列是否被占满”,若 LSRAM 列已满而 uSRAM 列空闲,可把部分小缓存迁移到 uSRAM,反之亦然。

三、DSP 块与逻辑的协同规划

PolarFire 的 DSP 块支持 18×18 乘法、预加器、累加器与级联,适合 FIR、FFT、矩阵运算。规划时先算乘法器数量:例如 64 阶 FIR、16 通道、采样率 100 MHz,若每通道每周期 1 次乘累加,则需 64×16=1024 个乘法器,超过 MPF300T 的 924 个,必须做时分复用或降阶。此时应把 DSP 块按列分组,让同一通道的乘法器集中在相邻列,减少级联布线。

DSP 块与逻辑的边界也要规划:乘法器前后的加法、饱和、舍入若用逻辑实现,会占用大量 LUT。建议把预加、累加、舍入尽量放进 DSP 块内部,逻辑只做控制与数据搬运。若 DSP 块不足,可用 LUT 实现小位宽乘法,但会显著增加逻辑占用,需重新评估逻辑余量。

PolarFire 资源规划:列式布局与就近映射 器件列(从左到右) 逻辑列 LUT4 + 进位 + 寄存器 控制/状态机 接口逻辑 LSRAM 列 20 Kb/块 大缓存/FIFO 帧缓存 查找表 uSRAM 列 1 Kb/块 小 FIFO 寄存器堆 系数表 DSP 列 18×18 乘法 预加/累加 FIR/FFT 矩阵运算 时钟列 CCC/PLL 全局网络 区域时钟 低抖动 I/O Bank HSIO/GPIO SERDES DDR/PCIe 电压域 控制逻辑就近 小缓存迁移 时钟驱动 I/O 约束 规划原则:先 I/O Bank 与时钟,再存储与 DSP 就近列,逻辑填充剩余;跨列越少,时序越易收敛。 示例器件 MPF300T:约 30 万 LE、21 Mb LSRAM、5.6 Mb uSRAM、924 个 DSP 块(以数据手册为准)。

四、时钟资源规划:从源到负载的层级

PolarFire 的时钟资源分为三级:CCC/PLL 生成时钟、全局网络(Global Network)分发、区域时钟(Regional Clock)覆盖局部。规划时先确定时钟源:外部晶振、SERDES 恢复时钟、内部 PLL。每个 CCC 可生成多路输出,但全局网络数量有限,若时钟域过多,需合并或改用区域时钟。

一个常见问题是“时钟跨 Bank”:若 I/O 输入时钟进入 Bank 后需驱动另一侧逻辑,必须经过全局网络,否则会引入较大偏斜。规划时把同源时钟的负载尽量放在同一区域,减少全局网络占用。对于 100 MHz 以下、负载集中的时钟,可用区域时钟;对于高速 DDR、PCIe,必须用全局网络并做低抖动约束。

五、I/O Bank 规划:电压域与接口位置

I/O Bank 的规划先看电压域:每个 Bank 有独立的 VCCI 电压,同一 Bank 内不能混用不兼容电平。例如 1.8 V 与 3.3 V 不能同 Bank。规划时把同电压、同接口类型的外设放在同一 Bank,减少电平转换。高速接口(DDR、PCIe、SERDES)必须放在支持对应标准的 Bank,并注意参考时钟与收发通道的配对关系。

以 DDR3 为例:数据线、地址线、控制线需在同一 Bank 或相邻 Bank,DQS 与 DQ 的引脚配对必须符合器件手册的字节组规则。规划时先锁定 DDR 引脚,再分配其他低速 I/O,避免后期因引脚冲突导致重新布局。若 Bank 数量不足,可把低速 GPIO 合并到同一 Bank,但需检查驱动能力与同时开关噪声(SSN)。

六、规划检查清单与迭代

完成初版规划后,用以下清单做一次交叉检查:

检查项判断依据调整动作
LSRAM 列是否占满综合报告 LSRAM 使用率 > 85%小缓存迁移到 uSRAM 或优化位宽
DSP 块是否不足乘法器需求 > 器件数量时分复用、降阶或改用 LUT 乘法
全局时钟是否超限时钟域数量 > 全局网络数合并时钟域或改用区域时钟
I/O Bank 电压冲突同 Bank 存在不兼容 VCCI重新分配引脚到不同 Bank
跨列布线是否过多P&R 报告高延迟路径集中在跨列把相关逻辑/存储/DSP 就近重排

规划不是一次性的。建议在 RTL 阶段做一次粗规划,综合后做一次修正,P&R 后再做一次微调。每次迭代都记录资源占用、时钟域数量、Bank 分配与关键路径延迟,形成可追溯的规划日志。这样在后续增加功能或更换器件时,能快速判断瓶颈在哪里,而不是盲目重跑工具。

注意:PolarFire 的 uSRAM 与 LSRAM 在初始化方式、级联规则、时序参数上不同,迁移存储时不能只改例化名,必须重新检查读写延迟与冲突。DSP 块的级联也会引入额外流水线延迟,需同步调整控制逻辑。

总结来说,PolarFire 资源规划的核心是“先定边界、再填内容、就近映射、迭代验证”。把 I/O Bank 与时钟作为固定约束,把 LSRAM、uSRAM、DSP 按列就近分配,逻辑填充剩余空间,最后用综合与 P&R 报告验证时序与面积,才能让设计在资源、功耗与性能之间取得平衡。