作者:Ivy Guo,AMD工程师;来源:AMD开发者社区
上次介绍了如何推迟SEM IP的扫描。 在Versal器件中, SEM功能的实现发生了很大变化,整个解决方案是基于library实现的。下面我们一起看一下如何推迟XilSEM扫描功能的开始。
参考<如何使能Versal的XilSEM功能> 一文, 我们建立一个使能了XilSEM功能的设计。 观察CIPS中XilSEM对应的选项:
本次测试以CRAM的扫描为例 (NPI扫描方法相同):
Enable Configuration RAM soft error mitigation选项下面有两个小选项: Error correction capability, 根据设计需求可以选择为Detect & Correct, 或者Detect Only. 本次我们需要关注的是’Scan Strategy’ 这个选项, 默认是’Immediate Start’, 还有一个是’Deferred Start’ . 这个选项是问是否在配置完成后立即开始CRAM扫描工作, 还是推迟扫描的开始直至收到指令。
接下来:
是问选择使用硬件第一轮扫描结果作为ECC golden校验值, 还是使用软件生成配置文件时计算出来的golden校验值。 这个选项对本次测试无影响。 可以任意选择。
高级选项’Enable PMC_PL_GPO for status signals into PL’, 是把XilSEM的错误状态输出到PL里面,可以通过PL的GPIO或者逻辑监测XilSEM的运行情况. 该选项对本次测试结果亦无影响. 可以按需选择。
综上,我们测试以下两种配置:
1、Immediate Scan
2、Deferred Scan
由于Deferred Start必须由用户发起请求,XilSEM的工作才能开始.查看XilSEM Example Design的source文件发现如下定义:
/* Initialize CRAM scan if not initialized
* This is applicable when CRAM Scan is set for deferred start up.
*/
(void)XSem_CmdCfrGetStatus(&CfrStatusInfo);
IsInitDone = CfrStatusInfo.Status & CRAM_STATUS_INIT_DONE_MASK;
if (IsInitDone != CRAM_STATUS_INIT_DONE_MASK) {
Status = XSem_CfrApiInitCram();
if (XST_SUCCESS != Status) {
xil_printf("CRAM Initialization failed\n\r");
goto END;
} else {
xil_printf("CRAM Initialization Done\n\r");
}
} else {
xil_printf("CRAM scan is configured for immediate start\n\r");
}
检测是否完成CRAM扫描对应的初始化工作,没有,则调用XSem_CfrApiInitCram来完成。
后续在插错测试中,调用:
Status = XSem_CfrApiStartScan();
if (XST_SUCCESS != Status) {
xil_printf("Start Scan Failed\n\r");
goto END;
启动扫描工作.
基于VCK190开发板, 分别生成xsa文件以及对应的pdi和elf文件. 为便于查看XilSEM扫描的状态,我们需要用到以下寄存器:
SEM_CRAM_SCAN_STATUS (PLM_RTCA) Register
Register Name SEM_CRAM_SCAN_STATUS
Absolute Address 0x00F2014084 (PLM_RTCA)
Description XILSEM CRAM Scan Status Register
https://docs.xilinx.com/r/en-US/am012-versal-register-reference/SEM_CRAM_SCAN_STATUS-PLM_RTCA-Register
测试结果:
下载执行Immediate Scan的pdi文件:
看低四位寄存器, OBSERVATION_STATE以及CRAM_IN_DESIGN已经被置为1, 说明CRAM的扫描工作已经初始化完毕,并且正常进入了监测状态。
接下来下载Cram Scan的elf文件:
由于elf文件里面默认有插错测试, 所以CORRECTABLE_ERR以及ECC_CORRECTION_DONE对应置位,表明有检测到ECC error,并且已经纠正。
对比测试Deferred Scan的效果. 先下载pdi文件:
下载结束后, 对应寄存器的位全为0. 说明XilSEM的工作没有开始。
紧接着执行一次elf文件:
发现寄存器的返回值和Immediate Scan执行elf后的状态一样了. 说明XilSEM的扫描功能已经被启动, 并且依次执行了插错测试等。
通过这种设置, 我们可以根据需要’无限’延迟XilSEM的扫描开始, 需要时再启动。