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 级验证的另一个核心。
二、把验证需求拆成可观测的检查点
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-01 | E51→U54 启动释放 | 上电复位,E51 初始化 DDR 后释放 U54 | U54 首指令地址、DDR 就绪标志 | U54 在 DDR 可用后启动,无取指异常 |
| SOC-COH-02 | U54 域内一致性 | 四核并发写同一缓存行,交替读写 | 共享变量最终值、原子操作返回值 | 结果与顺序一致模型预期一致 |
| SOC-COH-03 | E51↔U54 域外一致性 | E51 写共享内存,U54 读;U54 写回,E51 读 | flush/invalidate 前后数据值 | 软件维护后数据可见,无陈旧值 |
| SOC-DMA-04 | DMA 与 CPU 一致性 | DMA 搬运后 U54 读取缓冲区 | 缓冲区内容、cache 状态 | invalidate 后读到 DMA 新数据 |
| SOC-BUS-05 | 总线仲裁与延迟 | DMA 与 U54 同时访问 DDR | 访问延迟、带宽分配 | 无饿死,延迟在设定上限内 |
| SOC-IRQ-06 | 跨核中断路由 | 外设中断 + 跨核 IPI 并发 | 中断到达核、处理计数 | 无丢失、无错投,计数一致 |
| SOC-LP-07 | 低功耗状态保持 | 时钟门控/电源域切换后唤醒 | 缓存与寄存器内容 | 唤醒后状态与切换前一致 |
| SOC-SEC-08 | PMP 安全隔离 | U54 尝试访问 E51/安全区域 | 访问异常与错误码 | 越权访问被阻止并上报 |
四、结果判读与常见陷阱
SoC 级验证的结果判读不能只看“程序是否跑完”。对一致性用例,应比对最终内存值与预期顺序模型结果;对总线用例,应统计延迟分布而非单次延迟;对中断用例,应核对中断计数与处理顺序。常见陷阱包括:把 U54 域内一致性误认为覆盖 E51 与 DMA;在 DMA 用例中忘记 invalidate 导致读到陈旧数据却误判为硬件缺陷;以及在低功耗唤醒后未重新初始化时钟就访问外设,造成假失败。
综上,PolarFire SoC 的 SoC 级验证应以 MSS 与 RISC-V 集群结构为地图,以一致性边界和外设互联为两条主线,用分层递进加并发注入的方式组织用例,并把每个检查点落到可观测、可判定的数据上。这样才能在流片前真正覆盖 E51/U54 协同、缓存一致性与外设互联的验证需求。