ECC原理和RocketChip Cache ECC实现

news2024/10/7 20:28:18

一、ECC原理说明

ECC(Error Correcting Code)全称为错误纠正码,用于对存储器的数据进行完整性检查和纠正,主要用在SRAM、DDR、NAND等存储器设备上。ECC可以对数据进行单比特的纠错和多比特的检错,其原理基于汉明码编码而来。下图是ECC编码的主要方法示例,其中蓝色位置为插入的ECC校验位,灰色位置为原始数据。数据下面的蓝色部分为进行奇偶校验计算的数据段。

ECC编码方法说明

ECC编码基于二分法原理,图中第0个(bit[0])ECC位是对全数据段(包括数据+ECC位)进行奇偶校验后的结果,填入的数值保证全数据段奇偶校验值为0。bit[16]、bit[8]、bit[4]、bit[2]和bit[1] ECC位分别对数据进行二分并对一半数据进行奇偶校验,例如bit[16]校验的是数据的后半段,即数据高16bits,并在数据最高位插入ECC校验数值。实际编码过程首先从bit[16]开始,最终完成bit[0]的全数据段奇偶校验位插入。产生的ECC位可以和数据一起放置,存储在数据高位或者按照图示位置放入,但无论ECC位放在哪里,都需要保证编码和解码的方式一致。

从上图可以看出,如果需要检测8bits原始数据,需要额外添加5bits ECC校验位;如果需要检测16bits原始数据,则只需在5bits ECC校验的基础上再添加1bit即可。也就是说,原始数据翻倍而ECC校验位加1,这样的特性使得ECC校验在数据位宽较宽时更有优势。

ECC解码过程和编码过程相反,在接收到上图所示的数据后,首先从bit[16]ECC位置进行判断,如果计算的奇偶校验值和接收的一致,则表明高16bits数据没有错误;如果不一致,则表明高16bits数据可能存在错误。再继续二分检查bit[8] ECC位,依次完成所有ECC位的计算和比较,直到bit[1] ECC位。在计算完bit[1] ECC位后,如果数据中存在单bit错误,就可以最终确定出错的数据位置在哪,并完成对应的数据纠错。但如果原始数据中存在2bit翻转或ECC位本身出错,这个就需要bit[0]的ECC位对全数据段(包括数据+ECC位)进行一次奇偶校验。如果bit[0]是判断一致(全数据段奇偶校验正确),但各个ECC位不一致,则表明置数据可能出现了2bit或以上的错误。

对于2bits以上数据位出错,那么各个ECC位判断的结果会有冲突的地方,比如全数据段奇偶校验正确,但各二分点ECC位校验不一致,或者各个ECC位校验出现不一致和冲突的地方。ECC只能纠正1bit错误,对于2bit以上错误,只能检测而无法完全定位2bit错误位置。对于一般数据的软错误而言,例如瞬态的电磁干扰,产生多bit错误的概率非常低,因此ECC在数据完整性校验上商用广泛。

目前ECC在内存中用途非常广,多数DDR内存条采用64bits数据+8bits ECC的方案,这样在做DDR颗粒时,可以使用8个1G颗粒再加1个1G颗粒组成ECC冗余。ECC在SRAM中也用途广泛,用于功能安全车载和航天级电子电路中,一般采用32bits数据+7bits ECC方案,根据具体SRAM位宽决定。在NAND/NOR Flash中,一般采用256bytes数据+22bits ECC的方案。

二、RocketChip Cache ECC配置

RISC-V RocketChip生成器带有Cache ECC选项,默认情况下是关闭状态,有三种类型的ECC校验可以选择,分别是:parity、sec、secded,其各个类型的含义:

  • parity:对输入Cache SRAM的数据进行奇偶校验,每8bits产生一个奇偶校验位;

  • sec:对输入Cache SRAM的数据进行单比特纠错,硬件自动纠错;

  • secded:对输入Cache SRAM的数据进行单比特纠错,多比特检错,硬件自动纠错;

除了可以选择ECC类型,DCache还可以配置纠错的数据长度,通过dataECCBytes选择每多少bits进行ECC校验,例如dataECCBytes设置成1,对于原始32bits位宽的SRAM,添加ECC后会变成52bits((8bits+5bits)x4)位宽,如果设置成4,则会变成39bits(32bits+7bits)位宽。

除了dataECCBytes参数对位宽有影响外,配置的ECC类型对位宽也有影响,这里以dataECCByte=1为例,说明不同ECC类型对应的SRAM读写数据位宽,假设原始读写位宽为32bits,则:

  • parity:读写位宽(8bits数据+1bit奇偶校验)x4 = 36bits;

  • sec:读写位宽(8bits数据+4bits ECC)x4 = 48bits;

  • secded:读写位宽(8bits数据+5bits ECC)x4 = 52bits;

位宽越宽,需要的SRAM大小越大,而其中有用的SRAM数据占用比例越小,如果dataECCBytes设置成1,意味着实际有效数据只占实际面积的一半。由于ICache和DCache不会太大,一般嵌入式系统16KB起步,推荐dataECCBytes配置成4。

