SRAM之ECC检测机制

news2024/11/27 5:38:46

文章目录

  • 前言
  • 一、SRAM简介
    • 1. RAM介绍
    • 2. SRAM介绍
    • 3. SRAM和DRAM的区别
    • 4. S32K146系列的SRAM
    • 5. LMEM
  • 二、ECC
    • 1. EIM模块简介
    • 2. 操作步骤
      • 1)定义反转的读取总线上的Bit(Word1)
      • 2)定义反转的CheckBit总线上的Bit(Word0)
      • 3)使能SRAM通道的错误注入功能
      • 4)使能全局错误注入功能
      • 5)通过ERM模块验证
      • 6)注意事项
    • 3. 代码实现
  • 总结


前言

本文基于NXP的S32K1xx系列的芯片,来分析SRAM的ECC机制以及通过故障注入方式来验证以下两种类型故障。
1,单比特翻转错误
2,多比特不可纠正错误
在这里插入图片描述
话不多说,走你~

一、SRAM简介

1. RAM介绍

在了解SRAM之前,有必要先说明一下RAM。RAM主要的作用就是存储代码和数据供CPU在需要的时候调用。但是这些数据并不是像用袋子盛米那么简单,更像是图书馆中用书架摆放书籍一样,不但要放进去还要能够在需要的时候准确的调用出来,虽然都是书但是每本书是不同的。对于RAM等存储器来说也是一样的,虽然存储的都是代表0和1的代码,但是不同的组合就是不同的数据。

让我们重新回到书和书架上来,如果有一个书架上有10行和10列格子(每行和每列都有0-9的编号),有100本书要存放在里面,那么我们使用一个行的编号+一个列的编号就能确定某一本书的位置。在RAM存储器中也是利用了相似的原理。

现在让我们回到RAM存储器上,对于RAM存储器而言数据总线是用来传入数据或者传出数据的。因为存储器中的存储空间是如果前面提到的存放图书的书架一样通过一定的规则定义的,所以我们可以通过这个规则来把数据存放到存储器上相应的位置,而进行这种定位的工作就要依靠地址总线来实现了。

对于CPU来说,RAM就像是一条长长的有很多空格的细线,每个空格都有一个唯一的地址与之相对应。如果CPU想要从RAM中调用数据,它首先需要给地址总线发送“编号”,请求搜索图书(数据),然后等待若干个时钟周期之后,数据总线就会把数据传输给CPU。
小圆点代表RAM中的存储空间,每一个都有一个唯一的地址线同它相连。当地址解码器接收到地址总线的指令:“我要这本书”(地址数据)之后,它会根据这个数据定位CPU想要调用的数据所在位置,然后数据总线就会把其中的数据传送到CPU。

2. SRAM介绍

静态随机存取存储器(Static Random-Access Memory,SRAM)是随机存取存储器的一种。所谓的“静态”,是指这种存储器只要保持通电,里面储存的数据就可以恒常保持。相对之下,动态随机存取存储器(DRAM)里面所储存的数据就需要周期性地更新。然而,当电力供应停止时,SRAM储存的数据还是会消失(被称为volatile memory),这与在断电后还能储存资料的ROM或闪存是不同的。

S32K1xx系列的SRAM可参考下图
在这里插入图片描述
~

3. SRAM和DRAM的区别

1) 动态随机存取存储器(DRAM)里面所储存的数据就需要周期性地更新。
2) SRAM不需要刷新电路即能保存它内部存储的数据。而DRAM(Dynamic Random Access Memory)每隔一段时间,
要刷新充电一次,否则内部的数据即会消失, 因此SRAM具有较高的性能,功耗较小。
3) 此外,SRAM主要用于二级高速缓存(Level2 Cache)。它利用晶体管来存储数据。与DRAM相比,SRAM的速度快,
但在相同面积中SRAM的容量要比其他类型的内存小。
4) 但是SRAM也有它的缺点,集成度较低,相同容量的DRAM内存可以设计为较小的体积,SRAM却需要很大的体积。
同样面积的硅片 可以做出更大容量的DRAM,因此SRAM显得更贵。
5) SRAM的速度快但昂贵,一般用小容量SRAM作为更高速CPU和较低速DRAM 之间的缓存。

总结以上:
SRAM成本比较高,DRAM成本较低(1个场效应管加一个电容)。
SRAM存取速度比较快,DRAM存取速度较慢(电容充放电时间)。
SRAM一般用在高速缓存中,DRAM一般用在内存条里。

