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