1 理论概述(需要了解)
启用内存测试后,为了验证功能的有效性,需要用户手动去注入错误,进而验证内存测试功能是否有效。在没有错误发生的情况下,手动注入错误是很有必要的。
对于无损测试而言,可以通过ECCMAP在NDT之前用错误的ECC编码某一个word,从而注入一个数据错误。
对于有损测试而言,可以通过RANGE.INJERR位注入数据错误。
- 当RANGE.INJERR=1时,将RANGE.ADDR作为指向物理SRAM位置的指针,在测试期间不会对该位置进行写访问。
- 然后,在测试之前,软件可以在该位置写入一个特定的值(即使用RDBFL寄存器使用单个SRAM写访问)。
- 最后使用 RANGE.INJERR=1和RAEN =1 运行测试。测试针对的是整个内存空间,在RANGE.ADDR对应的地址不会进行写操作,导致测试过程中预期数据不匹配。
注入错误后,可以测试所有正常的诊断和通知——也就是说,触发警报,在无损测试期间在ETRR/ERRINFO中跟踪错误。FAIL被设置,当FAILDUMP=1时,FDA被设置,及可以获取故障位映射。故障位映射:预期数据模式XOR实际数据模式。
在测试过程中,通过设置SFLE=1即可触发地址错误。注意:这将触发每个地址的地址错误,在无损测试期间,会导致ETRR 和 ERRINFO充满地址错误。
目前只支持单/双bit错误检测,错误bit位超过2个,则检测只能检测到双Bit错误,没办法检测超出2的多bit错误检测。
2 测试步骤
2.1 使能SSH
上一篇文章TC377 - MTU MBIST之内存自动初始化+无创测试”已经详细介绍了如何使能SSH,不清楚可以查询“https://blog.csdn.net/qq_41164088/article/details/134508634”。
2.2 读取单地址内存数据
SSH可以读取单个地址的数据。RDBFL寄存器保存了一个完整的内存字的内容,因此可以读取所有的内存位,包括ECC或奇偶校验位。
2.2.1 具体步骤
1)关闭UCE警告反应。——该操作已经在使能SSH时就已经关闭。
2)编程序列为{r},对应的CONFIG0~1、RANGE寄存器配置如下:
- CONFIG0:NUMACCS = 1,ACCSTYPE = 1(read)。
- CONFIG1:AG_MOD=0( run the test with linear address generation)。
- RANGE:RAEN = 0 (single address & address to be read),ADDR=期望修改数据的目标地址。
3)启动内存测试。寄存器配置如下:
- MCONTROL:FAILDMP=0(Fail bitmap do not dump),DIR=1(UP: Address direction is lowest to highest),START=1(Start memory test,MSTATUS.DONE将会在此时被清除),MSTATUS.DONE被清除后在设置START=0。
4)等待MSTATUS.DONE被置起,即等待内存测试结束。
5)读RDBFL寄存器。
6)退出内存测试模式。
7)清除由于该操作置起的UCERR和 OPERR标志。
2.3 单地址内存数据写入
SSH可以用来将RDBFL寄存器的内容写入单个内存位置。RDBFL保存了一个完整的内存字的内容,因此可以写入所有的内存位,包括ECC或奇偶校验位。
2.3.1 具体步骤
1)关闭UCE警告反应。——该操作已经在使能SSH时就已经关闭。
2)编程序列为{w},对应的CONFIG0~1、RANGE、RDBFL寄存器配置如下:
- CONFIG0:NUMACCS = 1,ACCSTYPE = 0(read)。
- CONFIG1:AG_MOD=0( run the test with linear address generation)。
- RANGE:RAEN = 0 (single address & address to be read),ADDR=期望修改数据的目标地址。
- RDBFL:WDATA=期望写入的数据。
3)启动内存测试。寄存器配置如下:
- MCONTROL:FAILDMP=0(Fail bitmap do not dump),DIR=1(UP: Address direction is lowest to highest),先设置START=1(Start memory test,MSTATUS.DONE将会在此时被清除),MSTATUS.DONE被清除后在设置START=0。
4)等待MSTATUS.DONE被置起,即等待内存测试结束。
5)退出内存测试模式。
6)清除由于该操作置起的UCERR和 OPERR标志。
3 单/双bit数据错误注入示例代码
static uint8 SM202_RamMtuMbist_CorrectableDataBitErrorInject(ErrorInjectType errorType, IfxMtu_MbistSel sramMbistSel, uint16 sramAddr, uint8 rdbflCnt)
{
Ifx_MTU_MC *mc = &MODULE_MTU.MC[sramMbistSel];
uint16 safetyWdtPassword = Ifx_Ssw_getSafetyWatchdogPassword();
Ifx_Ssw_clearSafetyEndinit(safetyWdtPassword);
/* Disable MISCE && OPENE*/
mc->ALMSRCS.B.MISCE = 0;
mc->ALMSRCS.B.OPENE = 0;
/* 1 Enable SSH */
uint32 mask = 0;
volatile uint32 *mtuMemtest = IFX_SSW_NULL_PTR;
volatile uint32 *mtuMemstat = IFX_SSW_NULL_PTR;
volatile uint32 *mtumemDone = IFX_SSW_NULL_PTR;
if(sramMbistSel < 32)
{
mtuMemtest = &MTU_MEMTEST0;
mtuMemstat = &MTU_MEMSTAT0;
mtumemD