取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
jjzw1990
Contributor
Contributor
619 次查看
注册日期: ‎01-10-2019

FPGA启动失败

我们板子用的VU9P芯片,FPGA逻辑是烧录到Flash里,通过BPIx16启动。

现在的现象是:

(1)有个逻辑,上电后无法启动;但是连着JTAG并打开vivado后,就能启动成功;

(2)别的逻辑,上电后能正常启动。

我想问下,什么原因会导致这样的现象?

如果说逻辑配置有问题,那应该不管怎样都无法启动啊!但为什么连着JTAG并且打开vivado,就能启动成功呢?

0 项奖励
10 回复数
jjzw1990
Contributor
Contributor
618 次查看
注册日期: ‎01-10-2019

@iguo @zhiq @terryn @zhendon 

麻烦各位大佬指导下!谢谢~

0 项奖励
iguo
Xilinx Employee
Xilinx Employee
615 次查看
注册日期: ‎08-11-2008

看描述是启动需要的时钟数不够。你们对配置文件做了什么修改吗?比如把最后的FF,或者2000去掉了一些?或者是这个不OK的逻辑选择了DCI和MMCM wait to lock?

现在需要的是,持续不断地给FPGA提供时钟。可以考虑在原配置文件后面加一些FF来实现。或者先把wait to lock去掉。

------------------------------------------------------------------------------------------------------------
Don't forget to reply, kudo, and accept as solution.
---------------------------------------------------------------------------------------------------------
jjzw1990
Contributor
Contributor
588 次查看
注册日期: ‎01-10-2019

感谢大佬的回复!

我们没有直接修改产生的镜像文件,只是在XDC文件中做了下设置:

#------------------- Bitstream configuration -----------------------------------
set_property BITSTREAM.CONFIG.UNUSEDPIN Pulldown [current_design]
set_property BITSTREAM.CONFIG.CONFIGRATE 8.0 [current_design]
set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
set_property BITSTREAM.CONFIG.CONFIGFALLBACK ENABLE [current_design]
set_property BITSTREAM.CONFIG.TIMER_CFG 32'h01000000 [current_design]

 

另外,补充说明下,我们用的是multiboot的结构,问题出现的场景是:在线升级过程中,突然中止了,所以现在flash中update image应该是不完整的,所以理论上应该能将golden image加载成功。

但现在的现象是:不接JTAG,FPGA无法启动,也就是golden image也没有加载成功;但连着JTAG并且打开vivado时,能够将golden image加载成功。

0 项奖励
jjzw1990
Contributor
Contributor
522 次查看
注册日期: ‎01-10-2019

jjzw1990_0-1615982657815.png

提供下相关的状态信息

0 项奖励
iguo
Xilinx Employee
Xilinx Employee
447 次查看
注册日期: ‎08-11-2008

你需要完整描述一下问题:1. 所有的失效都是出在MultiBoot升级突然中断这一场景吗?2. 假设1正确,那么也只是有个别逻辑需要接JTAG?而其他的逻辑在同样掉电场景,仍然可以加载golden image?

如果是这样,理论上解释不通,除非是几个逻辑掉电的时间点不一样。

首先需要注意的是,multiboot是不能handle中间掉电这一场景的,这一点很多人有误解。FPGA的指令有顺序,突然中断,内部状态机不能处理这一情况,他处理的是偶然的字节错误或缺失,不适用于大面积的指令序列丢失。对于这种场景,正确的做法是:flash倒着写。先把后续数据全部写好,最好写入同步字AA995566。这样才能处理。

至于你观测到的现象,除了上面说的时间点不同外,还要考虑是Vivado连接时发出了JPROGRAM指令,所以导致可从golden开始。但是仍然有不合理的地方。你需要完整描述你的失效场景,必要时需要回读flash写入的内容来定位问题。

------------------------------------------------------------------------------------------------------------
Don't forget to reply, kudo, and accept as solution.
---------------------------------------------------------------------------------------------------------
0 项奖励
jjzw1990
Contributor
Contributor
427 次查看
注册日期: ‎01-10-2019

感谢您的回复!

我昨天下午做了深入的调查,基本定位到了问题所在。

我从flash里将文件全部回读出来,进行了比对:

1、golden image是完整的;

2、update image被erase后只program了开头一部分(包含完整的同步字及看门狗时间设置信息),见下图

jjzw1990_0-1616030684932.png

所以,现在的问题,在于为什么没有从update image区域跳转回golden image区域,而是一直卡在那?

按我的理解,至少应该有两种机制可以跳转回来:

1、wrap-around error:按理flash全部读完之后就应该跳转回0地址的,对吧?

2、watchdog timer:看门狗计时时间到了之后,也会跳转回来进行golden image的加载。

但为什么现在这两道跳转机制全部失效了呢?

0 项奖励
iguo
Xilinx Employee
Xilinx Employee
374 次查看
注册日期: ‎08-11-2008

这两种机制均不能cover中间掉电场景。指令丢失会造成内部状态机运行失效,两种机制随之失效。必须采用我前面说的那种方式。

------------------------------------------------------------------------------------------------------------
Don't forget to reply, kudo, and accept as solution.
---------------------------------------------------------------------------------------------------------
0 项奖励
jjzw1990
Contributor
Contributor
351 次查看
注册日期: ‎01-10-2019

中间没有断电,只是在线升级的过程中异常终止了(比如在线升级程序异常关闭了)。

另外,由于在线升级需要先对Flash进行erase然后再program,而升级过程可能会在任何一个步骤被中止,所以很难按你说的进行操作。有没有什么更保险的办法?

另外,据我多次测试,这两种机制在K7系列多款芯片上都能正常发挥作用;但在VU9P这个芯片,好像有时行有时不行。这是为什么呢?

0 项奖励
iguo
Xilinx Employee
Xilinx Employee
310 次查看
注册日期: ‎08-11-2008

断电和异常终止是一个结果。

另外我说的workaround很简单,正因为你可能在任何一个步骤中止,所以要先空出同步字的位置,最后再写入,这个为什么很难操作呢?你先用FF填充这个位置,最后再写一个AA995566就行了。

7系列为什么OK,需要看具体细节,已经写入多少等等分析。按原理,各个系列都只有我说的这个方案才保险。

------------------------------------------------------------------------------------------------------------
Don't forget to reply, kudo, and accept as solution.
---------------------------------------------------------------------------------------------------------
0 项奖励
jjzw1990
Contributor
Contributor
300 次查看
注册日期: ‎01-10-2019

比如现在的VU9P,每个image会有5个AA995566,见上面那个图。

那是只需要把第一个AA995566按你的方法做,还是所有的AA995566都要这样做呢?

0 项奖励