飞腾2000+/64核芯片ECC功能验证

news2024/11/19 0:30:15

1、背景介绍

为了排查全国产飞腾计算模块的一个外场问题,需要验证飞腾2000+/64核这个处理器的DDR控制器是否支持ECC功能,即在异常情况下能纠错。ECC纠错原理如下,目前飞腾2000+/64 DDR控制器就是纠一检二:

2、寄存器说明

目前飞腾提供了2000+/64这款处理器的关于ECC的寄存器信息,如下:

通过读取错误计数器寄存器能够知道到底ECC纠了多少错误,该寄存器详细描述如下:

3、测试脚本说明

可以使用测试脚本读取ECC寄存器状态,该脚本内容如下:

#!/bin/bash
#FT-2000+64 寄存器读取


#错误寄存器读取
#间接地址寄存器  Size:32位 复位值:0x0 Offset: 0x000
LMU_ADDR_REG=0x80028780000
#间接数据寄存器 复位值:0x0 Offset: 0x008 Size:32位
LMU_DATA_REG=$LMU_ADDR_REG+8
LMU_REG_SEG_USR_BIT=0x0
LMU_REG_SEG_CTL_BIT=0x10000000
LMU_REG_SEG_PHY_BIT=0x20000000
#注:LMU_ADDR_REG的bit[29:28]为REG_SEG位,区别MUC内不同部件的寄存器:00:USR寄存器 01:CTL寄存器 10:PHY寄存器

#错误状态寄存器 Size:32位 复位值:0x0 Offset: 0x1a0
LMU_MCU_ERR_STA_REG=0x1a0
#描述: 错误记录使能寄存器 Size:32位 复位值:0xffffffff  Offset: 0x1b0
LMU_MCU_LOG_ENA_REG=0x1b0
#错误使能寄存器 Size:32位 复位值:0x0 Offset: 0x1c0
LMU_MCU_ERR_ENA_REG=0x1c0
#中断使能寄存器 Size:32位 复位值:0x0 Offset: 0x1d0
LMU_MCU_INT_ENA_REG=0x1d0
#描述: 错误设置寄存器 Size:32位 复位值:0x0 Offset: 0x1e0
LMU_MCU_ERR_SET_REG=0x1e0
#  错误清除寄存器 Size:32位 复位值:0x0 Offset: 0x1f0
LMU_MCU_ERR_CLR_REG=0x1f0


#ECC 配置寄存器0  0x70
LMU_ECCCFG0=0X70
#ECC 配置寄存器1  0x74
LMU_ECCCFG1=0X74
#ECC 状态寄存器 0X78
LMU_ECCSTAT=0X78
#ECC 清除寄存器 0X7C
LMU_ECCCLR=0X7C
#错误计数器寄存器 0X80
LMU_ECCERRCNT=0X80


core_mask=`lscpu | awk NR==5 | cut -f 2 -d '-'`
#类型选择
function CHOSE_TYPE()
{
  if [ $core_mask == 63 ];then
  peu=2
  echo "FT-2000+/64 64核版本"
  elif [ $core_mask == 31 ]
    then
    peu=1
    echo "FT-2000+/64 32核版本"
  fi
}
#内存ecc错误寄存器获取
function MCU_ECC_ERROR_TEST()	
{
		let i=0
		while [ $i -lt 8 ]
		do
			let "addr_base=LMU_ADDR_REG + i*0x10000"
			let "data_base=$addr_base+8"
			let "register=LMU_ECCCFG0|LMU_REG_SEG_CTL_BIT"
			./mem write 4 $addr_base $register 
			./mem read 4 $data_base
            LMU_ECCCFG0_NUM=`./mem read 4 $data_base | cut -f 6 -d ' '`
			
			let "register=LMU_ECCCFG1|LMU_REG_SEG_CTL_BIT"
			./mem write 4 $addr_base $register > /dev/null
			./mem read 4 $data_base
            LMU_ECCCFG1_NUM=`./mem read 4 $data_base | cut -f 6 -d ' '`


			let "register=LMU_ECCSTAT|LMU_REG_SEG_CTL_BIT"
			./mem write 4 $addr_base $register > /dev/null
			./mem read 4 $data_base
            LMU_ECCSTAT_NUM=`./mem read 4 $data_base | cut -f 6 -d ' '`

			let "register=LMU_ECCCLR|LMU_REG_SEG_CTL_BIT"
			./mem write 4 $addr_base $register > /dev/null
			./mem read 4 $data_base
			LMU_ECCCLR_NUM=`./mem read 4 $data_base | cut -f 6 -d ' '`
			
			let "register=LMU_ECCERRCNT|LMU_REG_SEG_CTL_BIT"
			./mem write 4 $addr_base $register > /dev/null
			./mem read 4 $data_base
			LMU_ECCERRCNT_NUM=`./mem read 4 $data_base | cut -f 6 -d ' '`
			
			sleep 2

			if [ $LMU_ECCERRCNT_NUM == 0x0 ]
			 then
			 echo "内存通道" $i "ECC 校验 状态正常"
             echo " "
			 else
			 echo "内存通道" $i "ECC 校验 状态异常"
             echo "*** ERROR ****"
			fi
			
			let i=i+1
			 echo " "
		done
}


