Xilinx 7系列FPGA Multiboot介绍

在远程更新的时候,有时候需要双镜像来保护设计的稳定性。在进行更新设计的时候,只更新一个镜像,另一个镜像在部署之前就测试过没问题并不再更新。当更新出错时,通过不被更新的镜像进行一些操作,可以将更新失败的数据重新写入flash。这样即使更新出错,也能保证设计至少可以被远程恢复。
xilinx的双镜像方案成为multiboot。本文对xilinx 7系列的multiboot做一些简单介绍。
multiboot直接操作的是两个镜像,但实际上可以用于多个镜像。为了便于描述,multiboot中的两个镜像分别成为g镜像(golden)和m镜像(multiboot)。
远程更新的方案,有一些是通过fpga来读写flash的,例如xilinx平台下需要自己实现的flash读写控制器,altera平台下的asml ip。当无法提供jtag等其他连接时,flash的更新就只有fpga一种方案。
当写入flash的操作出现错误,或者flash中部分地址中的数据出现错误,导致无法正确写入或者存储的数据出现错误,这样会导致fpga无法加载成功。
当fpga无法加载成功或者工作不正常的时候,flash的读写操作也就无法得到保证。此时也就不能重新通过远程更新方案来重新读写flash,纠正之前的错误。所以可以看到,如果flash直接由fpga控制,当远程更新出现错误时,很可能导致远程更新彻底失效,只能安排现场更新来修复。
对应方案就是使用双镜像(多镜像),更新的时候只更新m镜像,更新后直接使用m镜像。当出现m镜像更新出现错误的时候,则启动g镜像。通过g镜像中的设计来重新更新flash中m镜像部分的数据。
由于g镜像从来没有被更新过,这样出现错误的概率也就非常小。这样即使m镜像出现错误,可以通过g镜像来完成一些工作(例如flash读写操作),由此来保证设计一直可以使用。
从这个分析可以看出,双镜像的方案,需要完成两个任务。
1.正常情况下,加载完成时应该是m镜像在运行
2.出现错误的时候,需要返回g镜像
图片来自ug470
从上图可以看到,xilinx 7系列fpga的multiboot方案是从基地址开始存放g镜像,后续存放m镜像。加载过程中是先加载m镜像,配置完成后如果成功,则运行m镜像;如果运行失败,则重新加载g镜像。
下面就从需要完成的两个任务,结合上图来进行介绍。
先看第一个任务,加载m镜像。
上电完成之后,fpga就会按照设置,进行加载操作。在主动模式下,fpga会开始对flash的操作,尝试读取flash中存储的配置镜像数据。需要注意的是,主动模式下的这一系列操作都是fpga自动完成的,用户无法控制。
所以就出现了第一个问题。既然读取操作是自动的,那么fpga是如何知道m镜像存储在哪里,并先加载m镜像呢?如果是从0地址开始读取,那么应该先完成g镜像的加载。否则,是否使用multiboot及m镜像的地址,是如何传递给fpga、让fpga知晓呢?
xilinx的multiboot方案中的解决办法是使用一条加载命令:iprog。而这条命令,是放在g镜像中。
具体说,对于fpga直接从0地址开始读取,先开始加载g镜像,但是这个g镜像是经过特别处理的,在镜像数据刚开始的部分添加了iprog命令和m镜像的地址。当fpga读取到这个命令之后,就会直接跳过后面的数据,从设置的地址开始继续加载。这样的操作,导致g镜像只是运行了最前面的几条加载命令,而m镜像也只是等了几条命令的操作就开始加载了,保证了m镜像的直接加载。
需要说明的是iprog这是一条命令,所以既可以在g镜像中生效,也可以在设计中任意使用。用户可以将iprog命令发给icap,来实现任意时间触发重新加载的需求。通过设置合适的地址,可以实现多个镜像的切换。
图片截取自vivado
从vivado中的设置可以看出,multiboot的主要设置只有这6个。第一个成为fallback,最后一个成为watchdog。这两个下文会做介绍。第四个第五个是关于rs pin。等熟悉multiboot理解之后可以查看文档进行理解,本文不做深入介绍。
第二个是设置跳转到的地址、第三个是在g镜像中加入iprog命令。这两个操作可以以命令的形式发给icap接口,从而触发multiboot中转跳并加载新的镜像数据。
看完上述的分析,应该明白如何实现先加载m镜像这个需求了。下一步就是,在加载失败时如何回退到g镜像。
m镜像加载不成功,需要回退到g镜像的操作,multiboot方案称这一步骤为fallback。
fallback在四种条件下会被触发:
1. id code错误
2. crc错误
3. watchdog超时
4. bpi地址越界
id code错误是指配置文件中的器件型号和当前器件不匹配。crc校验是指配置数据送入fpga之后会进行校验,如果数据不一样则会提示crc错误。这两个基本原理比较容易理解,至于具体细节,需要能解析bit文件的内容之后才能充分理解。
watchdog超时是指在规定的时间内如果无法配置成功,则触发watchdog超时,进而会导致fallback。
bpi地址越界是指发现逐步增长的bpi地址超过最大值,发生溢出,回到0,则除法fallback。
大概理解一下四个条件之后可以看到,bpi是只针对bpi模式的,和watchdog有一点类似,都是在一段时间内如果没有加载成功,地址会逐步增加,计时器会逐步增加,超过范围后就触发fallback,所以bpi就不做进一步解释了。
id code也不做进一步解释了,因为id code不对,大概率是用错镜像文件了。所以也没有太多可以分析的。
重点是2和3,当存在multiboot镜像的时候,如m镜像的内容出现问题,则会触发crc校验错误,这样可以保证镜像加载成功之后,数据是没有问题的。
但是如果没有multiboot镜像,则crc校验无法进行,或者加载到一半就挂死了。这个时候就需要watchdog来触发fallback。只要一定时间内加载没有完成,就一定会触发watchdog超时。
所以crc是用来保证加载正确的,watchdog是用来保证一定会提示加载失败的。
注意,watchdogd的计时设置,请设置好然后实际测试一下,而不要仅仅凭经验/文档来推断一个合适的值。
当发生了fallback之后,工程会反跳回0地址开始加载,从新加载g镜像。这里,fpga内部的配置寄存器会做记录,当发生fallback之后,会自动忽略iprog命令,直接加载g镜像后续的部分,来保证g镜像有机会被完整的加载。
fpga自带一些寄存器,记录了fpga加载时的一些状态,通常称为device status寄存器。当初出现加载失败的问题时,可以通过jtag查看相关寄存器来寻找一些线索,帮助定位问题。
通过这一系列复杂的操作,可以实现双镜像的配置切换。这种方法最大的优点就是速度快。在配置完成之后可以快速的跳转、加载和返回。最关键的双镜像选择这一步是在加载初期就进行转跳,所以跳转非常迅速,适合一些对配置时间有要求的场合。缺点就是原理和设置都相对麻烦了一些。
和上述方法不一样的一个双镜像切换的方法就是用户自行做切换。大致原理是用户利用fpga的可编程逻辑资源对icap模块进行控制,输入需要跳转的地址然后输入iprog命令,来触发跳转操作。这个操作是需要先加载好g镜像并开始运行,然后由用户来控制什么时候进行跳转。
这样操作的优点有:
1.跳转地址由用户自行选择,所以可以在多个镜像中跳转,而不限于两个;
2.可以选择在合适的时间进行加载,用户选择性更大。
主要缺点:
1.需要对配置过程、icap端口和控制命令有更多的理解
2.需要加载完至少一个镜像才能使用,所以对配置时间要求高的场景无法使用
如果仅仅是为了远程更新,那么这个方案,并不合适。用自动的双镜像方案更简单易用一些。只要g镜像调试完毕,整个方案对m镜像的要求比较低。


西门子Sinumerik 828紧凑型数控系统亮相 助力标准型数控市场数字化建设
2017旗舰机哪款最值得推荐
基于GPS的电压互感器二次线路压降自动跟踪补偿装置的设计与实现
泛林发布半导体刻蚀技术解决方案
此iBag非iPad,剁手智能手袋替你管好钱包
Xilinx 7系列FPGA Multiboot介绍
行业邀请:2024年中国石油石化信息通信技术交流大会即将召开
绝对值编码器选型原则
科技前沿:英国电信与华为合作研发5G网络切片技术 法国陆军将在2019年部署Patroller战术无人机
dfrobot 4Pin传感器转接板简介
新型双轨奖金制度直销系统 双轨直销会员工资结算系统
GDDR6超越图形:用于AI、VR和自动驾驶的内存
受瑞华所被立案调查余震影响?木林森如是回应!
iPhone15系列或采用3nm苹果A17芯片 台积电代工
什么是能够支持Car.OS的软件平台
基于IP核的数选式浮点矩阵相乘改进
中美之间的半导体技术摩擦还将持续
微软Surface平板电脑配置东芝2230固态硬盘
触摸一体机为什么备受服务业青睐
基准电压源与一般的稳压源有什么区别