4. S32K146系列的SRAM

S32K146 SRAM=内部RAM+FlexRAM (FlexRAM配置为Traditional RAM的部分),
内部RAM=SRAM_L + SRAM_U, Traditional RAM要比内部RAM要慢。
在这里插入图片描述
~

SRAM_L和SRAM_U的区别:SRAM_L - PC bus, SRAM_U - PS bus控制总线不一样。
如下图33.2.1,因此我们可以确定,SRAM_L是CPU用来访问代码的,SRAM_U是CPU用来访问数据的
在这里插入图片描述
~

5. LMEM

LMEM(Local memory controller)负责地址和数据总线的解码,然后传输到ARM内核。LMEM可以看作是ARM内核和系统总线之间“传令官”。
cache是LMEM模块的子模块,它本质是一块高速内存,它存储了部分地址信息和相关数据,一般情况下cache是自我管理自动更新的,目的是减少内存的平均访问时间。
在这里插入图片描述
~

二、ECC

纠错码(ECC)通常与存储器一起用于不容易容忍因软错误导致数据损坏的应用中。软件错误可能由辐射(中子或阿尔法粒子)、电磁干扰、电噪声或电池之间的短路引起。S32K1xx系列中使用的ECC方法提供单错误纠正(SEC)和双错误检测(DED)功能。

相关模块名词:
EIM:Error Injection Module,错误注入模块
ERM: Error Reporting Module,错误报告模块

操作步骤:
1,通过EIM模块实现双bit翻转的故障注入
2,通过ERM模块检验是否成功注入故障,ECC机制是否完善

1. EIM模块简介

错误注入模块(EIM)用于诊断目的,以便在访问SRAM时引发读取数据的单位和多位反转。当EIM用于向内存注入故障时,对
SRAM的任何访问都会产生相应的注入错误(单位或双位错误)。EIM支持两个错误注入通道,分别对应于特定的RAM阵列。
下表显示了不同S32K1xx衍生产品的通道分配
在这里插入图片描述
实际上,我们通过EIM来注入故障实际上,就是将CheckBit总线上的bit进行翻转,或者ReadData总线上的bit进行翻转。
如下图,EIM通过寄存器的编写,来改变总线上的数据。
在这里插入图片描述
~
EIM有两个注入通道,每个错误注入通道:
• 指定一个掩码,用于定义来自目标RAM的读取数据总线( ReadData Bus )和校验位总线( CheckBit )在读取访问上反转。
• 在EIM编程模型中,包含一个128位(16字节)的结构,由4个32位的字组成。
• 第一个字,Word0 (EICHDn_WORD0),定义校验的位掩码,(翻转校验位总线数据bit的掩码)。
• 剩下的,Word1-3 (EICHDn_WORD1-3), 定义数据掩码,(翻转读取数据总线bit的掩码)。
注:简单点,实际中,我们只用到Word0 和 Word1即可。

2. 操作步骤

请严格按照操作步骤来!!!
注:
步骤1)和步骤2)取一即可。
因为步骤1)注入故障之后,实际改变了ReadData总线上的数据,会产生复位结果。具体看文章末尾的总结。
步骤2)可以用ERM来检验错误标志位是否置1。

1)定义反转的读取总线上的Bit(Word1)

EICHD0_WORD1[B0_3DATA_MASK],EICHD1_WORD1[B0_3DATA_MASK]。
B0_3DATA_MASK中的位对应于ReadData总线的0-3字节。

每个位指定来自目标RAM的ReadData总线的对应位是应该反转还是在读访问时保持未修改。
例如:反转总线上Byte0的bit0~bit3四个位数据,那么该寄存器就写入0x000F。
在这里插入图片描述
~

2)定义反转的CheckBit总线上的Bit(Word0)

EICHD0_WORD0[CHKBIT_MASK], EICHD1_WORD0[CHKBIT_MASK],

CHKBIT_MASK的每个位指定在读取访问时,CheckBit总线的对应位应该倒取还是保持未修改。成功写入此字段将清除相应的错误注入通道有效位EICHEN[EICHnEN]。
注:由此可见,实际我们注入位反转错误不是直接反转SRAM中的数据,而是反转总线上的数据。
在这里插入图片描述
~

3)使能SRAM通道的错误注入功能