function TEST() 
{
   date
   CHOSE_TYPE
   echo "FT-2000+/64服务器错误寄存器"
   date
  
 #循环间隔时间读所有寄存器
  for ((NUM=0;NUM<1000000;NUM++))
  do
   date
   echo "*******间隔时间"$NUM*1 s"读错误相关寄存器*******"
   echo "  "
   echo "  "  
   #首次读所有寄存器
	echo "******MCU_ECC_ERROR_TEST(内存ecc错误寄存器) *******" 
	MCU_ECC_ERROR_TEST
	sleep 1
	echo "等待中..."
	sleep 1
	done
}

TEST


echo "====Test Finished===="



脚本中会循环读取ECC各个寄存器状态信息,其中的mem为飞腾提供的底层可执行程序。

4、测试步骤

首先运行脚本,此时会打印ECC状态信息,无异常

8个通道的ECC错误寄存器校验正常,如下打印
******MCU_ECC_ERROR_TEST(内存ecc错误寄存器) *******
Write word 0x10000070 to 0x80028780000
Read word from 0x80028780008 result 0x4
Read word from 0x80028780008 result 0x2
Read word from 0x80028780008 result 0x0
Read word from 0x80028780008 result 0x0
Read word from 0x80028780008 result 0x0
内存通道 0 ECC 校验 状态正常
 
 
Write word 0x10000070 to 0x80028790000
Read word from 0x80028790008 result 0x4
Read word from 0x80028790008 result 0x2
Read word from 0x80028790008 result 0x0
Read word from 0x80028790008 result 0x0
Read word from 0x80028790008 result 0x0
内存通道 1 ECC 校验 状态正常
 
 
Write word 0x10000070 to 0x800287a0000
Read word from 0x800287a0008 result 0x4
Read word from 0x800287a0008 result 0x2
Read word from 0x800287a0008 result 0x0
Read word from 0x800287a0008 result 0x0
Read word from 0x800287a0008 result 0x0
内存通道 2 ECC 校验 状态正常
 
 
Write word 0x10000070 to 0x800287b0000
Read word from 0x800287b0008 result 0x4
Read word from 0x800287b0008 result 0x2
Read word from 0x800287b0008 result 0x0
Read word from 0x800287b0008 result 0x0
Read word from 0x800287b0008 result 0x0
内存通道 3 ECC 校验 状态正常
 
 
Write word 0x10000070 to 0x800287c0000
Read word from 0x800287c0008 result 0x4
Read word from 0x800287c0008 result 0x2
Read word from 0x800287c0008 result 0x0
Read word from 0x800287c0008 result 0x0
Read word from 0x800287c0008 result 0x0
内存通道 4 ECC 校验 状态正常
 
 
Write word 0x10000070 to 0x800287d0000
Read word from 0x800287d0008 result 0x4
Read word from 0x800287d0008 result 0x2
Read word from 0x800287d0008 result 0x0
Read word from 0x800287d0008 result 0x0
Read word from 0x800287d0008 result 0x0
内存通道 5 ECC 校验 状态正常
 
 
Write word 0x10000070 to 0x800287e0000
Read word from 0x800287e0008 result 0x4
Read word from 0x800287e0008 result 0x2
Read word from 0x800287e0008 result 0x0
Read word from 0x800287e0008 result 0x0
Read word from 0x800287e0008 result 0x0
内存通道 6 ECC 校验 状态正常
 
 
Write word 0x10000070 to 0x800287f0000
Read word from 0x800287f0008 result 0x4
Read word from 0x800287f0008 result 0x2
Read word from 0x800287f0008 result 0x0
Read word from 0x800287f0008 result 0x0
Read word from 0x800287f0008 result 0x0
内存通道 7 ECC 校验 状态正常

