https://mp.weixin.qq.com/s/yato1PrnHe517J8twgZFOg
介绍ECC(Error Correcting Code/Error Checking and Correcting)的实现框架。不涉及编码的具体实现细节。

1. 码:Code

所有编码(如奇偶校验码、海明码)的抽象父类。
包含如下几个方面:
a. 能否检错:canDetect;
b. 能否纠错:canCorrect;
c. width():输入为数据的宽度,输出为编码后码文的宽度,一般情况下为数据和监督码的宽度之和;
d. encode(x):把数据x进行编码,并输出编码后的码文;
e. decode(y):对码文y进行解码,输出解码结果Decoding;
f. swizzle(x):参考注释;
2. 解码结果:Decoding

Decoding为解码结果,包含如下几个方面:
a. uncorrected:码文中未纠错的数据,即码文中的原始数据;
b. corrected: 使用监督码纠错之后的数据,即解码的输出结果;
c. correctable:根据各种码的实现,correctable意义为:有没有进行纠错;
d. uncorrectable:根据各种码的实现,uncorrectable的意义为:解码输出的结果是否正确;
e. error:是否包含错误,无论是否可以纠正的错误,都视为错误;
correctable/uncorrectable的命名是有问题的,词不达意,且造成误解。
从字面意思上看,correctable和uncorrectable应该相反,即correctable = !uncorrectable,为什么会定义两个呢?所以不能从字面意思上理解,他们代表了两个不同的意义。
correctable和uncorrectable分别代表能修正的错误位和不能修正的错误位?也不是,两者的类型皆为Bool,而非UInt。
单从命名上无法推知他们的意义。
参考IdentityCode/ParityCode/SECCode的实现之后,推知两者的意义分别为:
a. correctable:有没有进行纠错;
b. uncorrectable:解码输出的结果是否正确,即corrected的值是否正确(是否存在不可挽回的错误);
即两者标识从原始数据(uncorrected)到最终数据(corrected)过程中的两个情况:
a. 是否发生了纠错;
b. 是否纠正了错误;
为了提高可读性,个人尝试对Decoding改名如下:


PS. 因为对码研究有限,这个修改未必正确,提请注意。
再回过头来看uncorrectable的注释:

因为uncorrectable是对纠错结果的标识,如果uncorrectable为真,则存在不可挽回的错误,即不可纠正的错误,那么有没有发生过纠错(由correctable标识)就无关紧要了。
3. IdentityCode

相同编码。
a. 没有检错能力:def canDetect = false
b. 没有纠错能力:def canCorrect = false
c. 码文宽度与数据宽度相同:def width(w0: Int): Int = w0
d. 码文与数据相同,没有监督码:

e. swizzle:没有研究;
f. decode:

重构之后为:

a. 码文中的原始数据(raw)为y,即全部都是原始数据,不存在监督码;
b. 最终输出的数据(out)为y;
c. 是否发生过纠错(corrected):没有;
这里存在两个层次:首先IdentityCode没有纠错能力,进而也没有发生纠错;
d. 是否存在不可纠正的错误(uncorrectable):没有;
这个没有是因为IdentityCode没有检错能力,不知道是否存在错误;
4. ParityCode

奇偶检验码。
a. 能够检错:def canDetect: Boolean = true
b. 不能纠错:def canCorrect: Boolean = false
c. 含有1位监督码:def width(w0: Int): Int = w0+1
d. 使用逐位异或计算奇偶校验码:def encode(x: UInt, poison: Bool = Bool(false)): UInt = Cat(x.xorR ^ poison, x)
e. decode:

其中:
a. 码文中的数据(raw)为去掉最高的奇偶校验码:val raw: UInt = y(y.getWidth-2,0)
b. 最终输出的数据(out)为raw:不具备纠错能力;
c. 是否发生过纠错(corrected):没有,同IdentityCode;
d. 是否存在不可挽回的错误:因为没有纠错能力,所以只要发生错误,即是不可挽回的错误。检错通过对码文逐位异或实现。如果结果为0,则没检测到错误(检错能力有限,不代表没有错误);如果结果为1,则检测到错误。
5. SECCode
既能检错,又能纠错的单个错误校正码(single-error-correcting)。这里不具体研究其实现,只研究decode输出的Decoding。
监督码的值代表发生错误的位:


其中:
a. 码文中的原始数据(raw):y(k-1, 0),除去监督码;
b. 最终输出的数据(out)为纠错后的数据,把检测到错误的位反转:val out: UInt = raw ^ sysBadBitOH
c. 是否发生过纠错(corrected):如果监督码不为0,则发生了纠错:val corrected: Bool = syndromeUInt.orR;
d. 是否存在不可挽回的错误(uncorrectable)

如果长度合适,则所有的码文都可以纠正,即uncorrectable恒为Bool(false);
如果长度不合适,则是否能够纠正取决于监督码是否异常:syndromeUInt > UInt(n)
6. SECDEDCode