EICHEN[EICH0EN], EICHEN[EICH1EN]。
注:通道是指:0代表SRAM_L,1代表SRAM_U.
在这里插入图片描述

4)使能全局错误注入功能

EIMCR[GEIEN]
在这里插入图片描述
注:看第3)步中的寄存器位描述,(The Global Error Injection Enable(EIMCR[GEIEN]) field must also be asserted to enable error injection.)

5)通过ERM模块验证

SR0[SBC0]
当注入1bit反转故障到SRAM_L,期待SR0[SBC0] == 1;
当注入2bit反转故障到SRAM_L,期待SR0[NCE0] == 1;
当注入1bit反转故障到SRAM_U,期待SR0[SBC1] == 1;
当注入2bit反转故障到SRAM_U,期待SR0[NCE1] == 1;
在这里插入图片描述
~

6)注意事项

①,EIM通过强制执行两阶段启用机制,可以防止错误注入功能的意外启用和重新配置。要正确地为通道启用错误注入机制:
• Write 1 to the EICHEN[EICHnEN] field, where n denotes the channel number.
• Write 1 to EIMCR[GEIEN].

②,当一个通道的用例需要写入任何EICHDn_WORD寄存器时,请在执行两阶段启用机制之前写入EICHDn_WORD寄存器。
成功写入任何EICHDn_WORD寄存器都会清除相应的EICHEN[EICHnEN]字段。

③,EIM支持2个错误注入通道。每个通道:
• 被分配给单个内存阵列接口。
• 拦截分配的内存读取数据总线和校验位总线,并通过反转每条总线线上为选定位传输的值来注入错误.

④,在内存读取上,适用的EICHDn_WORD寄存器定义要反转的读数据和/或校验位总线的哪个位。

⑤,尝试在一个操作中反转超过2位可能会导致未定义的行为。

3. 代码实现

具体实现

void FuncSafe_ECC_CheckProcess(void)
{
    
    uint32 ERM_EAR0_Sts = 0u;
    uint32 ERM_EAR1_Sts = 0u;
    uint32 ERM_SR0_Sts = 0u;

    /* EIM寄存器变量指向寄存器地址 */
    1:FuncSafeVar.EIM_Reg = IP_EIM;


    /* 2 bits( bit0 - bit1 ) of the checkbit bus is inverted. */
    2:FuncSafeVar.EIM_Reg->EICHDn[0].WORD0 = EIM_EICHDn_WORD0_CHKBIT_MASK(0x3u);
    3:FuncSafeVar.EIM_Reg->EICHDn[1].WORD0 = EIM_EICHDn_WORD0_CHKBIT_MASK(0x3u);

    /* 2 bits( bit0 - bit1 ) of the Read data bus is inverted. */
   4// FuncSafeVar.EIM_Reg->EICHDn[0].WORD1 = EIM_EICHDn_WORD1_B0_3DATA_MASK(3u);
   5// FuncSafeVar.EIM_Reg->EICHDn[1].WORD1 = EIM_EICHDn_WORD1_B0_3DATA_MASK(3u);
    
    /* Global Error Injection Enable */
   6:FuncSafeVar.EIM_Reg->EIMCR = EIM_EIMCR_GEIEN(1u);

    /* Error injection is enabled on Error Injection Channel 0 */
   7:FuncSafeVar.EIM_Reg->EICHEN |= EIM_EICHEN_EICH0EN(1u);
    /* Error injection is enabled on Error Injection Channel 1 */
   8:FuncSafeVar.EIM_Reg->EICHEN |= EIM_EICHEN_EICH1EN(1u);


    /* ERM寄存器变量指向寄存器地址 */
   9:FuncSafeVar.ERM_Reg = IP_ERM;


   10:ERM_SR0_Sts = ( FuncSafeVar.ERM_Reg->SR0 );


   11:ERM_EAR0_Sts = ( FuncSafeVar.ERM_Reg->EARn[0].EAR );
   12:ERM_EAR1_Sts = ( FuncSafeVar.ERM_Reg->EARn[1].EAR );

    LRX_DEBUG(" ERM_SR0_Sts == %x\n",ERM_SR0_Sts);
    LRX_DEBUG(" ERM_EAR0_Sts == %x\n",ERM_EAR0_Sts);
    LRX_DEBUG(" ERM_EAR1_Sts == %x\n",ERM_EAR1_Sts);
}