此时在硬件上短接某个通道DDR控制器的DQ信号,会报该通道ECC状态异常

比如这里短接了通道0的DDR控制器DQ7信号(MEM0_S4_DQ7),报通道0 ECC检验状态异常,能够看到错误计数在不停累加。

这个时候在系统下面跑memtester是不会报错的,因为只有一位错误,ECC能够纠正。

但此时又短接了通道0的DDR控制器另一路DQ信号(注意:必须要同一个通道,因为8个DDR控制器相互独立,每个通道都能独立进行单bitECC纠错,如果同时短接两路不同的通道DQ,也能进行正确纠错),导致这个该通道DDR控制器出现了两位错误,运行memtester将会导致系统崩溃重启,重启后能在crash日志中发现是因为内存错误导致。

5、结论

经过以上试验,可以表明飞腾2000+/64核处理器具备ECC校验能力,不过每个通道的DDR控制器只能纠正一位错误,如果同一个通道DDR控制器上出现两bit错误,那将导致系统异常。

在飞腾PBF内可以针对ECC功能进行打开或者关闭,可以通过读取ECC配置寄存器(0x70)最后两位进行判断,如下:

如果读出来为0x4那就是有ECC,如果读出来为0代表无ECC。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1955396.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【学习过程总结】

一、二进制和十进制的转化 1、十进制转化为二进制 2、二进制转化为十进制 二进制转化为十进制这个&#xff0c;对于二进制的数&#xff0c;得从右往左看&#xff08;1《0《1《1&#xff09;。对于下面的转换过程得从下往上看 &#xff08;0、1、2、3&#xff09; 二、按位-异…

原理图----备份

从公司学到的电路图&#xff0c;做一个备份&#xff1a;

用Python做一个翻译软件,比上浏览器快100倍

简单的用Python来做一个翻译软件 开发环境 Python 3.10 Pycharm模块使用 requests -> pip install requests hashlib tkinter案例分为三部分: 1. 爬虫: 获取翻译接口, 请求获取翻译结果问题1: 接口抓包分析问题2: 请求需要写cookie问题3: 不同文本翻译, s加密参数2. 界面…

昇思25天学习打卡营第3天|基础知识-数据集Dataset

目录 环境 环境 导包 数据集加载 数据集迭代 数据集常用操作 shuffle map batch 自定义数据集 可随机访问数据集 可迭代数据集 生成器 MindSpore提供基于Pipeline的数据引擎&#xff0c;通过数据集&#xff08;Dataset&#xff09;和数据变换&#xff08;Transfor…

小模型狂飙!6家巨头争相发布小模型,Andrej Karpathy:大语言模型的尺寸竞争正在倒退...

过去一周&#xff0c;可谓是小模型战场最疯狂的一周&#xff0c;商业巨头改变赛道&#xff0c;向大模型say byebye~。 OpenAI、Apple、Mistral等“百花齐放”&#xff0c;纷纷带着自家性能优越的轻量化小模型入场。 小模型(SLM)&#xff0c;是相对于大语言模型&#xff08;LLM…

微信小游戏之三消(二)主要游戏控制方法

设计一个 game class。负责了游戏的核心控制逻辑&#xff0c;包括游戏状态管理、方块和道具的生成与效果处理&#xff0c;以及游戏的重新开始和复活流程。通过这些方法&#xff0c;脚本实现了游戏的基本玩法和用户交互。 主要游戏控制方法 gameStart()&#xff1a;开始游戏&am…

如何从网站获取表格数据

1.手动复制粘贴 最简单的方法是直接在网页上手动选择表格内容&#xff0c;然后复制粘贴到Excel或其他表格处理软件中。这种方法适用于表格较小且不经常更新的情况。 2.使用浏览器插件 有许多浏览器插件可以帮助从网页中提取表格数据&#xff0c;例如&#xff1a; -TableCapt…

liteos定时器回调时间过长造成死机问题解决思路

项目需求 原代码是稳定的&#xff0c;现我实现EMQ平台断开连接的时候&#xff0c;把HSL的模拟点位数据采集到网关&#xff0c;然后存入Flash&#xff0c;当EMQ平台连接的时候&#xff0c;把Flash里面的点位数据放在消息队列里面&#xff0c;不影响实时采集。 核心1&#xff1a…

【Linux】多线程4——线程同步/条件变量

