仅在半总线宽度(16位)数据宽度配置中提供可选的ECC支持。这种配置下,外部DRAM DDR设备需要26位,其中16位用于数据,10位用于ECC。每个数据字节使用独立的5位ECC字段,这种模式提供了单错误纠正和双错误检测的能力。
ECC位与数据位以及未使用的位交织在一起,这种交织方式有助于在数据传输过程中同时传输数据和ECC校验信息,以便在接收端能够实时进行错误检测和纠正。如表10-13所示。
ECC位的使用
- 单错误纠正:当数据中的任何一位发生错误时,ECC算法能够使用这些ECC位来定位和纠正这个错误。这确保了数据的完整性和准确性。
- 双错误检测:此外,ECC还能检测到数据中的两位错误,尽管它不能纠正这种情况。检测到双错误后,系统可以采取适当的错误恢复措施,如重试操作、记录错误日志或触发警报。
ECC初始化
ECC仅在16位总线模式下被支持。当ECC被启用时,写操作会计算并存储ECC码以及数据,读操作会读取数据并对照存储的ECC码进行检查。因此,在读取未初始化的内存位置时,可能会收到ECC错误。为了避免此问题,必须先写入所有内存位置,然后才能读取。请注意,由于ECC是在字节分辨率上计算和检查的,因此对仅初始化了该字节的16位位置读取1个字节(16位位置的第二个字节未初始化)不会导致ECC错误。控制器仅检查已读取字节的ECC。通过CPU写入整个DDR DRAM可能需要大量时间。使用DMA设备为DDR控制器初始化生成更大的脉冲串并卸载CPU可能是值得的。请注意,只有Arm CPU和ACP接口可以访问DDR的最低512KB(见表4-1),CPU软件可能仍然需要初始化基于ECC的DDR的这个区域。
请注意,虽然只有两个数据字节通道用于实际数据,但所有四个通道都在ECC模式下使用,因此必须在所有通道上执行DDR训练。
ECC错误行为
对于可纠正的ECC错误,系统通常不会通过中断或AXI响应来主动发出错误信号。
对于不可纠正的ECC错误,控制器将SLVERR响应返回给发出请求的AXI总线主控器。在这两种情况下,有关错误的信息(如列、行和存储体错误地址、错误字节通道等)都记录在控制器寄存器空间中。
当控制器检测到可纠正的ECC错误时,它会执行以下操作:
- 将校正后的数据作为读取数据的一部分发送到核心。
- 将ECC错误信息发送到寄存器接口进行记录。
- 执行RMW操作以更正DRAM中存在的数据(仅当启用ECC清理时(reg_ddrc_dis_scrub=0)。此RMW操作对核心不可见。在任何时候,控制器中只能有一个未执行的擦除RMW命令。当控制器处理另一个擦除RMW时,不会对发生的单比特ECC错误执行擦除。
当控制器检测到不可纠正的错误时,它会执行以下操作:
- 将不可纠正的数据与错误响应一起发送到核心。这会导致AXI接口上的AXI SLVERR响应以及损坏的数据。AXI SLVERR响应将返回给待处理的事务主机,可能会产生L2/DMA中断、CPU预取/数据异常,或直接转发给PL AXI主机。
- 将ECC错误信息发送到寄存器模块进行记录。
ECC模式下的数据掩码
ECC是在一个字节的数据上计算的,因此如果需要,可以在启用ECC的情况下屏蔽任何数据字节。这减轻了控制器在发生字节掩码时执行RMW操作的需要。
ECC编程模型
以下详细介绍了ECC编程要求。请注意,这些配置是常规DDR初始化编程的补充。另请注意,建议在读取任何数据之前初始化整个DDR空间,以防止因访问未初始化的内存区域而产生ECC错误。
启用ECC操作(从非ECC模式切换到ECC模式)
- 将reg_ddrc_soft_rstb编程为0(重置控制器)
- 通过将reg_ddrc.ECC_mode编程为3'b100来编程ECC模式
- 将reg_ddrc_dis_scrub编程为1'b0
- 程序reg_ddrc_data_bus_width到2'b1
- 将reg_ddrc_soft_rstb编程为1(使控制器退出重置)
请注意,建议在从DDR空间读取任何数据之前重新初始化整个DDR空间,以防止因访问未初始化的内存区域而产生ECC错误。
禁用ECC操作(从ECC模式切换到非ECC模式)
- 将reg_ddrc_soft_rstb编程为0(重置控制器)
- 通过将reg_ddrc.ECC_mode编程为3'b000来编程ECC模式
- 将reg_ddrc_dis_scrub编程为1'b1
- 将reg_ddrc_data_bus_width编程为2''00
- 将reg_ddrc_soft_rstb编程为1(使控制器不再复位)
AR#58684中描述了通过将错误位插入DDR存储器来测试ECC可纠正/不可纠正错误检测的示例测试程序。
监控ECC状态
- CHE_CORR_ECC_ADDR_REG_OFFSET给出ECC纠错的行/列信息
- CHE_UNCOR_ECC_ADDR_REG_OFFSET给出ECC不可恢复错误的行/列信息
- CHE_CORR_ECC_LOG_REG_OFFSET的B[0]表示ECC状态可纠正
- CHE_UNCOR_ECC_LOG_REG_OFFSET的B[0]表示ECC状态不可纠正
- CHE_ec_STATS_REG_OFFSET
- B[7:0]->给出不可纠正错误的数量
- B[15:8]->给出可纠正错误的数量
注意:CHE_ECC_STATS_REG_OFFSET报告自上次读取寄存器以来观察到的具有可纠正和不可纠正ECC错误的突发事务数。