1. PolarFire SoC架构总览

PolarFire SoC 是 Microchip 面向中低功耗嵌入式与工业场景推出的异构 SoC 平台。它的核心特征不是“把 CPU 和 FPGA 放在同一颗芯片里”这么简单,而是把一颗基于 RISC-V 指令集的实时处理器集群、可编程逻辑(FPGA fabric)、DDR 存储子系统、丰富外设以及一套可配置的中断拓扑,通过片内总线结构紧密耦合在一起。理解这套架构,是后续软硬件协同开发的前提:你必须清楚哪些功能适合放在 U54 应用核上跑操作系统,哪些实时任务交给 Mi-V/E51 监控核,哪些数据通路必须走 FPGA fabric,以及中断、DMA、存储访问在软硬件之间如何交接。

一、处理器集群:U54 与 E51 的分工

PolarFire SoC 的处理器子系统(MSS)包含一个五核 RISC-V 集群:四个 U54 应用核和一个 E51 监控核。U54 是 64 位、带 MMU、支持完整 Linux 的乱序执行核;E51 是 32 位、无 MMU、面向实时确定性任务的顺序执行核。四个 U54 通常运行 Linux 或 RTOS,承担网络协议栈、文件系统、图形界面、复杂算法等任务;E51 则常驻运行裸机或轻量 RTOS,负责启动管理、看门狗、实时控制、安全监控,甚至在 Linux 启动前完成外设初始化。

这种“4+1”结构带来的关键协同边界是:U54 集群与 E51 之间通过片内总线通信,而不是共享同一套缓存一致性域。U54 之间有一致性缓存,但 E51 与 U54 之间没有硬件缓存一致性。因此,当 E51 与 U54 共享数据时,软件必须显式处理缓存维护(如 flush/invalidate)或使用非缓存内存区域。这是软硬件协同中第一个必须明确的接口约定。

二、FPGA fabric:可编程逻辑与处理器的耦合方式

FPGA fabric 是 PolarFire SoC 的另一半主体。它通过 AXI 总线与 MSS 相连,典型接口包括:MSS 到 fabric 的 AXI 主接口(处理器访问 fabric 中的寄存器或存储器)、fabric 到 MSS 的 AXI 主接口(fabric 主动访问 DDR 或外设)、以及中断线、DMA 请求线、时钟与复位信号。协同开发的核心问题往往不是“能不能连”,而是“用哪种接口连、带宽和延迟是否满足、地址如何映射”。

例如,一个图像采集加速器放在 fabric 中,它需要把处理后的帧写入 DDR。此时 fabric 作为 AXI 主设备发起写事务,目标地址由软件在 DDR 中分配并告知硬件。软件侧要保证该缓冲区物理地址连续、对齐,并在启动 DMA 前完成地址写入和使能。硬件侧则通过 AXI 写通道把数据推入 DDR 控制器。这个过程中,地址映射、缓存属性、中断通知三者缺一不可。

三、DDR、外设与中断拓扑

DDR 控制器位于 MSS 内,U54、E51 和 fabric 都可以访问。不同主设备的访问路径和优先级不同,实际带宽取决于仲裁策略和访问模式。外设方面,PolarFire SoC 集成了以太网、USB、CAN、SPI、I2C、UART、GPIO、定时器等,它们通过 APB/AXI 总线挂接到 MSS。中断拓扑则把外设中断、fabric 中断、DMA 完成中断等汇聚到 PLIC(平台级中断控制器),再由 PLIC 分发给 U54 或 E51。E51 通常处理低延迟、高优先级中断,U54 处理通用外设中断。

下图给出 PolarFire SoC 的简化架构与主要接口关系,重点标出软硬件协同中需要约定的边界:地址映射、中断路由、DMA 通路和缓存一致性域。

MSS 处理器子系统 U54 应用核集群 U54 #0 U54 #1 U54 #2 U54 #3 64位 · MMU · 一致性缓存 E51 监控核 32位 · 无MMU · 实时 启动管理 / 看门狗 / 安全监控 与U54无硬件缓存一致性 片内总线 / AXI 互连 DDR 控制器 U54/E51/Fabric 共享 外设子系统 ETH/USB/CAN/SPI/I2C PLIC 中断控制器 中断汇聚与分发 IRQ 中断分发 FPGA Fabric 自定义逻辑 / 加速器 图像处理 · 电机控制 · 协议卸载 AXI 主/从接口 访问 DDR / 被 MSS 访问 中断与 DMA 请求 Fabric IRQ → PLIC · DMA Req 时钟 / 复位 / 配置 由 MSS 或外部提供 AXI IRQ 软硬件协同边界约定 ① 地址映射:DDR 缓冲区物理地址、Fabric 寄存器基地址、外设基地址 ② 中断路由:外设/Fabric 中断 → PLIC → U54 或 E51,优先级与目标核 ③ 缓存一致性:U54 与 E51/Fabric 共享数据需 flush/invalidate 或非缓存区

四、软硬件协同的四个关键接口

从工程落地角度看,PolarFire SoC 的软硬件协同可以归纳为四类接口。第一是存储映射接口:软件通过地址访问 fabric 中的寄存器或存储器,硬件设计者必须在 Libero 中分配地址段,并在设备树或裸机头文件中保持一致。第二是中断接口:fabric 产生的中断线需要连接到 PLIC 的可用中断源,软件在 PLIC 中使能对应中断号并注册处理函数。第三是DMA 与数据通路接口:大块数据通常由 fabric 作为 AXI 主设备直接写入 DDR,软件负责分配缓冲区、填写描述符、启动传输并等待完成中断。第四是时钟与复位接口:fabric 逻辑的时钟来源、复位释放顺序必须与 MSS 启动流程协调,否则会出现硬件已配置但软件尚未就绪的竞争。

在实际项目中,建议先画出一张“地址—中断—数据流”对照表,再开始写驱动和 HDL。很多协同问题不是代码错误,而是地址对不上、中断号冲突或缓存未维护。

五、一个典型的协同场景

假设要用 PolarFire SoC 实现一个工业以太网采集节点:U54 运行 Linux 负责网络协议和上层通信,E51 负责周期性采样和看门狗,fabric 中实现一个自定义的 ADC 接口控制器。协同过程大致如下:E51 通过 APB 配置 fabric 中的 ADC 控制器寄存器,设定采样率和通道;fabric 按节拍采集数据并写入 DDR 中的环形缓冲区;每完成一批数据,fabric 拉高中断线,PLIC 将中断分发给 E51;E51 在中断服务程序中更新写指针,并通过共享内存通知 U54;U54 从 DDR 读取数据,经网络协议栈发送。这里的关键约定包括:环形缓冲区的物理地址、写指针的更新方式、中断号、以及 U54 读取前是否需要 invalidate 缓存。如果 U54 使用缓存访问该缓冲区,必须在读取前 invalidate,否则可能读到旧数据。

六、学习本节后应能回答的问题

  • U54 与 E51 在缓存一致性上的差异是什么?共享数据时软件需要做什么?
  • FPGA fabric 访问 DDR 时,地址由谁分配、软件如何告知硬件?
  • 一个 fabric 中断从产生到被 CPU 处理,经过哪些环节?
  • 为什么地址映射、中断路由和缓存维护是软硬件协同的三个基本约定?

掌握这些边界与接口,后续无论是写 Linux 驱动、裸机程序还是 HDL 模块,都能明确“我这一侧要保证什么、交给对方什么”,从而减少联调阶段的反复。