最终配置的subsyste/Config.scala项如下所示:

      dcache = Some(DCacheParams(
        rowBits = site(SystemBusKey).beatBits,
        nSets = 64,
        nWays = 1,
        nTLBSets = 1,
        nTLBWays = 4,
        nMSHRs = 0,
        //add none/identity/parity/sec/secded/
        tagECC = Some("secded"),
        dataECC = Some("secded"),
        dataECCBytes = 4,
        blockBytes = site(CacheBlockBytes))),
      icache = Some(ICacheParams(
        rowBits = site(SystemBusKey).beatBits,
        nSets = 64,
        nWays = 1,
        nTLBSets = 1,
        nTLBWays = 4,
        //add none/identity/parity/sec/secded/
        tagECC = Some("secded"),
        dataECC = Some("secded"),
        blockBytes = site(CacheBlockBytes))))

三、RocketChip Cache ECC实现

在系统复位释放后,RISC-V内核会从BootROM中取出程序段,并填入ICache中,一次填入一个CacheLine的数据。加入ECC后,BootROM中的原始数据会首先添加ECC校验位,并放在数据的高位和数据一起写入ICache的SRAM中。随后,内核的指令取指模块会从ICache中取出数据,数据取出来后会首先检查ECC,保证数据的正确性,单bit的数据错误会直接纠正。

ECC不可纠正错误实现代码

ECC校验会产生可纠正错误和不可纠正错误信号,对于多bit错误,ICache和DCache的处理方法不同。如果ECC输出端检测到不可纠正错误,ICache会通过io_resp_bits_replay信号上报内核,内核会判定为数据损坏,并会重新发出对应地址的读请求命令。如果ECC输出一直出错,内核会一直重复对该地址进行取指请求。对于DCache,如果出现不可纠正错误,则会通过io_errors_uncorrectable_valid信号上报错误,但需要注意该信号默认并没有作为中断接入RISC-V中断输入端,用户可能需要手动处理该error信号的上报事情。

四、仿真问题

在对带有ECC的Cache进行仿真时,可能会遇到ICache hang住的情况,观察波形会发现BootROM中的程序写不进ICache的SRAM中,内核一直重复从BootROM取数据但写使能一直无效,而读出来的数据一直产生不可纠正错误和disparity有效,从而导致写使能一直无效。

Cache ECC仿真出现的问题

该问题可参考下篇链接解决,但这并不是最终的解决方法,因为SRAM中初始数值在流片后就是随机值,很难通过复位后在对SRAM进行一次全0的初始化。该问题可以通过修改生成的RTL代码解决,将不可纠正错误在上电复位后到BootROM写入第16个数之前屏蔽掉,等BootROM中写入16个数后,读出来的数据是经过ECC编码和ECC解码的,后续就不会出现仿真的问题。

https://github.com/chipsalliance/rocket-chip/issues/3019

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

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

相关文章

如何通过光耦合器连接继电器

如何通过光耦合器连接继电器 介绍 以下文章介绍如何使用隔离方法或通过光耦合器器件驱动继电器。我们将学习三种方法,第一种方法是将继电器直接连接到光耦合器输出引脚,第二种方法是使用外部PNP晶体管,第三种方法是使用外部NPN晶体管。任何…

二十九、Docker (5)

🌻🌻 目录一、Maven Docker 插件构建 Docker 镜像1.1 maven Docker 插件构建 Docker 镜像入门1.2 maven Docker 插件构建 Docker 镜像,自定义 DockerFile1.3 maven Docker 插件构建并推送镜像到 Docker 私有仓库二、手动发布部署微服务项目到…

类与对象(三):stactic成员、友元、内部类

类与对象(三)1. 再谈构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit关键字2. static成员2.1 概念特性类中成员变量区别(普通变量和static变量):普通成员函数和静态成员函数的区别3. 友元友元函数友元类cout打印自定义类型…

24种代码坏味道和重构手法

最近,小李感觉公司女生们看他的眼神不太对劲了,那种笑容好像是充满慈爱的、姨母般的笑容。 作为一名老实本分的程序员,小李不太习惯这种被人过度关注的感觉,他不知道发生了什么。 小李和小王的关系似乎过于亲密,还经…

ZooKeeper 安装

ZooKeeper 安装 1. 下载安装 1、环境准备 ZooKeeper服务器是用Java创建的,它运行在JVM之上。需要安装JDK 7或更高版本。 2、上传 将下载的ZooKeeper放到/opt/ZooKeeper目录下 #上传zookeeper altp put f:/setup/apache-zookeeper-3.5.6-bin.tar.gz #打开 opt目…

(十)devops持续集成开发——jenkins流水线发布一个docker harbor仓库版的后端maven项目

前言 本节内容我们使用jenkins流水线组件发布一个docker环境的后端maven项目,并使用docker的harbor仓库完成镜像的存储,通过拉取harbor仓库中的项目镜像,完成后端项目的发布,关于harbor仓库的搭建,可以参考往期博客内…