1:将声明的EIM模块寄存器结构体变量指向寄存器地址(完成寄存器结构体的地址映射);
2:将 SRAM_L的CheckBit Bus上的数据bit0~bit1的2位数据进行翻转(0x3,是两位的掩码);
3:将 SRAM_U的CheckBit Bus上的数据bit0~bit1的2位数据进行翻转(0x3,是两位的掩码);
4:将 SRAM_L的Read Data Bus上的数据bit0~bit1的2位数据进行翻转(小心!经过测试验证,会发生LOCK UP的复位);
5:将 SRAM_U的Read Data Bus上的数据bit0~bit1的2位数据进行翻转(小心!经过测试验证,会发生产生看门狗复位);
6:打开全局错误注入使能;
7:打开SRAM_L通道错误注入使能;
8:打开SRAM_U通道错误注入使能;
9:将声明的ERM模块寄存器结构体变量指向寄存器地址(完成寄存器结构体的地址映射);
10:读取ERM模块的SR0寄存器,检验是否可以读取到多位不可纠正错误的状态标志位置1;
11:读取ERM模块的EAR[0]寄存器,检查SRAM_L发生比特翻转的地址(SRAM_L的地址区间:0x0000 0000 ~ 0x1FFF FFFF)
12:读取ERM模块的EAR[1]寄存器,检查SRAM_U发生比特翻转的地址(SRAM_U的地址区间:0x2000 0000 ~ 自己去查阅手册)

串口打印消息如下:
在这里插入图片描述
SR0寄存器的数据是0x4400 0000
(对应寄存器来看,的确代表SRAM_L和SRAM_U均发生了多位不可纠正错误SR0[NCE0] == 1;SR0[NCE1] == 1;)

总结

经过上述测试验证,针对SRAM的ECC机制,不需要开启ERM模块的中断提醒,
因为我们在真正的ReadData Bus 上做比特翻转的故障注入时候,会发生Core LockUp 复位(SRAM_L)和看门狗复位(SRAM_U)
因此,故障注入只能来通过反转CheckBit Bus的数据来检查状态ECC机制是否完善。当实际MCU工作中,在ReadData Bus产生了比特反转,会触发相应的复位操作。

注:上面说的复位,是博主实际对ReadData Bus 上做比特翻转操作之后的结论。即:步骤1)定义反转的读取总线上的Bit(Word1)。

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

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

相关文章

Sui浏览器现支持查看已验证的Move源代码

Sui浏览器现在包含了Sui框架包的源代码视图,这是一个备受欢迎的功能。这个新的“已验证源代码(Source Verified)”选项卡位于现有的“字节码(Bytecode)”选项卡旁边,使开发人员可以点击查看以下包的源代码&…

SBOM 指南: 是什么及其作用

在软件开发的动态格局中,过去十年见证了两次重新定义了行业轨迹的变革性转变。首先是广泛采用开源软件组件,为开发人员提供大量预先构建的模块,以简化他们的工作。第二个是与DevOps文化的拥抱,自动化和加速软件构建和交付过程。总…

UE5——源码阅读——8——引擎预初始化

初始化文本本地化 执行平台特定的初始化内容 执行应用程序的特定预初始化 将当前的工作目录设置为可执行的目录 处理命令行选项 启用内存保护(根据命令行是否启用内存保护) 是否启用UE5内存管理的炼狱测试 是否启用UE5内存中有问题的测试 添加bu…

sql中的加减乘除

自学SQL网(教程 视频 练习全套)

C++ PrimerPlus 复习 第九章 内存模型和名称空间

