This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS570LS3137:SRAM 模拟双位 ECC 错误

Guru**** 2199010 points
Other Parts Discussed in Thread: HALCOGEN
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1066050/tms570ls3137-simulation-of-sram-double-bit-ecc-error

部件号:TMS570LS3137
“线程:HALCOGEN测试”中讨论的其它部件

大家好,

在我们的项目中,启用了 ECC 以检测 SRAM 双位错误。 我们正在寻找一种模拟双位奇偶校验错误并查看其影响的方法。

但是,阅读完 TCRAM 模块的 SPNU499c 第6.6段仿真/调试模式行为后,调试器似乎无法在调试模式下强制执行此错误。

在检测到错误时,确保正确启用 SRAM ECC 并确认其影响的技术(如断言 nError pin)必须与 SECDEC  闪存错误检测和校正控制寄存器1的情况相同, 通过读取位于 OTP 的预定义地址?

非常感谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好,我们的专家已经不在办公室了。 请期待收到延迟的回复。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,查克,

    您可以注入 SRAM ECC 错误。 请参阅 sys_selftest.c 中的函数 checkB0RAMEC():

    检查 B0RAMECC 无效(无效)

    挥发性 uint64 ramread = 0U;
    易失性 UINT32正读数=0U;
    UINT32加扰1勘误表,加扰2勘误表=0U;

    UINT64加扰 A1_bk =加扰 A1bit;
    UINT64加扰 A2_Bk =加扰 A2bit;
    挥发性 UINT32 I;
    /*用户码开始(36)*/
    /*用户代码结束*/

    /*启用写入 ECC RAM,启用 ECC 错误响应*/
    加扰1REG->RAMCTRL = 0x0005010AU;
    加扰2REG->RAMCTRL = 0x0005010AU;

    /*第一个1位错误将导致错误响应*/
    tced1REG->RAMTHRESHOLD = 0x1U;
    加线2REG->RAMTHRESHOLD = 0x1U;

    /*允许将 SERR 报告给 ESM */
    加扰1REG->RAMINTCTRL = 0x1U;
    加线2REG->RAMINTCTRL = 0x1U;

    /*导致1位 ECC 错误*/
    _coreDisableRamEcc_();
    加扰1位错误^= 0x1U;
    _coreEnableRamEcc_();

    /*禁用写入 ECC RAM */
    加扰1REG->RAMCTRL = 0x0005000AU;
    加扰2REG->RAMCTRL = 0x0005000AU;

    /*从具有1位 ECC 错误的位置读取*/
    ramread = tcampa1位;

    /*检查错误状态*/
    加扰1勘误表=加扰1 REG->RAMERRSTATUS & 0x1U;
    加扰2勘误表=加扰2 REG->RAMERRSTATUS & 0x1U;
    /*SAFETYMCUSW 139 S MR:13.7 <批准>“LDRA Tool Issue”*/
    /*SAFETYMCUSW 139 S MR:13.7 <批准>“LDRA Tool Issue”*/
    IF ((加扰1勘误=0U)和&(加扰2勘误=0U))

    /* TCRAM 模块未反映 CPU */报告的1位错误
    自测故障通知(CHECKB0RAMECC_FIL1);
    }
    否则

    /*清除 SERR 标志*/
    tced1REG->RAMERRSTATUS = 0x1U;
    加线2REG->RAMERRSTATUS = 0x1U;

    /*清除 ESM 组1通道26和28的状态标志*/
    esmREG->SR1[0U]= 0x14000000U;
    }

    /*启用写入 ECC RAM,启用 ECC 错误响应*/
    加扰1REG->RAMCTRL = 0x0005010AU;
    加扰2REG->RAMCTRL = 0x0005010AU;

    /*导致2位 ECC 错误*/
    _coreDisableRamEcc_();
    加扰 A2bitError ^= 0x3U;
    _coreEnableRamEcc_();

    /*从具有2位 ECC 错误的位置读取数据,这将导致生成数据中止*/
    ramread =加扰 A2bit;

    /*恢复柱塞值前的延迟*/
    /*SAFETYMCUSW 134 S MR:12.2 <批准>“等待几个时钟周期(未使用的值)”*/
    /*SAFETYMCUSW 134 S MR:12.2 <批准>“等待几个时钟周期(未使用的值)”*/
    对于(i=0U;i<10U;i++)

    }/*等待*/

    regread = tced1REG->RAMUERRADDR;
    regread =加扰2REG->RAMUERRADDR;

    /*禁用写入 ECC RAM */
    加扰1REG->RAMCTRL = 0x0005000AU;
    加扰2REG->RAMCTRL = 0x0005000AU;

    /*计算正确的 ECC */
    加扰 A1bit =加扰 A1_bk;
    加扰 A2bit =加扰 A2_Bk;

    /*用户码开始(37)*/
    /*用户代码结束*/
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    QJ 您好,

    我们在开发过程中不使用 HalCoGen,对我来说,对上述函数的解码有点丢失。 是否有其他解释,或者在 spnu499c 中有任何地方可以看到模拟双位 SRAM ECC 错误的确切顺序和过程?

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,查克,

    TCRAM 受 ECC 保护,允许 CPU 纠正任何单位错误,并在64位值范围内检测双位错误。  错误纠正代码(ECC)也存储在 RAM 内存空间中。  对于从 RAM 中读取的每64位 ECC,CPU 在其 ECC 总线上也会读取8位 ECC。

    ECC 内存也可以直接访问。  可以通过设置  RAMCTRL 寄存器的 ECC_WR_EN 位来启用对 ECC 空间的写入。 可以执行注射两位 ECC 错误:

    0。备份要执行测试的地址的 SRAM 内容,例如0x08000032 (对齐64位)

    1.启用 ECC 写入: RAMCTRL->ECC_WR_EN =1;

    2.禁用 RAM ECC

    3.在0x08000032处切换 SRAM 内容的2位 ECC 代码(0x08400032)

    4.启用 RAM ECC

    5.禁用 ECC 写入 SRAM: RAMCTRL->ECC_WR_EN =0;

    6.读取 SRAM 内容(0x08000032):  从具有2位 ECC 错误的位置读取将导致数据中止

    7.清除数据中止处理程序中的 ESM 错误

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    QJ 您好,

    这更清晰。 谢谢你。 我仍然对以下代码段有问题,一旦执行第三行(ram =*(u64 *) 0x08000032;),就会生成异常中止。 你能给我启迪这一事业吗?

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    case 28: u64 ram;
    int ACTLR;
    ram = *(u64 *) 0x08000032;
    RAMCTRL1_bit.ECC_WR_EN = 1;
    ACTLR = __MRC(15,0,1,0,1);
    ACTLR &= 0xF3FFFFFF;
    __MCR(15,0,ACTLR,1,0,1);
    asm(" nop");
    asm(" nop");
    asm(" nop");
    *(u64 *) 0x08400032 = ram ^ 0x3;
    ACTLR = __MRC(15,0,1,0,1);
    __MCR(15,0,ACTLR|0x0C000000,1,0,1);
    asm(" nop");
    asm(" nop");
    asm(" nop");
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    SRAM 是否已初始化?  可以使用专用的自动初始化硬件初始化 RAM 内存。 所有 RAM 数据存储器都被初始化为零,ECC 内存被初始化为零的正确 ECC 值,即0Ch。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的,所有 SRAM 位置都是硬件自动初始化的。

    奇怪的是,如果源代码中的所有“u64”都更改为“u32”,则一路向末尾,无异常中止。 看起来32位读写不会导致数据中止。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    以下屏幕截图对初始化的 ECC 是否有意义? 某些位置的值不是0x0C。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="91537" url="~/support/icles/arm-based 微处理器组/基于 ARM 的微控制器/f/arm-based 微控制器-forum/1066050/tms570ls3137-simulation -of SRAM - double-bit-ecc-error/3961458#3961458"]第三行被执行(异常终止*),生成为0x0832 *(异常)。 您能给我提供原因的启示吗?[/引用]

    我很抱歉。 0x08000032未与64位内存边界对齐。  

    请尝试   ram =*(uint64 *) 0x08000038;

    并更改此行                *(u64 *) 0x08400032 = RAM ^ 0x3;

    至                *(u64 *) 0x08400032 ^= 0x3;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="91537" url="~/support/icles/arm-based 微处理器组/基于 ARM 的微控制器/f/arm-based 微控制器-forum/1066050/tms570ls3137-simulation -of SRAM - double-bit-ecc-error/3961458#3961458"]第三行被执行(异常终止*),生成为0x0832 *(异常)。 您能给我提供原因的启示吗?[/引用]

    我很抱歉。 0x08000032未与64位内存边界对齐。  

    请尝试   ram =*(uint64 *) 0x08000038;

    并更改此行                *(u64 *) 0x08400032 = RAM ^ 0x3;

    至                *(u64 *) 0x08400032 ^= 0x3;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    QJ 的美好一天

    我对建议的更改的测试不起作用,在整个序列后没有生成异常。

    现在,为了便于内存检查,我已将该地址更改为0x08000040和 ECC 地址0x08400040,这两个地址都是8字节对齐的。 这是新序列:

    1. 备份 RAM 为 0x08000040
    2. 禁用 RAM ECC  检查
    3. 启用 ECC RAM 写入
    4. 在0x08400040时切换2位
    5. 禁用 ECC RAM 写入
    6. 启用 RAM ECC 检查
    7. 阅读0x08000040以生成数据中止异常:此处无任何反应
    8. 恢复 RAM  0x08000040

    下面是修改后的代码段。 什么可能是错误的?

    如果您需要,我将提供记忆视图捕获。

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    case 32: u64 ram, err; // local variables
    u32 ACTLR;
    ram = *(u64 *) 0x08000040; // backup SRAM contents
    ACTLR = __MRC(15,0,1,0,1); // disable RAM ECC by
    ACTLR &= 0xF3FFFFFF; // clearing bits 26 & 27
    __MCR(15,0,ACTLR,1,0,1); // for even and odd banks
    RAMCTRL1_bit.ECC_WR_EN = 1; // enable ECC RAM write
    *(u64 *) 0x08400040 ^= 0x3; // toggle 2 bits of ECC code (0x08400040) of SRAM contents at 0x08000040
    RAMCTRL1_bit.ECC_WR_EN = 0; // disable ECC RAM write
    ACTLR = __MRC(15,0,1,0,1); // enable RAM ECC by
    ACTLR |= 0x0C000000; // setting bits 26 & 27
    __MCR(15,0,ACTLR,1,0,1); // for even and odd banks
    err = *(u64 *) 0x08000040; // read to generate data abort exception
    *(u64 *) 0x08000040 = ram; // restore SRAM contents
    break;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    QJ 您好,

    请与我联系,任何帮助都将不胜感激。

    卡盘。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,查克,

    顺序看起来不错。  RAMCTRL 寄存器的其他位字段的值是多少? ECC 检测(位3~0)和奇偶校验(位19~16)是否已启用? 默认情况下启用 ECC 检测和奇偶校验。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    QJ 您好,

    在执行指令之前错误=*(u64 *) 0x08000040:

    注册 RAMCTRL1的默认值为0x0005 000a,其中 ADDR_parity 禁用=0x5和 ECC_DETAL_EN=0xA。  

    注册 RAMERRSTATUS1=0x0000

    另一个相关的问题是,由于此 ECC 检查将导致双位未校正 SRAM 错误,为什么我应该期待出现数据中止异常而不是 ESM Group3错误,并声明 nError 输出信号?

    我还应该配置 RAMCTRL2吗? 为什么有两组寄存器?

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    除此之外,在读取地址 0x08400040时,它是0x0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c,我认为:

    1. 此指令无效:*(u64 *) 0x08400040 ^= 0x3;
    2. 这不是正确的位置。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="91537" url="~ë/support/icles/arm-based 微处理器组/基于 ARM 的微控制器/f/arm-based 微控制器-forum/1066050/tms570ls3137-simulation -of SRAM - double-bit-ecc-error/3967399#3967399"]为什么我应该期待出现数据异常,而不是断言组输出错误3?

    双位 ECC 错误 会导致 CPU 异常中止,并将 nError 降低,并设置 ESM 3.3/3.5

    [引用 userid="91537" url="~/support/icles/arm-based 微处理器组/基于 ARM 的微处理器/f/arm-based 微处理器- forume/1066050/tms570ls3137-simul模拟 SRAM -双位 ECC 错误/3967399#3967399]I 是否还应该配置 RAMCTRL2? 为什么有两组寄存器?

    BTCM 接口(用于 RAM)分为两部分–B0TCM 和 B1TCM。 RAMCTRL 1用于 B0TCM,RAMCTRL2用于 B1TCM。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

      *(volatile UINT32 *) 0x08400040U ^= 0x3;   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 QJ 的支持,

    最后,问题是64位内存读取地址0x08000040。 相反,无论在切换2位 ECC 时是否使用了关键字 volatile,它都应该是与8位边界对齐的32位读取。

    摘要说明32位 RD/WR 应用于所有访问,而不是64位。

    此致!