您好!
我正在开发一个软件序列、目标是测试 DSP TMS302C6678的 EDC/ECC 机制。
顺序如下:
-
在 DDR3中启用 EDC (在 L1P、L2和 MSM 中)和 ECC
-
L2、MSM 和 DDR3的初始化为0
-
存储器保护、中断的初始化
-
运行 EDC/ECC 测试
L2 EDC 测试包括:
5-1/写入任意 L2地址(本例中为0x00868000)值0xFFFFFFFF
N.B:0x00868000是一个任意地址。 唯一的条件是选择一个允许 R/W/X 的地址。
5-2/通过将 L2EDCMD 寄存器的位3设置为1来挂起 L2 EDC 计算(以暂停 EDC 计算)
5-3/在地址0x00868000处写入0xFFFFFFF3。
N.B:选择0xFFFFFFF3的值是因为只有两个位与之前的0xFFFFFFFF 值不同
N.B.2:此步骤的目标是模拟地址0x00868000处位2和位3的损坏。 由于 EDC 机制被暂停、奇偶校验 RAM 不会被更新
5-4/通过将 L2EDCMD 寄存器的位0设置为1来启用 L2 EDC 机制
5-5/在地址0x00868000处执行读取访问
5-6/等待 L2 EDC 中断
但是、该序列不起作用(永远不会调用对应于 corepac 事件117的 L2 EDC 中断)。
我怀疑在步骤5-1期间完成的 L2写入不会在128位中执行。 我知道我的指令是32位写操作、但我初想 DSM 存储器控制器将始终以128位执行访问。 看来情况并非如此。 如果已确认、则相应的奇偶校验 RAM 不会按预期更新(因为访问小于128位、如 C66x corepac 数据表的§11中所述)、仅更新位有效性。
因此、我已经尝试在上一个序列中替换步骤5-1、方法如下:
5-1-bis/Program IDMA、通过如下方式设置 IDMA 寄存器、在[0x00868000-0x00868010]范围内写入值0xFFFFFFFF:
-
IDMA1_SOURCE 设置为0xFFFFFFFF
-
IDMA1_目的 设置为0x00868000
-
IDMA1_COUNT 设置为0x00010010
仅通过此修改、我的测试就会正常(即生成了 corepac 事件117)。
这似乎证实了我对存储器访问的分析在128位内没有完成。
我执行了第三项测试、如下所示:
5-1-ter/在4条汇编指令中在地址0x00868000、0x00868004、0x00868008和0x0086800C 处写入0xFFFFFFFF
结果:测试为 KO、未生成事件117。 这似乎确认了每个 DSP 访问都是在32位中完成的。
因此、我的测试工作正常(使用 IDMA)、但我有以下问题:
Q1-如果 DSP R/W 指令在32位内完成、则奇偶校验 RAM 将永远不会更新、并且只有位有效性将被设置为无效。 您能否解释一下在这种情况下如何检测/纠正 L2存储器损坏?
问题2 - C66x corepac 数据表的§11.3.3中介绍了一种清理技术。 是否是检测 L2数据损坏的唯一方法?
问题3 -您能解释一下、如果有办法强制 DSP 内核的每个 R/W 访问在128位内完成吗? 如果已经是这种情况、您能向我解释一下我在测试序列中做了哪些错误?
Q4-我正在尝试在 MSM 内存中执行相同类型的测试,但它似乎很复杂,因为 SPRUGW7A 的§2.5.2.1“Setting ECM=1启用错误校正; 但是,对 ECM 位的任何进一步写入都将被忽略(也就是说,一旦启用,错误校正将保持启用状态,直到 MSMC 复位)。” 由于 ECC 机制无法停用,因此无法使用我的技术测试 MSM EDC 机制,因为我无法“模拟”MSM 数据损坏。 我是对的、还是有其他测试方法?
问题5 - DDR3的同一个问题、是否可以测试 DDR3 ECC 机制(使用下面描述的测试序列或通过其他方式)?
提前感谢您的回答。
此致、