Single Error Correction, Double Error Detection。
能力有限,这里不做研究了。
7. ErrGen

错误发生器。
8. CanHaveErrors

是否包含错误的特征。
9. ECCParams

ECC的参数:
a. 字节数;
b. 码的类型;
c. 是否通知错误;
10. 伴生对象Code

方便从名称生成相应的码的对象。
11. 附录
ECCRefactored.scala:
略
- Rocket - util - Annotations
https://mp.weixin.qq.com/s/7C8ZmPpwAqFqyKjL9K40Fg 介绍util中定义的注解(Annotations). 1. Annotation ...
- Rocket - util - Timer
https://mp.weixin.qq.com/s/Z4JJhZ_jL1lqF1nf_orq9A 简单介绍Timer的实现. 1. 基本功能 实现定时器的功能. 2. Ti ...
- Rocket - util - Replacement
https://mp.weixin.qq.com/s/zCP7wPuxgQ-r94Tr6BV5iw 简单介绍Replacement的实现. 1. 基本介绍 用于实现Cache替换 ...
- Rocket - util - ReduceOthers
https://mp.weixin.qq.com/s/gbR5fuDbE_nUFVxw-p4rsA 简单介绍ReduceOthers的实现. 1. 基本介绍 输入一组Bool元素 ...
- Rocket - util - Repeater
https://mp.weixin.qq.com/s/xyEq3DgYuf2QuNjssv8pkA 简单介绍Repeater的实现. 1. 基本功能 A Repeater pas ...
- Rocket - util - PrefixSum
https://mp.weixin.qq.com/s/G2vLP-ncoJzSOgxGGEJkfA 简单介绍PrefixSum的实现. 1. 基本介绍 把一个序列从前向后逐 ...
- Rocket - util - MultiWidthFifo
https://mp.weixin.qq.com/s/CUnrpyQN5LRBR5bxC5u86A 简单介绍MultiWidthFifo的实现. 1. 基本介绍 实现一个输入宽度 ...
- Rocket - util - MaskGen
https://mp.weixin.qq.com/s/_aJqf1cFJDK5RVRBhxTWOw 介绍MaskGen的实现. 1. 基本介绍 给定总线宽度beatBytes,根 ...
- Rocket - util - Misc
https://mp.weixin.qq.com/s/kf4FvAFye_bRdT49Yow7Hg 简单介绍Misc中各个辅助方法的用途和实现. 1. ParameterizedBu ...
随机推荐
- 挑战程序竞赛 反转开关 poj3276
这个我其实也没有看太懂它的证明过程. 1.若某一个位置被翻转了n次,则其实际上被翻转了n%2次. 2.分析易知翻转的顺序并不影响最终结果. 3.现在我们着眼于第1个位置,可知若要将第1个位置进行翻转只 ...
- EditPlus编辑java代码 常规配置
- 【跟我一起读 linux 源码】总述
经过之前的一个系列学习,自己照着书本 <操作系统真相还原>学着做了一个 demo 级别的操作系统,总算对操作系统的整体和细节有了一个粗浅的了解.但写操作系统不是目的(我目前也没这能力),主 ...
- GitHub上Asp.Net Core的源代码
记录,备查. https://github.com/aspnet/AspNetCore/tree/master/src
- 用PHP获取网页上的信息相对于xpath效率低点
用php实现对网页的抓取,及信息的收集,其实就是爬数据,具体实现步骤如下,首先应引入两个文件curl_html_get.php和save_file.php文件,两个文件具体代码是这样的curl_htm ...
- 设计模式之GOF23适配器模式
结构型模式 核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的 类结构,用来解决更大的问题 适配器模式adapter 实际生活中的例子:转换器 适配器的两种方式: 1,类适配器(继承) /**需 ...
- [hdu5379 Mahjong tree]dfs计数
题意:给n个节点的树编号1-n,一个节点唯一对应一种编号,要求编完号的树满足如下性质:所有节点的儿子的编号是连续的,对一棵子树,它包含的所有节点的编号也是连续的.连续的意思是把所有数排序后是一段连续的 ...
- Java设计模式之建造者模式(Builder Pattern)
前言 这篇文章主要向大家讲解什么是建造者模式,建造者模式的实例讲解及应用场景等知识点. 一.建造者介绍 用户可以不知道产品的构建细节直接可以创建复杂的对象,主要是分离了产品的构建和装配,这样就实现 ...
- 02JAVA基础-运算符及选择语句
一.运算符 1.算数运算符 算数运算符 备注 + 可以用作拼接 - * / 整数相除得整数,需要获得小数,需一方为浮点数 % 取余数 ++ 自增 -- 自减 扩展(1) 对于++和--的扩展(以++为 ...
- dedecms_v5.7的apache文件名解析漏洞的学习
0x00 Apache文件名解析漏洞 Apache是一个Web服务器,可以提供web服务.配合java中间件.PHP实现动态页面访问. Apache和PHP通过接口接入后,Apache接受用户的请求, ...