一、 概述
在上一讲中我们提到了ECC寄存器的控制接口,使用axi4_lite接口提供了一种标准、简单、***的通信协议。可以通过读寄存器地址来访问寄存器中的数据,也可以通过写寄存器来改变寄存器的值,从而实现对ECC功能的控制。
二、 axi4_lite接口
ECC的控制器接口如下,包括读地址、写地址、写响应、读数据、读响应、写数据。
通过读地址和读数据通道来读取ECC寄存器的值,
通过写地址和写数据来向ECC寄存器中写值,实现ECC的控制。
在 Vivado 中为 DDR4 IP 核启用了 ECC(纠错码)功能,并且选择了 AXI4 作为主接口时,会出现这组接口。它通过一个标准的、32位宽的的axi4_lite 总线与外部连接。
ECC功能特性:
1、这组接口与数据接口并行传输,不影响数据接口的传输,相当于在旁边实时监控着DDR4的读写操作。
2、当内存读写过程中发生错误时,ECC会将错误记录,包括:
l 错误类型:是能自动修复的单比特错误(可纠正错误),还是严重的多比特错误(不可纠正错误)。
l 错误地址:发生错误的内存地址
l 错误详情:具体是地址中哪个bit出现错误。
3、故障注入
可以向故障寄存器里写值,来实现向内存数据里写入错误数据,这样做的目的是测试ECC纠错机制是否正常工作,故意制造这个错误,可以验证ECC系统是否能自动检测并纠正它,从而验证ECC的可靠性。
注意:一次只能写入一个错误,例如,对于72位宽(64位数据+8位ECC)的数据,一次操作只能破坏前72位中的某一个bit。
4、中断配置
可以向中断寄存器中写入值来控制中断的产生条件:
当发生“可纠正错误”时要不要触发中断,当发生“不可纠正错误”时要不要触发中断。这样DDR控制器可以根据不同的错误等级做出不同的反应,比如只有发生不可纠正的错误才告知用户,或者通知用户ECC检测到了错误并纠正。
三、 ECC寄存器地址
ECC寄存器地址如下表所示,列出了ECC控制器地址和寄存器名称。
四、 ECC寄存器说明
ECC_STATUS
该寄存器记录了可纠正错误和不可纠正错误的发生情况。对于每种错误类型首次出现时,状态位会独立设置为 1。通过向相应的位位置写入 1 来清除状态位;也就是说,状态位只能被清零,而不能通过寄存器写入操作设置为 1。ECC 状态寄存器与 ECC 启用中断寄存器是相互独立运作的。
ECC_EN_IRQ
这个寄存器决定ECC状态寄存器中的CE_STATUS和UE_STATUS位的值是否断言中断输出信号(ECC_Interrupt)。如果CE_EN_IRQ和UE_EN_IRQ都设置为1(使能),则中断信号的值是CE_STATUS和UE_STATUS位之间的逻辑或。
ECC_ON_OFF
ECC_ON_OFF控制寄存器允许应用程序启用或禁用ECC检查。设计参数C_ECC_ONOFF_RESET_VALUE(默认开启)决定ECC开启/关闭设置的重置值。当ECC可能在外部内存中初始化,也可能不在外部内存中初始化时,这有助于启动操作。当关闭时,读操作的ECC检查是关闭的,但写操作的ECC生成是活跃的。
CE_CNT
这个寄存器计算可纠正错误的出现次数。它可以使用寄存器写入清除或预设为任何值。当计数器达到***值时,它不会换行,而是停止递增并保持在***值。CE计数器宽度的值固定为8位。
CE_FFA[31:0]
该寄存器存储***次访问带有可纠正错误的译码DRAM地址的低32位(31:0位)。当ECC状态寄存器中的CE_STATUS位被清除时,该寄存器重新启用以存储下一个可纠正错误的地址。存储失败的地址在复位后启用。
CE_FFA[63:32]
这个寄存器存储解码的DRAM地址的上32位(位[55:32])的***次发生访问与可纠正的错误。地址格式定义在Error address中。此外,该寄存器的上字节存储ecc_single信号。当ECC状态寄存器中的CE_STATUS位被清除时,该寄存器重新启用以存储下一个可纠正错误的地址。存储失败的地址在复位后启用。
CE_FFD[31:0]
该寄存器存储了***次出现可纠正错误时的(已纠正的)失败数据(比特位[31:0])。当ECC状态寄存器中的CE_STATUS位被清除时,该寄存器被重新启用以存储下一个可纠正错误的数据。失败数据的存储在复位后启用。
CE_FFD[63:32]
这个寄存器存储了***次出现可纠正错误时的(已纠正的)失败数据(比特[63:32])。当ECC状态寄存器中的CE_STATUS位被清除时,该寄存器被重新启用以存储下一个可纠正错误的数据。失败数据的存储在复位后启用。
CE_FFD[95:64]
注意:该寄存器仅在DQ_WIDTH==144时使用。
这个寄存器存储了***次出现可纠正错误时的(已纠正的)失败数据(Bits[95:64])。当ECC状态寄存器中的CE_STATUS位被清除时,该寄存器被重新启用以存储下一个可纠正错误的数据。失败数据的存储在复位后启用。
CE_FFD[127:96]
注意:该寄存器仅在DQ_WIDTH==144时使用。
这个寄存器存储了***次出现可纠正错误时的(已纠正的)失败数据(比特位[127:96])。当ECC状态寄存器中的CE_STATUS位被清除时,该寄存器被重新启用以存储下一个可纠正错误的数据。失败数据的存储在复位后启用。
CE_FFE
该寄存器存储具有可纠正错误的访问的***次发生的ECC位。当ECC状态寄存器中的CE_STATUS位被清除时,该寄存器重新启用以存储下一个可纠正错误的ECC。系统复位后,将启动故障的ECC存储功能。
UE_FFA[31:0]
该寄存器存储了***次出现不可纠正错误的访问时解码的DRAM地址(31:0位)。地址格式定义在Error address中。当ECC状态寄存器中的UE_STATUS位被清除时,该寄存器被重新启用以存储下一个不可纠正的错误的地址。存储失败的地址在复位后启用。
UE_FFA[63:32]
这个寄存器存储了***次出现不可纠正错误时的译码地址(位[55:32])。地址格式定义在Error address中。此外,该寄存器的***字节存储ecc_multiple信号。当ECC状态寄存器中的UE_STATUS位被清除时,该寄存器被重新启用以存储下一个不可纠正的错误的地址。存储失败的地址在复位后启用。
UE_FFD[31:0]
该寄存器存储了***次出现不可纠正错误时的(未纠正的)失败数据(比特位[31:0])。当清除ECC状态寄存器中的UE_STATUS位时,该寄存器重新启用,以存储下一个不可纠正错误的数据。失败数据的存储在复位后启用。
UE_FFD[63:32]
该寄存器存储了***次出现不可纠正错误时的(未纠正的)失败数据(比特[63:32])。当清除ECC状态寄存器中的UE_STATUS位时,该寄存器重新启用,以存储下一个不可纠正错误的数据。失败数据的存储在复位后启用。
UE_FFD[95:64]
注意:此寄存器仅在DQ宽度为144时使用。
这个寄存器存储了***次出现不可纠正错误时的(未纠正的)失败数据(比特[95:64])。当清除ECC状态寄存器中的UE状态位时,该寄存器将重新启用,用于存储下一个不可纠正错误的数据。失败数据的存储在复位后启用。
UE_FFD[127:96]
注意:此寄存器仅在DQ_WIDTH == 144时使用。
这个寄存器存储了***次出现不可纠正错误时的(未纠正的)失败数据(比特位[127:96])。当清除ECC状态寄存器中的UE_STATUS位时,该寄存器重新启用,以存储下一个不可纠正错误的数据。失败数据的存储在重置后启用。
UE_FFE
该寄存器存储具有不可纠正错误的访问的***次发生的ECC位。当ECC状态寄存器中的UE_STATUS位被清除时,该寄存器重新启用以存储下一个不可纠正错误的ECC。复位失败ECC后使能。
FI_D0
该寄存器用于向写入内存的数据(比特位[31:0])中注入错误,并可用于测试错误纠正和错误信号。在寄存器中设置的位会切换后续数据写入内存的相应数据位[31:0],而不影响写入的ECC位。故障注入完成后,故障注入数据寄存器自动清0。
在Vivado IP目录中的DDR4 SDRAM设计中,只有当C_ECC_TEST= ON或ECC_TEST_Fl_XOR= ON和ECC = ON时,该寄存器才会实现。写入该寄存器和随后写入内存的操作不能中断。
FI_D1
该寄存器用于向写入内存的数据(比特[63:32])中注入错误,并可用于测试错误纠正和错误信号。在寄存器中设置的位可以切换相应的数据位[63:32]的后续数据写入内存,而不影响写入的ECC位。故障注入完成后,故障注入数据寄存器自动清0。
该寄存器只有在Vivado IP目录中的DDR4 SDRAM设计中C_ECC_TEST = ON或ECC_TEST_FI_XOR = ON和ECC = ON时才实现。写入该寄存器和随后写入内存的操作不能中断。
FI_D2
注意:该寄存器仅在DQ_WIDTH =144时使用。
该寄存器用于向写入内存的数据(比特[95:64])中注入错误,并可用于测试错误纠正和错误信号。在寄存器中设置的位可以切换相应的数据位 [95:64]的后续数据写入内存,而不影响写入的ECC位。故障注入完成后,故障注入数据寄存器自动清0。
该寄存器只有在Vivado IP目录中的DDR4 SDRAM设计中C_ECC_TEST= ON或ECC_TEST_FI_XOR = ON和ECC = ON时才实现。写入该寄存器和随后写入内存的操作不能中断。
FI_D3
注意:该寄存器仅在DQ_WIDTH=144时使用。
该寄存器用于向写入内存的数据(比特[127:96])中注入错误,并可用于测试错误纠正和错误信号。在寄存器中设置的位可以切换相应的数据位(字3或位[127:96])的后续数据写入内存,而不影响写入的ECC位。故障注入完成后,故障注入数据寄存器自动清0。
在Vivado IP目录中的DDR4 SDRAM设计中,只有当C_ECC_TEST=ON或ECC_TEST_Fl_XOR=ON和ECC= ON时,该寄存器才会实现。写入该寄存器和随后写入内存的操作不能中断。
FI_ECC
该寄存器用于将生成的ECC中的错误注入到内存中,并可用于测试纠错和错误信号。在寄存器中设置的位切换下一个数据写入内存的对应ECC位。故障注入完成后,故障注入ECC寄存器自动清0。
在Vivado IP目录中的DDR4 SDRAM设计中,只有当C_ECC_TEST = ON或ECC_TEST_FI_XOR = ON和ECC = ON时,该寄存器才会实现。写入该寄存器和随后写入内存的操作不能中断。
五、 总结
DDR4 ECC寄存器的作用是为用户提供一个重要的接口,使其能够洞察内存系统的运行状况,并在出现问题时计时纠正错误,从而极大地提升整个系统的可靠性。这对于服务器、数据中心、金融设备等需要常年稳定运行的关键系统来说,时必不可少的功能。
本文章由威三学院出品
对课程感兴趣可以联系我们

京公网安备11022902000513号