1.Linux线程同步 1.1.同步概念与线程饥饿问题 先来理解同步的概念 什么是线程同步 在一般情况下&#xff0c;创建一个线程是不能提高程序的执行效率的&#xff0c;所以要创建多个线程。但是多个线程同时运行的时候可能调用线程函数&#xff0c;在多个线程同时对同一个内存地…

【文件fd】C++文件操作 | 详解系统调用接口文件操作 | 系统调用接口库函数

目录 1.回顾理解&引出问题 2.C文件操作 3.系统调用文件操作 3.0准备工作 3.1版本1☞open 3.2版本2☞文件权限 3.3版本3☞权限掩码 3.4版本3☞标记位传参 3.5版本4☞close 3.6版本5☞write 3.7flags选项 3.7.1 O_WRONLY | O_CREAT 3.7.2 O_WRONLY | O_CREAT …

Servlet详解(超详细)

Servlet详解 文章目录 Servlet详解一、基本概念二、Servlet的使用1、创建Servlet类2、配置Servleta. 使用web.xml配置b. 使用注解配置 3、部署Web应用4、处理HTTP请求和生成响应5、处理表单数据HTML表单Servlet 6、管理会话 三、servlet生命周期1、加载和实例化2、初始化3、 请…

Python爬虫入门02:Fiddler下载使用教程

文章目录 手机抓包全攻略&#xff1a;Fiddler 工具深度解析引言Fiddler 工具简介为什么选择 Fiddler&#xff1f; 安装与配置 Fiddler步骤一&#xff1a;下载与安装步骤二&#xff1a;配置浏览器代理步骤三&#xff1a;安装 HTTPS 证书 配置手机以使用 Fiddler步骤一&#xff1…

鸿蒙应用框架开发【OpenGL三棱椎】 NDK

OpenGL三棱椎 介绍 XComponent控件常用于相机预览流的显示和游戏画面的绘制,在HarmonyOS上&#xff0c;可以配合Native Window创建OpenGL开发环境&#xff0c;并最终将OpenGL绘制的图形显示到XComponent控件。本示例基于"Native C"模板&#xff0c;调用OpenGL(Open…

wpf中团队独立开发模块和左侧2个菜单的框架演示

此篇文章和上一篇文章wpf中开发独立模块功能和左侧1个菜单的框架演示-CSDN博客的结构是一样的&#xff0c;有1点不同的是&#xff0c;左侧有2层菜单&#xff0c;所以&#xff0c;就会更加的复杂。建议&#xff0c;先看明白上一篇的内容&#xff0c;再看这篇文章&#xff0c;否则…

CSS实现表格无限轮播

<div className{styles.tableTh}><div className{styles.thItem} style{{ width: 40% }}>报警名称</div><div className{styles.thItem} style{{ width: 35% }}>开始时间</div><div className{styles.thItem} style{{ width: 25% }}>状态&…

前端三大主流框架对比

在现代前端开发中&#xff0c;React、Vue和Angular是三大流行的框架/库。它们各自有独特的优缺点&#xff0c;适用于不同的开发需求和项目规模。下面是对这三者的详细比较&#xff1a; 一、 React 简介&#xff1a; 由Facebook开发和维护&#xff0c;是一个用于构建用户界面…

亚博科技和幻尔科技的十轴IMU在Ros2 Humble下驱动后数值无限趋于0的解决方案

在做机器人导航以及建模的时候&#xff0c;考虑到多传感器融合可能会带来更好的效果&#xff0c;于是决定使用幻尔科技的十轴IMU&#xff08;其实亚博科技与幻尔科技这块IMU的内部完全一致&#xff0c;驱动代码都完全一致&#xff09;驱动后使用以下命令输出传来的四元数等数据…

自写ApiTools工具,功能参考Postman和ApiPost

近日在使用ApiPost的时候&#xff0c;发现新版本8和7不兼容&#xff0c;也就是说8不支持离线操作&#xff0c;而7可以。 我想说&#xff0c;我就是因为不想登录使用才从Postman换到ApiPost的。 众所周知&#xff0c;postman时国外软件&#xff0c;登录经常性抽风&#xff0c;…

Mike SHE里如何正确设置分区降雨

前言&#xff1a; MIKE SHE分布式水文模型现阶段用于流域洪水的项目比较多&#xff0c;因属于大尺度模型&#xff0c;基本可以模拟水循环全过程&#xff0c;包含降雨—蒸发——产汇流—地表水—地下水等。同时还可以耦合MIKE11水动力水质模型。 今天给大家介绍下MIKESHE是如何…