Zynq7000系列FPGA中的DDRC纠错码(ECC)


仅在半总线宽度(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模式)

  1. 将reg_ddrc_soft_rstb编程为0(重置控制器)
  2. 通过将reg_ddrc.ECC_mode编程为3'b100来编程ECC模式
  3. 将reg_ddrc_dis_scrub编程为1'b0
  4. 程序reg_ddrc_data_bus_width到2'b1
  5. 将reg_ddrc_soft_rstb编程为1(使控制器退出重置)

请注意,建议在从DDR空间读取任何数据之前重新初始化整个DDR空间,以防止因访问未初始化的内存区域而产生ECC错误。

禁用ECC操作(从ECC模式切换到非ECC模式)

  1. 将reg_ddrc_soft_rstb编程为0(重置控制器)
  2. 通过将reg_ddrc.ECC_mode编程为3'b000来编程ECC模式
  3. 将reg_ddrc_dis_scrub编程为1'b1
  4. 将reg_ddrc_data_bus_width编程为2''00
  5. 将reg_ddrc_soft_rstb编程为1(使控制器不再复位)

AR#58684中描述了通过将错误位插入DDR存储器来测试ECC可纠正/不可纠正错误检测的示例测试程序。

监控ECC状态

  1. CHE_CORR_ECC_ADDR_REG_OFFSET给出ECC纠错的行/列信息
  2. CHE_UNCOR_ECC_ADDR_REG_OFFSET给出ECC不可恢复错误的行/列信息
  3. CHE_CORR_ECC_LOG_REG_OFFSET的B[0]表示ECC状态可纠正
  4. CHE_UNCOR_ECC_LOG_REG_OFFSET的B[0]表示ECC状态不可纠正
  5. CHE_ec_STATS_REG_OFFSET
  • B[7:0]->给出不可纠正错误的数量
  • B[15:8]->给出可纠正错误的数量

注意:CHE_ECC_STATS_REG_OFFSET报告自上次读取寄存器以来观察到的具有可纠正和不可纠正ECC错误的突发事务数。

  • 19
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值