Python学习笔记之模块

可迭代对象 概念:更新换代,每次更新都是根据上一次的结果作为基础。 有哪些:字符串,列表,字典,元组,集合,文件对象,特殊函数(生成器) 迭代器对…

软件测试/测试开发 | AppCrawler 自动遍历测试工具实践(一)

本文为霍格沃兹测试学院学院学员课程学习笔记。 公众号搜索:TestingStudio 霍格沃兹的干货都很硬核 AppCrawler 是由霍格沃兹测试学院校长思寒开源的一个项目,通过名字我们大概也能猜出个方向,Crawler 是爬虫的意思,App 的爬虫&am…

GitHub上标星79K的LeetCode算法小抄开放下载了

在大厂面试中我们不可避免的会考到算法,为什么大厂一定要考察算法呢?因为它包含了太多的逻辑思维,可以考察你思考问题的逻辑和解决问题的能力;这一点也是面试官比较看重的,因为它可以反映出你的潜力,我曾经…

Qt布局管理器(QHBoxLayout,QVBoxLayout)

文章目录布局管理器是什么使用代码添加布局管理器QVBoxLayoutQHBoxLayout使用ui文件添加布局管理器布局管理器的嵌套提示:以下是本篇文章正文内容,下面案例可供参考 布局管理器是什么 可以把一些组件按一定的次序排列,这就是布局管理器。 他…

反欺诈指南|网购平台如何保障公平交易

网购平台是社会零售重要的组成部分。国家统计数据显示,2021年,全国实物商品网上零售额达10.8万亿元,占社会消费品零售总额的比重为24.5%,对社会消费品零售总额增长的贡献率为23.6%。 网购平台促成买卖双方交易而建立的平台&#…

OpenBMI运动想象--认知科学实践设计

目录 一、简要介绍 (一)材料与准备工具 数据集下载 工具箱下载 参考 (二)OpenBMI工具箱介绍 (三)数据集详细介绍 数据拆分 数据解读 二、预处理 (一)目标 (二&#xff09…

Linux安装和入门

文章目录1、课程介绍2、为什么需要Linux3、Linux简介3.1、什么事Linux3.2、Linux优点3.3、常见的Linux系统3.4、小结4、虚拟机安装4.1、引入4.2、常见的虚拟机软件4.3、安装vmware4.4、vmware常用操作4.4.1、全局配置虚拟机(Linux系统)存储位置4.4.2、虚拟机操作5、CentOS安装5…

Python中的消息框对话框tkinter.messagebox

介绍:使用:选择消息框的模式:提示消息框:【返回”ok”】消息警告框【返回”ok”】:错误消息框【返回”ok”】:对话框:询问确认对话框【返回值:yes/no】确认/取消对话框【返回值:True/False】是/…

【Java集合】Set接口及系列子类HashSet等

文章目录Set接口> Set 接口和常用方法> Set接口实现类 - HashSetHashSet 底层机制(HashMap)> Set接口实现类 - LinkedHashSetSet接口 Set 接口介绍: 无序(添加和取出的顺序不一致),没有索引&…

交叉开发环境搭建

ubuntu网络环境搭建 配置网络环境有很多种方法,可以用命令行也可以用图形化界面。ip可以是静态的也可以是动态的。当然要是用SSH访问的话要配置成静态的,但是用校园网的话,又要是动态的,这里就不详细说了。 我们配置ubuntu是为了能…

Java学习路线图(2023版,视频已更新)

PS:注意收藏,此套路线图会不定期更新!点这里跳转:2023年Java程序员学习路线图入门: Java SE基础 → Java Web(含数据库H5jsvue)中级: Maven → Git → SSM框架 → MybatisPlus → Spring Boot→ 《传智健康》项目实战 …

北大硕士LeetCode算法专题课-基础算法查找

算法专题系列: 北大硕士LeetCode算法专题课---算法复杂度介绍_骨灰级收藏家的博客-CSDN博客 北大硕士LeetCode算法专题课-基础算法之排序_骨灰级收藏家的博客-CSDN博客 查找算法 查找算法也可以叫搜索算法。 查找算法就是从一个有序数列中找出一个特定的数&am…

66.物体检测算法:区域卷积神经网络(R-CNN)系列

1. R-CNN ps:在计算机视觉中,深度学习之前,分类器用的是SVM 2. 兴趣区域(RoI)池化层 目的是为了让每个锚框都可以变成一个自己想要的形状。 3. Fast RCNN 具体步骤如下: 对整张图片用CNN抽特征&#xff…

IT服务管理(ITSM)是什么?ITSM工具哪个好用

什么是IT服务管理(ITSM) IT 服务管理 (ITSM) 包含一组策略和实践,这些策略和实践可用于为最终用户实施、交付和管理 IT 服务,以满足最终用户的既定需求和企业的既定目标。 在此定义中,最终用户可以包含员工、客户或业…