取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
Contributor
Contributor
532 次查看
注册日期: ‎07-19-2020

zynq配置存储器回读以及Frame_ecc纠检错问题

xilinx的工程师们,你们好:

我最近在做zynq配置存储器回读与刷新方面的研究,配置接口是PCAP。

我在自己的设计中例化了frame_ecc原语,并通过ILA抓取输出,以验证"纠一检二"的功能。目前我通过PCAP回读单配置帧时,frame_ecc确实有被ILA抓到信号,但这个信号和我预期不符。

比如说:回读0x0040129A地址处的数据,我通过串口向程序中输入地址,回读出一帧数据,然后点击ILA窗口触发,有信号输出,但是FAR[25:0]并不会显示我当前回读的地址,而是随机出现其他地址,如下图:

XuanXuanL_0-1606047502886.png

我在block design中关于Frame ECC信号的连接和约束如下,将PS的100Mhz时钟直接用来驱动frameECC,:

XuanXuanL_1-1606048019222.png

XuanXuanL_2-1606048235492.pngXuanXuanL_3-1606048273905.png

此外,我想通过故障注入功能验证frameECC的作用,我用了两种方法:

1)我随机修改了.bit文件中的某一配置位,关闭了CRC校验,将其下载到FPGA中,但是frameECC并不能定位出这个错误,请问我应该如何正确执行故障注入呢?

2)我通过PCAP的重构功能,采用单配置帧刷新的方法,在某个地址处写入了错误的配置数据,但是frameecc依然不能检测出来

不知道是否是frameECC的连接和例化出现了什么问题?是否有参考的关于frameECC该如何使用的例子?

 

 

 

 

Zhejiang University,China;
0 项奖励
回复
8 回复数
Community Manager
Community Manager
389 次查看
注册日期: ‎08-31-2011

Hi,你可以参考SEM 的product guide来尝试进行错误注入,因为你有可能修改的bit在mask区域,可以尝试在frame的ecc word处进行错误注入。

-------------------------------------------------------------------------------------------------
Don’t forget to reply, kudo, and accept as solution.
-------------------------------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
-------------------------------------------------------------------------------------------------
0 项奖励
回复
Contributor
Contributor
341 次查看
注册日期: ‎07-19-2020

您好,我在一帧的第51个word处尝试修改了ECC值,但是frameECC依然不指示任何错误,我通过回读验证了错误确实注入到了配置帧当中,请问这种情况应该怎么办呢

Zhejiang University,China;
0 项奖励
回复
Xilinx Employee
Xilinx Employee
326 次查看
注册日期: ‎08-11-2008

通过修改bit文件是无法注入错误的。

------------------------------------------------------------------------------------------------------------
Don't forget to reply, kudo, and accept as solution.
---------------------------------------------------------------------------------------------------------
0 项奖励
回复
Contributor
Contributor
320 次查看
注册日期: ‎07-19-2020

您好,谢谢您的回答。我手动修改了bit文件中某个帧地址对应的配置位,并回读验证了该位确实有被修改,但是frameECC并没有指示错误。我没有使用SEM IP,而是通过回读-翻转-刷新的流程来注入错误。

然后我想请问一下,使用PCAP作为回读接口,在使用frameECC时,COR1寄存器该如何设置呢?谢谢!!

Zhejiang University,China;
0 项奖励
回复
Community Manager
Community Manager
299 次查看
注册日期: ‎08-31-2011

Hi 

通过修改bit文件是不能注入错误的。只有在配置完成以后,postcrc轮询起来以后才能够注入,这个是因为crc都是在配置完成通过计算得到的。你在bit文件中禁止了crc只能够保证加载能够成功,但是加载的bit文件已经作为正确的样本来进行比对了。所以之后不会报bit 反转错误。

建议你还是用sem ip来进行控制。

-------------------------------------------------------------------------------------------------
Don’t forget to reply, kudo, and accept as solution.
-------------------------------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
-------------------------------------------------------------------------------------------------
0 项奖励
回复
Contributor
Contributor
278 次查看
注册日期: ‎07-19-2020

您好,谢谢您的回答!

我还有一个问题,就是我通过pcap将一帧错误数据刷入配置存储器中,想要通过frameECC来显示注错的地址和比特位置,但是frameECC总是不能正常显示,请问我该从哪个地方来解决这个问题呢?

我注意到有个COR1寄存器,可以用来设置POST_CRC属性,这个寄存器的设置和ucf文件中的set property POST_CRC enable有区别吗?此外我注意到这个AR【https://www.xilinx.com/support/answers/66975.html】中提到,如果设置了POSTCRC,要有个ICAP和PCAP接口之间的转换是吗?

