作者:Kathy Ren,AMD工程师;来源:AMD开发者社区
在Ultrascale+ HBM系列的器件上包含有容量32Gb/64Gb的高带宽硬件存储介质HBM。每个HBM stack的容量是32Gb,分为8个channel。每个channel可以分为2个伪通道(pseudo channel)。除了基本的AXI3总线供数据读写之外,还带有ECC(错误校验和纠正)功能。这样,通过它就可以有效的保证系统的稳定性和可靠性。
ECC的工作包含写和读两个阶段。写数据时,将通过ECC逻辑算出的ECC bit进行单独存储;读数据时,除了访问地址上的用户数据之外,对应的ECC bit也会被读出,并且进行校验和最多1 bit数据错误的纠正。
HBM IP提供了一系列ECC相关选项:
Enable ECC Bypass- ECC错误校验和纠正功能关闭。
Enable ECC Correction- 对于单bit 的ECC错误进行纠正。
Enable ECC Scrubbing- 使能擦洗功能。 它从HBM读取数据,检测并纠正单bit ECC错误,再写回到原来的位置。
ECC Scrub Bits- ECC初始化和Scrubbing的地址空间。
ECC Scrub Period- 擦洗功能进行读数据的时间间隔。
Initialize Memory Using ECC- 初始化HBM数据并填入相应的ECC bits
另外,还有一系列的ECC相关的状态寄存器,具体定义可以参见pg276中 Table ECC and Status Registers. 想要通过查询ECC状态寄存器检查ECC错误,必须要将ECC Scrubbing功能打开。操作流程参考如下:
## Clear any errors before (note to clear errors need to set and then clear...very important as ECC errors will be masked otherwise 252>sudo rwmem 0xF8905818 0x0 252>sudo rwmem 0xF8905818 0x1 253>sudo rwmem 0xF8905818 0x0 ## Read status 254>sudo rwmem 0xF8905828 0x00000000f8905828 = 0x00000000 255>sudo rwmem 0xF890582C 0x00000000f890582C = 0x00000000 ## Clear error-causing bit before using 256>sudo rwmem 0xF890584C 0x0 257>sudo rwmem 0xF890584C 0x1 ## NB # Enabled scrubbing to allow errors to be caused 257a>sudo rwmem 0xF8905804 0x1 ## Check status (1-bit/2-bit) 258>sudo rwmem 0xF8905828 0x00000000f8905828 = 0x00000000 259>sudo rwmem 0xF890582C 0x00000000f890582c = 0x00000000 ## Write to cause error 260>xbutil mem --write -a 0x0 -i 256 INFO: Found total 1 card(s), 1 are usable INFO: Writing to single bank, 256 bytes from DDR address 0x0 INFO: Writing DDR with 256 bytes of pattern: 0x4a from address 0x0 INFO: xbutil mem succeeded. ## Check status (single-bit error) 261>sudo rwmem 0xF8905828 0x00000000f8905828 = 0x00000001 262>sudo rwmem 0xF890582C 0x00000000f890582c = 0x00000000
当检测到大于1bit的ECC error时,同时会在数据读取总线上表现为SLVERR,读命令返回RRSEP=10。