4、HPS与FPGA启动依赖关系
在Agilex SoC的SDM配置流程中,HPS(Hard Processor System)与FPGA Fabric的启动顺序并非固定不变,而是由用户根据应用场景在配置映像中预先指定。理解两者之间的依赖关系,是正确选择启动模式、避免系统死锁或启动失败的前提。
4.1 启动依赖的本质:谁等待谁?
HPS与FPGA的启动依赖关系,本质上由以下三个关键因素决定:
- SDM固件加载顺序:SDM(Secure Device Manager)作为启动主控,首先加载自身固件,然后根据配置映像中的启动顺序标志位决定下一步动作。
- 时钟与复位依赖:HPS系统需要FPGA提供的某些时钟(如HPS-to-FPGA用户时钟)或复位信号时,必须等待FPGA完成配置并进入用户模式。
- 早期外设访问需求:HPS的早期启动代码(如BootROM或SPL)可能需要通过FPGA内部的桥接(如HPS-to-FPGA Bridge)访问FPGA侧的外设(如DDR控制器、Ethernet MAC)。
关键概念:启动依赖关系是在生成配置映像(.pof或.jic)时,通过Quartus Prime软件中的“Configuration Device”或“SDM Boot Settings”选项静态指定的。运行时无法动态切换。
4.2 两种启动模式详解
Agilex SDM支持两种明确的启动顺序模式,下表从多个维度进行了对比:
| 对比维度 | 先FPGA后HPS (FPGA First) | 先HPS后FPGA (HPS First) |
|---|---|---|
| 启动流程 | SDM先完成FPGA全片配置 → FPGA进入用户模式 → SDM释放HPS复位 → HPS开始执行BootROM | SDM先释放HPS复位 → HPS开始执行BootROM → HPS运行过程中,SDM在后台或由HPS触发完成FPGA配置 |
| FPGA配置时机 | HPS启动前完成 | HPS启动后完成(可并行或延迟) |
| HPS启动时机 | 等待FPGA进入用户模式 | 立即启动,无需等待FPGA |
| 典型应用场景 | HPS依赖FPGA提供时钟/复位;HPS早期代码需访问FPGA侧DDR;需要FPGA作为安全启动信任根 | HPS独立运行Linux,FPGA作为加速外设;需要快速启动HPS,FPGA配置可延迟;FPGA映像较大,配置时间较长 |
| 启动时间 | 总启动时间 = FPGA配置时间 + HPS启动时间(串行) | 总启动时间 ≈ max(FPGA配置时间, HPS启动时间)(可并行) |
| 复杂度 | 较低,依赖关系明确 | 较高,需处理HPS与SDM的配置同步 |
4.3 模式一:先FPGA后HPS(FPGA First)
在此模式下,SDM将FPGA配置视为HPS启动的前提条件。整个流程是严格串行的。
- SDM初始化:SDM从配置存储器(如QSPI Flash、SD卡)加载自身固件。
- FPGA全片配置:SDM读取FPGA配置数据(.rbf),通过配置总线(如FPPx16、AVSTx8)加载到FPGA Fabric。此阶段HPS处于复位状态。
- FPGA进入用户模式:配置完成后,FPGA的CONF_DONE信号拉高,进入用户模式。FPGA内部的时钟、复位逻辑开始工作。
- SDM释放HPS复位:SDM检测到FPGA已进入用户模式后,释放HPS的复位信号(HPS_nRST)。
- HPS启动:HPS开始执行BootROM代码,此时FPGA已可用,HPS可以立即通过桥接访问FPGA侧资源。
设计考量:选择“先FPGA后HPS”模式时,必须确保FPGA配置映像中包含了HPS启动所需的所有时钟和复位逻辑。如果FPGA设计中的某个时钟域未正确初始化,HPS可能会在启动早期挂起。
4.4 模式二:先HPS后FPGA(HPS First)
此模式下,HPS的启动与FPGA的配置解耦,允许HPS先运行,FPGA配置在后台或由HPS主动触发完成。
- SDM初始化:SDM加载固件。
- SDM释放HPS复位:SDM立即释放HPS复位,无需等待FPGA配置。
- HPS启动:HPS开始执行BootROM,加载SPL或U-Boot。此时FPGA仍处于未配置状态。
- FPGA配置触发:FPGA配置可以由以下两种方式触发:
- SDM自动后台配置:SDM在释放HPS复位后,自动开始配置FPGA,与HPS启动并行进行。
- HPS主动触发配置:HPS运行到特定阶段(如Linux内核启动后),通过SDM固件接口(如Mailbox)发送命令,触发FPGA配置。
- FPGA进入用户模式:配置完成后,FPGA进入用户模式。HPS可以通过轮询或中断方式获知FPGA已就绪。
风险提示:在“先HPS后FPGA”模式下,如果HPS的早期启动代码(如SPL)尝试访问尚未配置的FPGA桥接或外设,会导致总线错误(Bus Fault)或系统挂起。必须在HPS软件中增加对FPGA状态的检测逻辑,或确保早期代码不依赖FPGA资源。
4.5 启动依赖关系流程图
下图以时序图的形式,直观展示了两种模式下HPS与FPGA的启动依赖关系:
4.6 如何选择启动模式?
选择启动模式的核心依据是HPS早期启动代码对FPGA资源的依赖程度。以下决策树可以帮助您快速判断:
决策流程:
1. HPS的BootROM或SPL是否需要访问FPGA侧DDR? → 是 → 选择“先FPGA后HPS”
2. HPS是否需要FPGA提供的专用时钟或复位信号才能启动? → 是 → 选择“先FPGA后HPS”
3. 是否需要将FPGA作为安全启动链的一部分(如测量启动)? → 是 → 选择“先FPGA后HPS”
4. 以上均为“否”,且希望HPS快速启动、FPGA配置可延迟? → 选择“先HPS后FPGA”
1. HPS的BootROM或SPL是否需要访问FPGA侧DDR? → 是 → 选择“先FPGA后HPS”
2. HPS是否需要FPGA提供的专用时钟或复位信号才能启动? → 是 → 选择“先FPGA后HPS”
3. 是否需要将FPGA作为安全启动链的一部分(如测量启动)? → 是 → 选择“先FPGA后HPS”
4. 以上均为“否”,且希望HPS快速启动、FPGA配置可延迟? → 选择“先HPS后FPGA”
4.7 配置映像中的设置方法
在Quartus Prime软件中,启动顺序通过以下步骤配置:
- 打开 Assignments → Device → Device and Pin Options。
- 选择 Configuration 选项卡。
- 在 Configuration Mode 中选择合适的配置方案(如 Active Serial x4)。
- 在 HPS/FPGA Boot Order 下拉菜单中选择:
FPGA First:先配置FPGA,再启动HPS。HPS First:先启动HPS,FPGA配置由SDM后台处理或HPS触发。
- 重新生成配置映像(.pof或.jic)并烧录到配置存储器中。
重要提醒:修改启动顺序后,必须重新生成整个配置映像。仅修改设置而不重新生成映像,不会生效。此外,如果选择“HPS First”模式,建议在HPS软件中实现FPGA配置完成的中断处理或轮询机制,以确保在访问FPGA外设前确认其已就绪。