文档来自:PolarFire FPGA and PolarFire SoC FPGA Programming User Guide
PolarFire SOC Auto Update 和 IAP 文档阅读一 - 所长 - 博客园
PolarFire SOC Auto Update 和 IAP 文档阅读二 - 所长 - 博客园
PolarFire SOC Auto Update 和 IAP 文档阅读(三) AUTO UPDATE - 所长 - 博客园
PolarFire SOC Auto Update 和 IAP 文档阅读(四) IAP - 所长 - 博客园
PolarFire SOC Auto Update 和 IAP 文档阅读(五) AUTO recovery - 所长 - 博客园
PolarFire SOC Auto Update 和 IAP 文档阅读(六) Back Level Protection - 所长 - 博客园
3.3.3. Auto Update
要实现自动更新,需先满足一个基础前提:必须在用户设计中启用自动更新功能(若未启用,即使满足其他条件也不会触发更新)。
具体流程在设备上电时启动,分为两步核心逻辑:
- 镜像版本选择:设备会读取存储在 SPI 目录中的 “前两个镜像”,并从中筛选出 “版本更新的镜像”(即版本号更高的那个);
- 更新触发判断:将筛选出的 “更新版本镜像” 与设备当前已编程的镜像版本对比 —— 若两者版本不一致,自动更新随即触发;若版本一致,则不进行更新。
文中提及的 “下图”(the following figure)展示了自动更新编程的 “高层级流程”(即从上电检测到触发更新的整体框架,而非底层细节步骤)。
![image]()
- 前提(设备状态):设备为 “空白状态”(即未被编程过,内部无有效镜像或配置数据);
- 触发原因:主动启动 “自动更新(Auto Update)” 功能;
- 场景目的:利用自动更新,将 SPI 闪存中存储的有效编程镜像写入空白设备,完成设备的首次编程配置(让空白设备具备基础功能)。
- 前提(触发背景):处于 “IAP(在应用编程)过程中”(即设备已在运行,正通过 IAP 更新镜像);
- 触发原因:IAP 过程中发生异常中断 —— 要么是突然断电,要么是仅编程了 “部分无效镜像”(镜像未完整写入或数据损坏,无法正常运行);
- 场景目的:进入 “IAP 恢复流程”,修复 IAP 中断导致的异常状态,确保设备能重新加载有效镜像,恢复正常运行(属于 IAP 故障后的补救机制)。
- 前提(触发背景):处于 “自动更新(Auto Update)过程中”(而非 IAP 过程);
- 触发原因:自动更新执行期间突然断电,导致更新中断(镜像未完整写入或配置未完成);
- 场景目的:进入 “自动更新恢复流程”,补全中断的更新操作或加载备用有效镜像,修复自动更新中断的问题,避免设备因更新失败陷入异常状态。
![image]()
该表格(表 3-12:自动更新条件示例)的核心作用是通过具体场景示例,直观展示当 SPI 闪存中存在不同版本的镜像时,自动更新(Auto Update)是否会触发,帮助理解自动更新的版本判断逻辑。
![image]()
![image]()
看了后面的文档, 回退等级保护, 是指 编程失败时 ,回退等级有一个值 , 只能选择 大于这个值的版本;
注: 重点: 根据上面图 可知: 当使能 auto update 时, SPI FLASH 里 存储的镜像是 1和2 , 当前 设备镜像是 3 , 则 升级成 2 ;
当空白设备上电或复位(且已启用 SPI 主模式)时,设备会使用最新版本的镜像进行自我编程。此过程称为自动编程。
若空白设备通过自动编程方式,使用 “启用安全功能的比特流” 完成编程,则后续编程只能通过 “自定义启用安全功能的比特流文件(UEK1/UEK2,用户加密密钥 1/2)” 进行。
关于生成启用安全功能的比特流的更多信息,请参阅《向比特流添加用户安全设置》。
在预编程设备上,自动更新也可通过系统服务发起。若设备已预编程,它会将更新镜像与当前已编程的镜像进行比较。若发现更新镜像的版本与当前已编程的版本不同,则会启动自动更新编程。
要在预编程设备上执行自动更新,用户应用程序必须发起系统服务请求。系统控制器会执行该系统服务请求并对设备进行编程。
在以下场景中,用户应用程序无法获取状态码:
- 若自动更新编程成功,设备会自动重启以初始化新版本的设计;
- 若自动更新编程失败,自动更新恢复程序会尝试再次使用有效镜像对设备进行编程。
下表列出了自动更新系统服务请求中的各个字段。
表 3-13:自动更新系统服务请求
![image]()
当用户设计中未启用自动更新(功能) 时,仍可通过用户应用程序,借助自动更新系统服务将设备更新为最新版本的镜像。
注:若 SPI 控制器未处于主模式(master mode),自动更新系统服务不会生成错误(此为该服务的特殊行为,需注意 —— 通常控制器模式不匹配可能触发报错,但此处例外,排查故障时需避免忽略此特性)。
当自动更新编程过程中发生断电时,设备会在下一个启动周期(next boot cycle)重新触发自动更新编程流程,以使用最新版本的镜像对设备进行编程。
注:若设备尝试编程新版本镜像失败,会先重试一次;重试仍失败后,再使用旧版本镜像对自身进行编程。若自动更新结束后设备仍处于空白状态(未成功编程任何镜像),则不会通过 I/O 接口给出任何指示信号,此时需要人工干预(用户介入排查问题,如检查镜像有效性、SPI 闪存连接等)。
该小节明确了自动更新编程失败(主要指断电导致的中断)后的 “三级补救机制”,确保设备尽可能恢复正常:
- 一级恢复:断电中断后,下次启动自动重跑更新流程(优先用最新镜像);
- 二级恢复:最新镜像编程失败 → 重试 1 次 → 重试仍失败 → 切换为旧镜像编程;
- 最终兜底:所有尝试后设备仍空白 → 无 I/O 提示,需人工介入(无自动恢复手段)。
这种设计既保证了故障后的自动容错能力,也明确了 “自动恢复失效” 时的人工处理边界,帮助用户在排查问题时定位场景。
要启用自动更新,请按以下步骤操作:
- 点击 “配置设计初始化数据和存储器”(Configure Design Initialization Data and Memories),然后选择 “SPI 闪存”(SPI Flash)选项卡。
- 勾选 “启用自动更新”(Enable Auto Update)复选框。
图 3-14:自动更新设置(Figure 3-14. Auto Update Setting)
- 点击 “配置编程选项”(Configure Programming Options),并指定 设计版本(design version)和回溯版本(back level version),如下图所示。
当 SPI 闪存中存在不同版本的编程镜像时,自动更新会被触发(更多信息请参阅《SPI 目录》)。设备通过编程镜像的 “比特 / 版本组件(Bits/Version component)” 来判断版本 —— 该组件位于比特流的起始位置,包含版本信息。
本节介绍三种自动更新使用模型:乒乓模型(ping pong)、黄金镜像模型(golden image) 和单镜像模型(single image)。用户可根据设计需求选择其中任意一种模型。
自动更新会使用 SPI 闪存中前两个镜像里的较新版本。当新镜像写入 SPI 闪存时,两个镜像中较旧的那个会被新镜像覆盖。这种方式称为乒乓模型,适用于需要同时保留 “旧版本镜像” 和 “新版本镜像” 的场景 —— 若新镜像运行失败,该模型可支持自动回滚到旧版本镜像。
下图展示了乒乓模型的工作方式。
黄金镜像(Golden Image)
当使用新版本镜像进行自动更新失败时,设备需要通过一个可用的镜像进行安全更新,这个镜像被称为黄金镜像。当新镜像写入 SPI 闪存时,不得覆盖黄金镜像(以确保黄金镜像始终作为可靠的备用选项)。
下图展示了黄金镜像使用模型。
![image]()
单镜像模型(Single Image)
当仅有一个镜像可用于更新设备时,使用此模型。下图展示了单镜像使用模型。
![image]()