作者:Harris Feng 文章来源:FPGA FAE技术分享选集
Multiboot功能介绍
Multiboot是指多镜像启动,比如在FPGA的加载flash里面存放2个或者多个FPGA的配置文件,每个配置文件都可以单独完成FPGA的逻辑配置,如下图1所示;
图1 multiboot Flash中配置镜像文件的结构如上图所示,Flash里面包含了Golden Bitstream和Update Bistream,远程升级是指通过网络或者其他远程设备对Flash里面的Update Bistream进行升级,而Golden Bitstream通常是FPGA的基本逻辑版本,主要是实现了升级部分的功能,从应用上要求不管发生什么情况,必须保证Golden Bitstream的完整性,并能够加载FPGA,保证能够通过远程对FPGA进行升级。通过Multiboot功能我们可以实现使用Golden Bitstream或者Update Bistream对FPGA进行加载,从而在FPGA里面实现Golden Bitstream或者Update Bistream的功能,Update Bistream通常是用户产品实际使用的逻辑功能。Bitstream文件主要包括Header和FPGA逻辑配置数据两部分,如下图2所示:
其中,Header主要是为FPGA配置起引导作用,FPGA刚上电后会去读取Header的内容并对内容进行分析,从而完成内部逻辑配置,Header的内容由若干条命令组成,如下3图所示:
如上图3所示,对于multiboot我们主要关注同步字,timer\WBSTAR\IPROG和Fallback这5个字段:
同步字:标志一个完整配置文件的起始位置,FPGA读取到这个同步字就会认为后面的数据是一个完整的配置文件数据,包括Header和FPGA配置数据;
Timer:设置超时时间的命令,其后面4个字节为超时时间,multiboot提供了加载超时机制,主要是针对Update(用户逻辑)镜像,如果在计数时间内没有完成Update的加载则自动加载Golden镜像;
WBSTAR:指示Update镜像的起始位置,其后面4个字节即为地址值,FPGA会根据该地址去加载Update镜像;
IPROG:Internal PROGRAM,当FPGA检测到该命令后会自动跳到WBSTAR指定的地址加载Update镜像;
Fallback:如果使能了Fallback则在加载Update的过程中如果检测到错误就自动回跳到Golden镜像进行加载;上述讲解了配置文件里面的同步字,timer\WBSTAR\IPROG和Fallback这5个字段,Multiboot功能的实现主要就是根据这5个字段来完成,流程图如下图4所示:
Step 1:
FPGA上电后自动从flash的0地址开始读取数据,通常Golden镜像的起始地址为0,当FPGA读取到Golden镜像同步字,WBSTAR和IPROG这三个命令后就会自动跳转到Update镜像的起始地址并加载Update镜像,如果Timer命令后面4个字节为非0(说明设置了超时机制)则启动超时机制;
其中WBSTAR,IPROG和Timer可以在VIVADO工程里面进行设置,工程需要先综合并生成bit文件后右键点击Generate Bitstream->点击弹出的Bitstream Settings->进入settings界面后点击Configure additional bitstream settings->点击Configurationg后就可以进行设置了,如下图5所示:
做了图5的配置后,工程的XDC文件会自动增加下面的约束:
重新生成BIT文件后,这些约束的信息就会自动添加到Header里面,如果后续需要修改这些值可以直接在XDC里面修改。
说明:上述multiboot的配置应该在Golden对应的工程里面配置,Update的工程不用配置,因为FPGA上电的时候就是从Golden的Header里面获取这些信息的。当Golden和Update的配置文件都生成后可以通过下面的TCL指令在VIVADO里面直接生成一个MCS文件:
最后直接把生成的MCS文件烧录到flash就可以了。Setp 2:
检测到WBSTAR和IPROG命令后跳到Update镜像起始地址。
Setp 3:
加载Update镜像。
Setp 4:
如果加载过程中出现如下错误则回跳到Golden镜像加载,如果没有错误就不会走到本步骤。
Setp 5:
加载Golden镜像,如果没有错误就不会走到本步骤。
说明:FPGA一旦检测到IPROG命令则启动Update镜像的加载流程,同时会检测加载过程出现上述列出的CRC,IDCODE和Watchdog timer错误,一旦检测到错误则自动回跳到0地址加载Golden镜像。
远程升级是指本地设备对终端产品的FPGA程序进行升级,主要是运用了multiboot功能,升级的是flash里面的Update镜像,如下图6所示:
升级的传输通道可以是以太网\PCIE\USB等总线,那么远程升级主要是解决2个问题,第一个问题是如何把远程设备传输过来的数据通过FPGA写入Flash,第二个问题是如何保证Flash升级功能的完整性,即在任何情况下(比如升级过程中突然断电)要保证Golden镜像的完整性,确保在升级失败的情况下可以从Golden镜像启动重新进行升级。对于第一个问题,AMD提供了解决方案,提供了通过FPGA写Flash的逻辑代码,包括SpiFlashProgrammer.vhd和SpiSerDes.vhd文件,如下图7所示:
SpiFlashProgrammer.vhd实现了数据接收以及Flash写入数据的流程,SpiSerDes.vhd实现了把SpiFlashProgrammer.vhd模块传输过来的数据转换成SPI的串行数据,并实现SPI读写时序,用户只需要把远程接收数据写入SpiFlashProgrammer.vhd模块即可。第二个问题,如何保证任何情况下保证Golden镜像的完整性,并能正常从Golden镜像启动。这里会有一个问题,如果Update镜像在升级的过程中遭到损坏可能会导致重新上电后FPGA去加载Update镜像的时候在解析被损坏过的数据包的时候会停止加载,并且不能回跳到Golden镜像加载,这样会导致FPGA无法正常启动和升级。从上文对multiboot的描述中我们知道FPGA是通过同步字AA995566来找到配置内容,当FPGA上电后从Flash中寻找到Golden镜像的Header同步字的时候就会去分析这个Header,而这个Header包括了WBSTAR和IPROG,会导致FPGA会去加载Update镜像,而如果Update镜像数据包被破坏就有可能会导致FPGA加载失败。我们的解决方案是把包括WBSTAR和IPROG的Header独立出来,我们称这个Header为multiboot Header,Golden镜像的Header变成正常的不带WBSTAR和IPROG的Header。只要我们保证如果Update镜像没有升级成功的情况下不会寻找multiboot Header,就能保证FPGA不会从Update镜像启动,而是直接从Golden镜像启动。这个过程我们需要远程升级软件来控制,首先我们把multiboot Header放到flash的第一个扇区,接着放Golden镜像,当软件升级开始的时候先把multiboot Header的内容擦除掉,当升级完成后通过回读flash内Update镜像的数据来确认升级是否成功,如果升级成功,软件就把multiboot Header的内容回写到flash的第一个扇区(由于flash是按照扇区操作的,为了避免擦除multiboot Header的内容的时候影响到其它数据,我们需要把multiboot Header单独放到第一个扇区),如果升级失败则不会回写multiboot Header。因此,如果升级失败(由于突然断电或者其它因素导致),FPGA在上电后就找不到multiboot Header,然后就会直接往下寻找到Golden镜像,就会直接加载Golden镜像。我们需要注意的是升级软件任何时候都只对multiboot Header和Update镜像进行操作,不能操作Golden镜像的内容,保证Golden镜像的完整性。Flash内容结构以及启动流程如下图8所示:
Multiboot header主要是包括了同步字AA995566,WBSTAR和IPROG命令,FPGA启动加载时会按照如下步骤:
Step 1:从0地址读取Multiboot header;
Step 2:如果读取到正常的Multiboot header则跳转的Update镜像进行加载;
Step 3;如果读取不到正常的Multiboot header则直接加载Golden镜像;
如果您对此文章有疑问,欢迎联系:
simonyang@comtech.cn
charlesxu@comtech.cn