3. PolarFire SoC与RISC-V子系统验证

PolarFire SoC 的验证难点不在于单个 RISC-V 核能否跑通指令,而在于由 MSS(Microprocessor Subsystem)、E51 监控核、四个 U54 应用核、缓存一致性域以及外设互联共同构成的异构子系统,在复位、启动、并发访问和低功耗切换等场景下是否始终行为正确。若把 SoC 级验证简化为“在 U54 上跑一个 Linux、在 E51 上跑一个裸机程序”,大量跨域缺陷会被掩盖。本节先建立子系统结构认知,再给出可执行的 SoC 级验证策略。

一、先看清被验证对象:MSS 与 RISC-V 子系统的组成

PolarFire SoC 的 MSS 是 SoC 的“控制中枢”,它把 RISC-V 集群、DDR 控制器、外设总线、时钟复位、安全与系统控制器整合在一起。RISC-V 集群内部包含一个 E51 监控核和四个 U54 应用核:E51 通常承担启动、监控、安全与实时控制职责,U54 集群承担应用与操作系统负载。E51 与 U54 共享内存与外设资源,但二者在缓存、特权级和中断路径上并不对称,这正是验证需要重点覆盖的地方。

缓存一致性是 U54 集群的关键特性:四个 U54 核的 L1 D-Cache 通过一致性端口接入集群级一致性管理,使核间共享数据无需软件显式 flush 即可保持可见。但 E51 与 U54 之间、以及 CPU 与 DMA 之间的一致性语义不同,必须区分“硬件一致性域内”和“域外”两类访问。外设互联则通过总线矩阵把 U54/E51、DMA、DDR、eNVM、以太网、USB、CAN、SPI、I2C 等连接起来,不同主设备访问同一从设备时的仲裁、优先级与延迟,是 SoC 级验证的另一个核心。

PolarFire SoC 验证对象:MSS / RISC-V 集群 / 一致性域 / 外设互联 RISC-V 集群(MSS 内) E51 监控核 启动 / 监控 / 实时 U54 应用核 ×4 Linux / 应用负载 L1 D-Cache + 集群级一致性管理(U54 域内) 中断控制器 / 定时器 / 特权级与 PMP MSS 系统控制 时钟 / 复位 / 低功耗 DDR 控制器 安全 / sNVM / eNVM 系统控制器 外设互联 / 总线矩阵 DMA 主设备 以太网 / USB CAN / SPI / I2C GPIO / 定时器 仲裁 / 优先级 一致性边界(验证重点) 域内:U54 四核 L1 由硬件保持一致,核间共享数据无需软件 flush 域外:E51 ↔ U54、CPU ↔ DMA 需软件维护(flush / invalidate / barrier),是缺陷高发区 SoC 级验证策略主线 ① 启动与复位序列(E51→U54 释放) ② 一致性域内/域外并发访问 ③ 外设互联仲裁与延迟 ④ 中断与异常跨核路由 ⑤ 低功耗与时钟切换下的状态保持 ⑥ 安全隔离与 PMP 边界

二、把验证需求拆成可观测的检查点

SoC 级验证的第一步不是写测试,而是把“子系统正确”翻译成可观测的检查点。对 PolarFire SoC,建议至少覆盖以下六类:

  • 启动与复位序列:上电后 E51 从 eNVM 取第一条指令,完成时钟与 DDR 初始化,再把 U54 从复位中释放。检查点是 E51 释放 U54 的时刻、U54 第一条指令地址、以及释放前 DDR 是否已可用。
  • 一致性域内并发:四个 U54 同时读写同一缓存行,验证硬件一致性是否保证最终可见性,检查点可用“写后读”序列与原子操作结果比对。
  • 一致性域外访问:E51 写共享内存后 U54 读取、DMA 搬运后 CPU 读取,检查点在于软件是否正确执行 flush/invalidate 与内存屏障。
  • 外设互联仲裁:DMA 与 U54 同时访问 DDR 或同一外设,检查带宽分配、优先级反转与访问延迟是否在预期范围。
  • 中断与异常路由:外设中断能否正确送达目标核,跨核 IPI 是否可靠,异常入口与返回是否保持上下文。
  • 低功耗与安全:时钟门控、电源域切换后缓存与寄存器状态是否保持;PMP 是否阻止 U54 越权访问 E51 或安全区域。

三、制定 SoC 级验证策略:分层与并发并重

建议采用“三层递进 + 并发注入”的策略。第一层是模块级:单独验证 E51 启动代码、U54 缓存一致性端口、DMA 引擎、总线仲裁器,使用定向激励快速定位。第二层是子系统级:把 E51、U54、DDR、DMA 和关键外设组合起来,运行跨核通信、共享内存和中断路由用例。第三层是 SoC 级:在接近真实负载下运行操作系统与并发外设流量,观察系统级行为。

并发注入是 SoC 级验证区别于模块级的关键。可以在 U54 运行内存压力测试的同时,让 DMA 持续搬运数据、让以太网产生中断、让 E51 周期性访问共享寄存器,从而暴露仲裁冲突、一致性窗口和中断丢失。下面给出一份可直接参考的 SoC 级验证用例表,字段按 PolarFire SoC 实际验证需要设计。

用例编号验证目标激励与并发观测点通过判据
SOC-BOOT-01E51→U54 启动释放上电复位,E51 初始化 DDR 后释放 U54U54 首指令地址、DDR 就绪标志U54 在 DDR 可用后启动,无取指异常
SOC-COH-02U54 域内一致性四核并发写同一缓存行,交替读写共享变量最终值、原子操作返回值结果与顺序一致模型预期一致
SOC-COH-03E51↔U54 域外一致性E51 写共享内存,U54 读;U54 写回,E51 读flush/invalidate 前后数据值软件维护后数据可见,无陈旧值
SOC-DMA-04DMA 与 CPU 一致性DMA 搬运后 U54 读取缓冲区缓冲区内容、cache 状态invalidate 后读到 DMA 新数据
SOC-BUS-05总线仲裁与延迟DMA 与 U54 同时访问 DDR访问延迟、带宽分配无饿死,延迟在设定上限内
SOC-IRQ-06跨核中断路由外设中断 + 跨核 IPI 并发中断到达核、处理计数无丢失、无错投,计数一致
SOC-LP-07低功耗状态保持时钟门控/电源域切换后唤醒缓存与寄存器内容唤醒后状态与切换前一致
SOC-SEC-08PMP 安全隔离U54 尝试访问 E51/安全区域访问异常与错误码越权访问被阻止并上报

四、结果判读与常见陷阱

SoC 级验证的结果判读不能只看“程序是否跑完”。对一致性用例,应比对最终内存值与预期顺序模型结果;对总线用例,应统计延迟分布而非单次延迟;对中断用例,应核对中断计数与处理顺序。常见陷阱包括:把 U54 域内一致性误认为覆盖 E51 与 DMA;在 DMA 用例中忘记 invalidate 导致读到陈旧数据却误判为硬件缺陷;以及在低功耗唤醒后未重新初始化时钟就访问外设,造成假失败。

建议在验证平台中为每个用例记录“激励时间戳—观测点采样—判据比对”三段数据,便于在失败时快速区分是设计缺陷、软件维护缺失还是测试平台时序问题。

综上,PolarFire SoC 的 SoC 级验证应以 MSS 与 RISC-V 集群结构为地图,以一致性边界和外设互联为两条主线,用分层递进加并发注入的方式组织用例,并把每个检查点落到可观测、可判定的数据上。这样才能在流片前真正覆盖 E51/U54 协同、缓存一致性与外设互联的验证需求。