第一章 命令编译链接文件 make文件 第二章 进入c 第三章 处理数据 第四章 复合类型 (上) 第四章 复合类型 (下) 第五章 循环和关系表达式 第六章 分支语句和逻辑运算符 第七章 函数——C的编程模块(上&#xff…

pandas - 数据分组统计

1.分组统计groupby()函数 对数据进行分组统计,主要适用DataFrame对象的groupby()函数。其功能如下。 (1)根据特定条件,将数据拆分成组 (2)每个组都可以独立应用函数(如求和函数sum()&#xff0…

spark从0到1 基础知识 一文全

spark从0到1 基础知识 一文全 1 开发前准备2 spark架构,任务提交流程3 开发中涉及的python知识 学习中的测试学习代码详情代码请见本人github中的sparkcp项目 https://github.com/defineqq/sparkcp 1 开发前准备 主要是本机使用,所以 安装了个python3&a…

《SpringBoot项目实战》第五篇—接口发生异常如何统一处理

系列文章导航 第一篇—接口参数的一些弯弯绕绕 第二篇—接口用户上下文的设计与实现 第三篇—留下用户调用接口的痕迹 第四篇—接口的权限控制 第五篇—接口发生异常如何统一处理 本文参考项目源码地址:summo-springboot-interface-demo 前言 大家好!…

开源六轴协作机械臂MechArm 拖动示教模型案例

介绍 今天,我将向大家展示一个我独立设计并实现的机械臂模型。这个模型的核心功能是实现实时的手势追踪——只需用手轻轻拖拽,机械臂就能立即跟随你的动作进行移动。 我之所以想要创造这样一个模型,是因为在一些危险环境中,我们可…

搭建二维码系统,轻松实现固定资产的一物一码管理

固定资产管理中普遍存在盘点难、家底不清、账实不一致、权责不清晰等问题,可以在草料上搭建固定资产管理系统,通过组合功能模块实现资产信息展示、领用登记、出入库管理、故障报修等功能,对固定资产进行一物一码规范化管理。 比如张掖公路事业…

C++学习之map和set

目录 一,什么是map和set 二,set的使用 插入 键值对 删除(erase)与查找 lowerbound与upperbound equal_range multiset 三,map的使用 insert 查找 删除 重载[ ] ​编辑 一,什么是map和set C中…

云闪付app拉新好做吗?地推和网推百搭拉新项目申请渠道

云闪付拉新可通过”聚量推客“申请 云闪付是银联出的支付平台,每年在拉新市场的预算较高,比较适合地推和网推做项目搭配,只需要完成一次动账即可结算 我们上了两个版本的云闪付项目,下图展示 也有更多的其它地推和网推拉新项目可…

【通关选择】upload-labs通关攻略(大全)

前提条件: 1.文件能够成功上传到服务器 2.攻击者能够知道文件的上传路径 upload-labs靶场 Pass-01( 前端验证) 三种方法解决思路 1.禁用客户端JavaScript弹窗 2.通过burp抓包,修改后缀名 3.f12删除return filecheck&#xff0…

树专题 —— 二叉搜索树和中序遍历

大家好,我是 方圆。我准备把树写成一个专题,包括二叉搜索树、前序、中序、后序遍历以及红黑树,我也想试试能不能将红黑树写好。 本篇是关于二叉搜索树,也是所有后续学习的基础,其中会涉及前序、中序、后序遍历&#x…

外卖系统的数据管理和隐私保护应该如何进行?

1. 数据管理 外卖系统处理大量用户数据,包括个人信息、订单记录、支付信息等。以下是一些数据管理的最佳实践: 合规性与透明度:确保你的数据收集、存储和处理符合相关法规,例如GDPR(通用数据保护条例)。同…

网络安全防御体系构建思路

前言 在某一天的深夜,作为安全从业人员,穿着大裤衩子,坐在门前,点燃一根烟(画面自己想象)开始思考企业如何打造自己的安全体系,虽然这不是作为月薪3k该考虑的问题,但是毕竟当初笔者…

element的表单校验正常手机号码以及输入框填写“不详”的情况

element的表单校验正常手机号码以及输入框填写“不详”的情况 <el-col :span"6"><el-form-item label"手机号码" prop"phoneNumber" class"grid-content bg-purple"><el-input v-model"testForm.phoneNumber&quo…

Linux环境下的SVN服务器搭建并结合内网穿透实现远程连接

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

第四章 Web服务器(1)

1.www简介 Web网络服务也叫WWW(World Wide Web 全球信息广播)万维网服务&#xff0c;一般是指能够让用户通过浏览器访问到互联网中文档等资源的服务 Web 网络服务是一种被动访问的服务程序&#xff0c;即只有接收到互联网中其他主机发出的请求后才会响应&#xff0c;最…

LINQ to SQL系列三 使用DeferredLoadingEnabled,DataLoadOption指定加载选项

介绍linq to sql 的 DataContext类DeferredLoadingEnabled属性使用,以及DataLoadOptions限定加载相关表数据的LoadWith和AssociateWith方法。 本文中举例用到的数据模型如下: Student和Class之间是多对一关系,Student和Course之间是多对多关系。 DataContext的DeferredLo…