Zhejiang University,China;
0 项奖励
回复
Community Manager
Community Manager
253 次查看
注册日期: ‎08-31-2011

hi,

你用pcap在注入错误的时候,具体操作是什么能描述下么

-------------------------------------------------------------------------------------------------
Don’t forget to reply, kudo, and accept as solution.
-------------------------------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
-------------------------------------------------------------------------------------------------
0 项奖励
回复
Contributor
Contributor
232 次查看
注册日期: ‎07-19-2020

谢谢您的回复!我的操作基本上按照PCAP动态重配置PL来完成,只是将重构区域设定为了单配置帧。过程如下:
首先选择PCAP作为动态重配置接口,然后通过XDcfg_Transfer()函数将单配置帧刷新相关的指令写入配置模块,其中用于刷新的数据,我预先通过xsct console存在了DDR的0x3000000处,我已经验证过,用以下代码可以往我指定的地址中重新写入数据,(我写进去的是翻转后的数据),我按照以下流程来验证故障注入:1.通过PCAP回读0x000xxxx的数据 2.将回读得到的数据翻转某个位置(在msk文件中对比过,不是屏蔽位) 3.将反转后的数据重新写入 4.回读验证刚才写进去的数据
以上4个步骤,我都正确完成了。现在的问题是,在第一步中,通过ILA窗口抓取,我的frameECC-FAR[25:0]有输出,显示了我当前回读的地址,其他信号都是0;我在第四步,重新回读的时候,ILA窗口会显示“no debug cores”,frameECC也无法正常工作。
我希望能通过frameECC实时指示出发生SEU的位置,以避免通过回读比对的方法来寻找翻转位。但是ECC总是出错

 

