2. 开发环境搭建
PolarFire SoC 的开发环境由两条既独立又交汇的工具链组成:一条是面向 FPGA 逻辑的 Libero SoC,负责综合、布局布线、时序约束与比特流生成;另一条是面向 RISC-V 处理器子系统的 SoftConsole,负责 C 代码编译、链接、下载与调试。理解这两条链如何衔接,是搭建环境的关键。
一、工具链的组成与分工
Libero SoC 是 Microchip 的 FPGA 设计套件,内部集成了综合器(Synplify Pro)、布局布线器(Place & Route)、时序分析器(SmartTime)、功耗分析(SmartPower)以及编程下载工具(FlashPro)。对于 PolarFire SoC,Libero 还负责生成 MSS(Microprocessor Subsystem)的硬件配置,包括时钟树、DDR 控制器、外设复用与 Fabric 与 MSS 的接口。SoftConsole 则是基于 Eclipse 的 RISC-V 集成开发环境,内置 GCC 工具链、GDB 调试器与 OpenOCD 调试服务,用于编写和调试运行在 E51 监控核或 U54 应用核上的裸机与 Linux 程序。
两者通过一个中间产物连接:Libero 导出的硬件描述文件(.xml 或 .h)以及配置好的 FPGA 比特流。SoftConsole 在创建工程时需要导入该硬件描述,以便链接脚本、外设基地址和中断号与硬件一致。
二、Libero SoC 工程创建与硬件配置
启动 Libero SoC 后,通过 Project → New Project 创建工程。器件选择需与开发板一致,例如 MPFS250T_ES 或 MPFS095T,封装与速度等级也要匹配。工程创建完成后,在 Catalog 中双击 MSS 组件进入配置界面。这里需要关注几个关键项:
- 时钟配置:CPU 时钟默认 600 MHz,DDR 时钟根据板载内存颗粒设定,例如 1600 MT/s 对应 800 MHz 时钟。
- DDR 内存:选择正确的内存类型与容量,配置训练参数。若板卡有官方参考设计,建议直接导入其 DDR 配置。
- 外设复用:将 UART0 映射到合适的引脚,用于 Hello World 的串口输出;确认 JTAG 接口已启用。
- Fabric 与 MSS 接口:若 Hello World 仅运行在 MSS 上,可暂不添加 Fabric 逻辑,但需保留 AXI 互联以便后续扩展。
配置完成后,依次执行 Synthesis、Place & Route、Verify Timing。若时序报告中出现 setup 或 hold 违例,需要回到约束文件(.sdc)检查时钟定义与输入输出延迟。时序收敛后,通过 Generate Bitstream 生成 .job 或 .stp 文件,同时使用 Export → Export Hardware 导出硬件描述文件,供 SoftConsole 使用。
三、SoftConsole 工程与 Hello World 代码
打开 SoftConsole,选择 File → New → C Project,工程类型选择 RISC-V Executable,工具链选择 RISC-V GCC。在工程向导中导入上一步导出的硬件描述文件,SoftConsole 会自动生成匹配的链接脚本与板级支持包(BSP)。
Hello World 的核心代码非常简洁,但需要正确初始化 UART。以下为示例代码,假设 UART0 基地址为 0x20100000,波特率 115200:
#include <stdio.h>
#include "mpfs_hal/mss_hal.h"
int main(void)
{
/* 初始化 MSS,配置时钟与 UART */
mss_init();
uart_init(&g_uart0, 0x20100000UL, 115200);
printf("Hello World from PolarFire SoC!\n");
while (1) {
/* 主循环空转 */
}
return 0;
}
编译前需确认链接脚本中的入口地址与栈指针设置正确。对于 U54 核,通常从 0x80000000 开始执行;E51 监控核则从 0x20000000 启动。编译成功后生成 .elf 文件,大小通常在几十 KB 以内。
四、调试器连接与程序下载
PolarFire SoC 开发板通常通过板载 FTDI 或外部 FlashPro 提供 JTAG 接口。SoftConsole 使用 OpenOCD 作为调试服务,配置文件中需指定 JTAG 适配器类型与目标芯片。连接步骤如下:
- 用 USB 线连接开发板的 JTAG 口与主机,确认设备管理器中识别到串口与 JTAG 设备。
- 在 SoftConsole 中创建 Debug Configuration,选择对应的 OpenOCD 配置文件,例如
mpfs_ocd.cfg。 - 启动调试会话,OpenOCD 会依次扫描 JTAG 链、识别 E51 与 U54 核、加载 .elf 到目标内存。
- 在 main 函数设置断点,运行后观察串口终端是否输出 "Hello World from PolarFire SoC!"。
若串口无输出,按以下顺序排查:确认 UART 引脚复用是否与板卡原理图一致;检查波特率与终端设置是否匹配;用示波器或逻辑分析仪观察 UART TX 引脚是否有波形;确认程序确实运行到了 printf 语句,可通过 GDB 查看 PC 指针位置。
五、常见问题与判断依据
| 现象 | 可能原因 | 判断方法 |
|---|---|---|
| OpenOCD 无法识别目标 | JTAG 线序错误或驱动未安装 | 查看 OpenOCD 日志中 IDCODE 是否读出 |
| 程序下载后无反应 | 链接地址与启动模式不匹配 | 用 GDB 读取 PC 指针,确认是否在预期地址 |
| 串口输出乱码 | 波特率或时钟配置偏差 | 测量 UART 时钟源频率,核对分频系数 |
| 时序违例导致比特流不可用 | 约束不完整或时钟频率过高 | 查看 SmartTime 报告中的 slack 值 |