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.

[参考译文] AM5K2E02、如何测试 ECC?

Guru**** 2607635 points
Other Parts Discussed in Thread: AM5K2E02

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/581155/am5k2e02-how-to-test-ecc

主题中讨论的其他器件:AM5K2E02

AM5K2E02器件具有4MB L2高速缓存、支持 Arm 内核的 ECC/奇偶校验。 还有2MB 的 MSMC RAM、看不到它的 ECC、因此我认为它没有 ECC。

某些客户要求先测试 ECC 功能、然后才能使用 ECC 功能。

我有几个与此相关的问题

  1. MSMC RAM 是否具有 ECC、EDC 或奇偶校验?
  2. 是否有方法让客户测试 Arm L2 ECC 功能?
  3. TI 如何验证芯片 ECC 功能? 这是否在器件上进行了测试?

谢谢

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

    我已通知设计团队详细讨论这些问题。

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

    Brad

    当涉及 DSP 时、这就是我们处理 MSMC ECC 错误的方法。   AM5K2E02页面中的 MSMC 文档与具有 DSP 的器件的文档相同、因此我认为它也适用于 ARM、尤其是在使用裸机时。 因此、这里是:

    我查看有关 AM5K2E02  的 MSMC 用户指南 http://www.ti.com/lit/ug/spruhj6/spruhj6.pdf  、并查看第2.6章以了解错误校正。

    2.6.4关于净化引擎和净化控制寄存器(同一文档的表3-3第3.3.1章)、我知道为了测试 ECC、用户必须执行以下操作:

    向存储器写入至少32个字节的内容(并与32个字节对齐)

    禁用清理 (控制寄存器的位31)

    通过更改单个位来更改32字节字中的单个字节

    读取数据并验证新值是否在内存中(高速缓存无效等)

    启用清理

    从存储器中读取数据、观察到数据发生了变化、并观察到 SMCERRAR 寄存器的值

    重复该过程、但执行该过程时出现两位错误。 这次 ECC 无法校正该值、只能查看寄存器 SMNCEA  

    尝试一下。  如果不起作用、我们将与架构团队联系。

    已运行

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    刚刚注意到(感谢 Rex)您询问 L2 ECC

    只需找到合适的寄存器、即可对 L2执行相同的过程(即禁用清理更改值启用清理)

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

    我看过 spruhj6第2.6节、但我认为它不提供我进行此测试所需的路径。 如果您确实按照上述建议在 DSP 上工作、您能告诉我哪些操作可能是唯一的?

    当我读取清理引擎时、它似乎为您执行两项操作、作为256位基准面(32字节)上读取-修改-写入清理突发的一部分:
    (1)如果存储在奇偶校验 RAM 中的奇偶校验有效、它将检查256位基准的有效性、校正1位错误、将错误报告给各种寄存器等。如果校正了该校验、则将校正数据写回并重新生成奇偶校验位。
    (2)如果存储在奇偶校验 RAM 中的奇偶校验无效、它将读取32个字节并将这些32个字节写回、然后计算奇偶校验并将该奇偶校验 RAM 条目标记为有效。

    如2.6.2所述、非对齐32字节的写入会导致奇偶校验 RAM 条目被标记为无效。 我假设奇偶校验 RAM 除了奇偶校验位外、还必须有一个位指示奇偶校验 RAM 条目是否有效。 我想该位在计算奇偶校验 RAM 时置1、在发生非对齐32字节写入时清零。 (此外、我认为、如果缓存被禁用、对 SRAM 的写入只能是32字节对齐的写入。 否则、除非清除了缓存条目、并且这些条目对齐了64字节、否则不应写入 SRAM。

    因此、我不相信您上面列出的方法会起作用。 如果启用了高速缓存、那么即使更改单字节、在清除高速缓存行之前也不会进入 SRAM、此时将是精细到32字节的写入、因此将生成新的奇偶校验。 必须禁用高速缓存。 但是、如果缓存被禁用、并且在我读取第2.6.2节时执行单字节写入、这将把相应的奇偶校验 RAM 条目标记为无效、从而暂时使该内存区域不受 ECC 保护。 清理引擎似乎是用来产生并最终执行清理猝发的机制(相比之下、DDR3存储器控制器在其 ECCCTL 寄存器 RMW_EN 中有一个选项(spruhn7c)、 这会告诉 DDR3控制器有效地执行与清理猝发所执行的相同类型的操作)。

    我包含了我用于尝试上述方法的测试代码以及我获得的结果。 我在这里有一个延迟、每次运行时它都会持续几秒钟。 它在所有缓存关闭且 MMU 关闭的情况下运行。 我也尝试打开 MMU 并以这种方式运行它、但得到相同的结果。

    --------------------------------------
    static unsigned int buffer_32bytes[32/sizeof (unsigned int)]__attribute__((aligned (32)))={0};
    静态空 DO 位1位 ECC 测试输入 SRAM (空)

    volatile unsigned char * pu8 =(unsigned char *)&buffer_32bytes;
    volatile unsigned int *pu32 =(unsigned int *)&buffer_32bytes;
    volatile unsigned int *psedcc =(unsigned int *) 0x0bc00010;
    unsigned int smedcc =*psmedcc;
    unsigned int i;

    platform_write ("Address of SRAM:0x%08X\r\n"、(unsigned int)&buffer_32bytes);
    platform_write ("测试 SRAM 的大小:%d\r\n"、sizeof (buffer_32bytes);
    platform_write ("SMEDCC:0x%08X\r\n"、smedcc);

    for (i=0;i<32/sizeof (unsigned char);i++)
    pu8[i]=(unsigned char) i;
    platform_delaycycles (0x00200000 / 32 * 1024 / 16);
    ASM (" ISB");ASM (" DSB");

    for (i=0;i<32/sizeof (unsigned int);i++)
    platform_write ("%08X "、pu32[i]);
    platform_write ("\r\n");
    platform_delaycycles (0x00200000 / 32 * 1024 / 16);
    ASM (" ISB");ASM (" DSB");

    *psedcc = 0x8000000 |(smedcc & 0x7FFFFFFF);//关闭净化引擎
    platform_delaycycles (0x00200000 / 32 * 1024 / 16);
    ASM (" ISB");ASM (" DSB");

    pu8[17]= pu8[17]^ 0x80;//在字节索引17处翻转一个位
    platform_delaycycles (0x00200000 / 32 * 1024 / 16);
    ASM (" ISB");ASM (" DSB");

    for (i=0;i<32/sizeof (unsigned int);i++)
    platform_write ("%08X "、pu32[i]);
    platform_write ("\r\n");
    platform_delaycycles (0x00200000 / 32 * 1024 / 16);
    ASM (" ISB");ASM (" DSB");

    *psedcc = smedcc;//恢复 SMEDCC -打开净化引擎
    platform_delaycycles (0x00200000 / 32 * 1024 / 16);
    ASM (" ISB");ASM (" DSB");

    for (i=0;i<32/sizeof (unsigned int);i++)
    platform_write ("%08X "、pu32[i]);
    platform_write ("\r\n");
    platform_delaycycles (0x00200000 / 32 * 1024 / 16);
    ASM (" ISB");ASM (" DSB");

    --------------------------------------

    它为我提供了以下输出:

    --------------------------------------
    SRAM 地址:0x0C0A0280
    测试 SRAM 的大小:32.
    SMEDCC:0x44000001
    03020100 07060504 0B0A0908 0F0E0D0C 13121110 17161514 1B1A1918 1A1E1D1C
    03020100 07060504 0B0A0908 0F0E0D0C 13129110 17161514 1B1A1918 1F1E1D1C
    03020100 07060504 0B0A0908 0F0E0D0C 13129110 17161514 1B1A1918 1F1E1D1C
    --------------------------------------
    报告的 SMEDCC 值是开始测试之前的值。
    输出的第一行是测试如何初始化该存储器(32字节)。 除尘器仍在打开。
    第二行输出是在禁用除尘器和字节17之后(32字节字"13121110"更改为"13129110")。
    第三行是在激活并读取除尘器之后、但如图所示、数据未校正。

    如果您可以正常工作、您是否看到我的上述测试在哪里缺少您的测试可以正常工作的内容? 我想不能直接访问奇偶校验 RAM? 是否有办法确认 SRAM 的奇偶校验 RAM 条目包含一个标志该条目有效或无效的位(其中有效表示奇偶校验位有效且可以使用)、 无效意味着奇偶校验位无效、不应使用、这基本上表示当时没有 ECC)。

    我假设处理的 ARM ROM 代码启用 SRAM 上的 ECC? 因为手册默认情况下会提示 ECC 被禁用(SMEDCC 的第30位)、所以我会问、但是如果我在空闲模式下启动处理器、中断调试器、那么 SMEDCC 已经显示0x44000001、表示 PRR 已完成(正如预期的... 就我断开调试器而言、这将需要很长时间)并且 ECM 已启用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、我想我不明白您的要求。

    您说您要测试 ECC。 您能不能用语言描述测试 ECC 意味着什么?

    是否要输入错误并查看 ECC 是否纠正了错误?

    是否要确保 ECC 中长时间没有错误?

    请描述您考虑的测试

    此致

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

    感谢您的提问。 理想情况下、我们希望在初始化过程中测试 ECC 功能。 通过"测试 ECC"、我指的是您的想法:
    *奇偶校验:注入单个位错误、并确认检测到该错误
    * ECC:注入一个单位错误、确认其已更正;注入一个双位错误、确认检测到该错误

    目前、对于 DDR3控制器、我们主要可以测试它的 ECC 行为。 我们可以禁用 DDR3 ECC、翻转一位、重新启用 DDR3 ECC、然后读取该 DDR3位置并确认该位已校正、以及读取指示1位错误已校正的 DDR3状态寄存器。 我们对该份额中的每个数据位(全部为64位)执行此测试。 由于我们无法直接访问与这64个数据位相关联的8个奇偶校验位、因此我们不会将单位错误注入奇偶校验位。 我们也进行了类似的2位错误测试(翻转64个数据位内所有可能的2位错误模式、 并确保在读取时我们确实获得了一个中断、并且 DDR3状态位指示了2位错误)、由于我们没有直接访问权限、因此再次将错误注入8个奇偶校验位。

    理想情况下、我们希望在缓存(L1和 L2)和 SRAM 上执行相同类型的方法、检查以确保检测到错误(可以在何处注入错误)并采取记录的缓解措施。
    * L1-I:在缓存中注入一个位错误、然后尝试在该位置执行指令、确认缓存行无效并按照缓解措施的指示从存储器重新加载
    * L1-I:请勿测试2位注入、因为它看起来只有奇偶校验方案才能可靠地检测单位错误。 多位错误未确定
    * L1-D:将单个位错误注入"清理"缓存、然后尝试从该位置读取并确认缓存行无效并从 L2重新加载。
    * L1-D:将单个位错误注入"脏"缓存、然后尝试从该位置读取并确认更正后的缓存行已写入 L2、L1-D 缓存行已失效、并从(现已更新) L2重新加载。
    * L1-D:将2位错误注入"清理"缓存、然后尝试从该位置读取并确认缓存行无效并从 L2重新加载。
    * L1-D:将2位错误注入"脏"缓存、然后尝试从该位置读取并确认发生了异常。
    * L2:(类似于 L1-D 测试)
    * SRAM:注入单个位错误、等待足够长的时间以确保清理引擎已覆盖所有 SRAM、然后尝试从该位置读取数据并确认数据已更正。 检查 SRAM 状态位以确认净化引擎纠正了一个单位错误。
    * SRAM:注入一个双位错误、等待足够长的时间以确保清理引擎已覆盖所有 SRAM、然后尝试从该位置读取数据并确认数据尚未更正。 检查 SRAM 状态位以确认净化引擎检测到双位错误。
    * SRAM:禁用清理引擎。 注入一个单位错误、然后尝试从该位置读取并确认数据已被纠正。 检查 SRAM 状态位以确认 SRAM 返回更正后的数据。 再次读取并确认 SRAM 再次返回校正数据(因为除非校正数据被写回、否则 SRAM 中的数据不会校正)。
    * SRAM:禁用清理引擎。 注入双位错误、然后尝试从该位置读取并确认发生异常。 检查 SRAM 状态位以确认 SRAM 检测到2位错误。

    每个单位错误测试的理想选择是对奇偶校验中包含的每个位执行测试、包括奇偶校验位。 双位错误测试的理想选择是对数据位和奇偶校验位上的所有2位错误组合执行测试。 我们至少希望执行上述每项测试、以证明错误检测和由此产生的缓解步骤按预期运行。

    关于您最后一个有关确保 ECC 长时间内没有错误的问题;我们认为、如果我们可以在每次初始化期间执行此测试、我们将最大限度地减少 ECC 故障的风险。 从统计学上讲、在下一次电源复位被移除之前、只要处理器被初始化和使用、初始化期间成功测试的 ECC 功能就不可能发生故障。 但是、如果不可能发生这种情况、在每次初始化期间测试 ECC 功能、下一次初始化处理器时、测试将检测到 ECC 不再正常工作、因此该错误的暴露程度很低。

    Bill