int XDcfg_WriteConfig_Frame(XDcfg *DcfgInstPtr, u32 StartAddress,u32 address,u32 WordLength)
{
    u32 Index ;
    int Status;
    u32 IntrStsReg = 0;

    unsigned int CmdIndex;
    unsigned int CmdBuf[32];

    CmdIndex = 0U;

    CmdBuf[CmdIndex++] = 0xFFFFFFFFU; 	/* Dummy Word */
    CmdBuf[CmdIndex++] = 0xFFFFFFFFU; 	/* Dummy Word */
    CmdBuf[CmdIndex++] = 0xFFFFFFFFU; 	/* Dummy Word */
    CmdBuf[CmdIndex++] = 0xFFFFFFFFU; 	/* Dummy Word */
    CmdBuf[CmdIndex++] = 0xFFFFFFFFU; 	/* Dummy Word */
    CmdBuf[CmdIndex++] = 0xFFFFFFFFU; 	/* Dummy Word */
    CmdBuf[CmdIndex++] = 0xFFFFFFFFU; 	/* Dummy Word */

/*step 1*/
 
    CmdBuf[CmdIndex++] = 0xFFFFFFFFU; 	/* Dummy Word */
	CmdBuf[CmdIndex++] = 0x000000BBU; //Bus width sync
	CmdBuf[CmdIndex++] = 0x11220044U; //Bus width detect
	CmdBuf[CmdIndex++] = 0xFFFFFFFFU; //Dummy
	CmdBuf[CmdIndex++] = 0xAA995566U; //Sync
/*Step 2      2 nops*/ 
	CmdBuf[CmdIndex++] = 0x20000000U; //NOP
	CmdBuf[CmdIndex++] = 0x20000000U; //NOP Addition

/*step4  reset CRC */
    CmdBuf[CmdIndex++] = 0x30008001U; //Write to CMD
    CmdBuf[CmdIndex++] = 0x00000007U; //Reset CRC command
	CmdBuf[CmdIndex++] = 0x20000000U; //NO ops

/*step5  wait for CRC to rst*/
    CmdBuf[CmdIndex++] = 0x20000000U; //NOP
	CmdBuf[CmdIndex++] = 0x20000000U; //NOP
	CmdBuf[CmdIndex++] = 0x20000000U; //NOP
	CmdBuf[CmdIndex++] = 0x20000000U; //NOP
	CmdBuf[CmdIndex++] = 0x20000000U; //NOP

/*step6 write IDCODE*/
    CmdBuf[CmdIndex++] = 0x30018001U; //write IDCODE
    CmdBuf[CmdIndex++] = 0x03727093U; //zynq DEVICE ID

/*step8 write FAR */
    CmdBuf[CmdIndex++] = 0x30002001U; //Write to FAR
    CmdBuf[CmdIndex++] = address; //FRAD

/*step8 write WCFG */
    CmdBuf[CmdIndex++] = 0x30008001U; //Write to CMD
	CmdBuf[CmdIndex++] = 0x00000001U; //WCFG command
	CmdBuf[CmdIndex++] = 0x20000000U; //NOP
    
    CmdBuf[CmdIndex++] = 0x20000000U; //NOP Addition
	CmdBuf[CmdIndex++] = 0x20000000U; //NOP Addition

/*step9 write FDRI*/
	CmdBuf[CmdIndex++] = 0x300040CAU; //write FDRI
	//CmdBuf[CmdIndex++] = 0x50000000U|NUM_FRAME_WORDS; //number of frames

/*write the instructions into */
    XDcfg_InitiateDma(DcfgInstPtr, (u32)(&CmdBuf[0]),
    XDCFG_DMA_INVALID_ADDRESS, CmdIndex, 0);
	
    /* Poll IXR_DMA_DONE */
	IntrStsReg = XDcfg_IntrGetStatus(DcfgInstPtr);
	while ((IntrStsReg & XDCFG_IXR_DMA_DONE_MASK) !=
			XDCFG_IXR_DMA_DONE_MASK) {
		IntrStsReg = XDcfg_IntrGetStatus(DcfgInstPtr);
	}

	/* Poll IXR_D_P_DONE */
	while ((IntrStsReg & XDCFG_IXR_D_P_DONE_MASK) !=
			XDCFG_IXR_D_P_DONE_MASK) {
		IntrStsReg = XDcfg_IntrGetStatus(DcfgInstPtr);
	}

/*write frame_data   no-secure mode */
	//
	Status=XDcfg_Transfer(DcfgInstPtr, (u32 *) StartAddress, WordLength,
			(u32 *) XDCFG_DMA_INVALID_ADDRESS, 0, XDCFG_NON_SECURE_PCAP_WRITE);
		if (Status != XST_SUCCESS)
			return XST_FAILURE;
    
    /* Poll IXR_DMA_DONE */
	IntrStsReg = XDcfg_IntrGetStatus(DcfgInstPtr);
	while ((IntrStsReg & XDCFG_IXR_DMA_DONE_MASK) !=
			XDCFG_IXR_DMA_DONE_MASK) {
		IntrStsReg = XDcfg_IntrGetStatus(DcfgInstPtr);
	}
	/* Poll IXR_D_P_DONE */
	while ((IntrStsReg & XDCFG_IXR_D_P_DONE_MASK) !=
			XDCFG_IXR_D_P_DONE_MASK) {
		IntrStsReg = XDcfg_IntrGetStatus(DcfgInstPtr);
	}

//foot commands
    CmdIndex = 0U;
    CmdBuf[CmdIndex++] = 0x20000000U;	/* Type 1 NOOP Word 0 */

    CmdBuf[CmdIndex++] = 0x30008001U; //Write to CMD
    CmdBuf[CmdIndex++] = 0x00000005U;	/* Start Command */
	CmdBuf[CmdIndex++] = 0x20000000U;	/* Type 1 NOOP Word 0 */

    CmdBuf[CmdIndex++] = 0x30008001U;	/* Type 1 Write 1  Word to Command */
	CmdBuf[CmdIndex++] = 0x00000007U;	/* RCRC Command */
	CmdBuf[CmdIndex++] = 0x20000000U;	/* Type 1 NOOP Word 0 */

    CmdBuf[CmdIndex++] = 0x30008001U;	/* Type 1 Write 1  Word to Command */
	CmdBuf[CmdIndex++] = 0x0000000DU;	/* DESYNC COmmand */
	
    CmdBuf[CmdIndex++] = 0x20000000U;	/* Type 1 NOOP Word 0 */
    CmdBuf[CmdIndex++] = 0x20000000U;	/* Type 1 NOOP Word 0 */


	XDcfg_InitiateDma(DcfgInstPtr, (u32)(&CmdBuf[0]),XDCFG_DMA_INVALID_ADDRESS, CmdIndex, 0);
	/* Poll IXR_DMA_DONE */
	IntrStsReg = XDcfg_IntrGetStatus(DcfgInstPtr);
	while ((IntrStsReg & XDCFG_IXR_DMA_DONE_MASK) !=
			XDCFG_IXR_DMA_DONE_MASK) {
		IntrStsReg = XDcfg_IntrGetStatus(DcfgInstPtr);
	}

	/* Poll IXR_D_P_DONE */
	while ((IntrStsReg & XDCFG_IXR_D_P_DONE_MASK) !=
			XDCFG_IXR_D_P_DONE_MASK) {
		IntrStsReg = XDcfg_IntrGetStatus(DcfgInstPtr);
	}


    return XST_SUCCESS;

}
Zhejiang University,China;
0 项奖励
回复