讨论指令解码部分遗留的几个问题。
 
 
1. 最小项与蕴含项之间的关系
 
参考链接:
 
按其中的描述:
 
An implicant covers one or more minterms in a sum of products of a Boolean function.
即一个蕴含项覆盖布尔函数的一个或多个最小项。如果最小项中包含全部的变量,则蕴含项中则可以吸收掉一个或多个变量。
 
从形式上看,最小项用于与或(SoP)表达式的布尔函数,最大项用于或与(PoS)表达式的布尔函数。而蕴含项既可以是SoP中的sum term,也可以是PoS中的product term。
 
在与或表达式中,如果蕴含项为1,则布尔函数的值取1。同样,如果蕴含项是一个最小项,那么这个最小项为1,也能使布尔函数的值为1。
 
Term类表达的是一个蕴含项,包含变量是否出现以及取值信息,不包含与或表达式、或与表达式的信息。所以Term即可表达一个最小项,也可以表达一个最大项,取决于如何使用。
 
Term表达最小项时其mask为全0。
 
 
2. 默认无关值与解码结果0/1如何区分?
 
调用SimplifyDC时,默认值为不关心:
 
SimplifyDC返回要比对的Term序列,而logic返回的是一个bit,其取值只有0和1两种。而dTerm中对应的变量值为x,即不关心。
 
也就是说在decode_table的定义中,变量对应的比特为x,而解码输出的结果为0/1,两者并不一致。
 
如下:
 
logic只能输出0/1,无法输出x。那么使用时如何区分呢?
 
会使用到这个x吗?
应该是不使用的。既然是不关心,那么这个x就应该是不被使用的,相关的逻辑不被使能。
 
能使用这个x吗?
不能。在Scala中,想要比对X或者DW_X,这都没有问题。但译码结果最终要在电路中使用。电路中能把x用于比对吗?与一个未知的值相比较,结果也是未知。与门、或门中倒是可以用x,但需要另一个输入为0或者1,也就是说这个x的值,也是不关心的。即便把x变为0或者1,与门、或门的输出也是不会变的。
 
所以SimplifyDC中,只比对minTerms中的项,而把maxTerms和dcTerms对应的译码结果输出为0,是没有问题的。对于dcTerms而言,无论结果是0/1/x,都不关心。
 
 
3. Term.intersects
 
1) 实现中的小问题
 
Term.intersects的实现如下:
 
如果this和x没有相同的变量呢?
 
如:this.mask = 1100, x.mask = 0011,
则:~mask & ~x.mask = 0,
则:(value ^ x.value) & 0 = 0,
则:0 == 0返回真
也就是说:没有任何相同变量的两个项相交。
 
这显然是不合理的。
 
既然这里Term.intersects这样实现,而又没有发现问题。那么推测可能的原因是:在指令编码时保证必然有相同的变量出现在两个项中。
 
 
2) 相交即相等?
 
相交显然是不同于相等的。
 
在SimplifyDC中,如果判断某一个化简项在maxTerms中存在相交项,则不能进行化简。只进行相交判断,而不进行相等判断,就做出了不能进行化简决定,是不是用力太猛?
 
原因在于SimplifyDC输出的结果是minTerms化简之后剩余的项。在logic()中生成比对逻辑时,只会对minTerms进行相等判断,而没有机会对maxTerms进行相等判断。
 
 
4. maxTerms如何使用?
 
1) maxTerms是最大项?
 
非要对应成或与表达式中的最大项,比较难以理解。
可以简单理解为若maxTerms中的项匹配,则译码结果为0。
 
2) 是否所有的minTerms都与maxTerms进行了相交判断(intersects)?
 
a. 最开始的每一个minTerms和maxTerms都进行了判断
 
 
b. 第一次化简产生的新项没有进行判断
 
 
合并产生的新项直接存入单元格(i+1, j)中,并没有进行判断。后续轮到该单元格时,判断的是其翻转一个变量值之后的新项。
 
事实上无需进行判断。
 
合并之前的两项a, b只有一个变量对应的比特有差异,一个值为0,一个值为1。两者都与maxTerms中的项不相交。
 
根据maxTerms中的项是否存在这个变量,存在两种情况:
i. 存在这个变量(mask对应位为0):那么这个变量必然不是不相交的关键变量,必然还存在其他共同的变量值不同;
i. 不存在这个变量(mask对应位为1):那么这个变量也不是关键变量,必然还存在其他共同的变量值不同;
综合这两种情况,a和b合并之后产生的新项也必然与maxTerms中的所有项都不相交。
 
c. 第二次化简产生的新项也没有进行判断
 
 
根据b中的论述,无论是原有的质项,还是化简产生的新的质项,与所有的maxTerms都是不相交的。
 
同样根据b中的论述,如果翻转一个变量值产生的新项与maxTerms都不相交,那么合并之后产生的新项也与maxTerms不相交。
 
d. 第三次化简产生的新项也没有进行判断
 
 
解释如同c。
 
 
5. Simplify为什么不像SimplifyDC那样翻转变量值进行化简?
 
因为传给Simplify的是minTerms和dcTerms,没有maxTerms,所以只能根据minTerms和dcTerms进行合并化简。
 
翻转变量值可能与maxTerms产生重叠。如第3节中的论述,重叠是不被允许的。
 
 
6. 模型层与构建层
 
BitPat和Term使用的是BigInt,所以Simplify的执行在构建层。而模型直接使用其简化结果进行构建(logic方法)。
 
 

Rocket - decode - 几个问题的更多相关文章

  1. Rocket - decode - SimplifyDC

    https://mp.weixin.qq.com/s/4uWqBRrMVG6FlnBKmw8U-w   介绍SimplifyDC如何简化解码逻辑.     1. 使用   ​​   简化从mint和m ...

  2. Rocket - decode - Term

    https://mp.weixin.qq.com/s/CbBWdTlc_DESlUzd8KFcSg   介绍Term类各方法的实现.     ​​   1. prime   表示一个项是否是质项,即这 ...

  3. Rocket - decode - Simplify

    https://mp.weixin.qq.com/s/YWXYNaRU-DbLOMxpzF2bpQ   介绍Simplify如何简化解码逻辑.     1. 使用   Simplify在DecodeL ...

  4. Rocket - decode - 最小项与最大项

    https://mp.weixin.qq.com/s/XrBh9Kapj01HdvBi5MkbgA   介绍布尔代数最小项与最大项相关概念,以及Term类的实现.     参考链接: https:// ...

  5. Rocket - decode - 解码单个信号

    https://mp.weixin.qq.com/s/0D_NaeBEZX5LBQRdCz2seQ     介绍解码单个信号逻辑的实现.    1. 单个信号   每个指令对应了一组信号,每个信号对应 ...

  6. Rocket - decode - Inst Decode

    https://mp.weixin.qq.com/s/WvepB3yAzjMbQalO3Z82pQ   介绍RocketChip Instruction解码逻辑的实现.   1. RISC-V   R ...

  7. 64位开源处理器Rocket该人士介绍

    最近大概读一点UCB发布时间Rocket处理器的源代码,的每个文件的源代码的功能有一定的一般理解,Mark一点点. Rocket是一家64bit标量处理器,5第一阶段管道,用途risc-v指令集.综合 ...

  8. (转)64位开源处理器Rocket的源代码简单介绍

    转载地址: http://blog.csdn.net/leishangwen/article/details/46604819 最近大概阅读了一下UCB发布的Rocket处理器的源码,对源代码各个文件 ...

  9. flask+sqlite3+echarts2+ajax数据可视化报错:UnicodeDecodeError: 'utf8' codec can't decode byte解决方法

    flask+sqlite3+echarts2+ajax数据可视化报错: UnicodeDecodeError: 'utf8' codec can't decode byte 解决方法: 将 py文件和 ...

随机推荐

  1. Java 常用API(一)

    目录 Java 常用API(一) 1. Scanner类 引用类型的一般使用步骤 Scanner的使用步骤 例题 2. 匿名对象 概述 匿名对象作为方法的参数 匿名对象作为方法的返回值 3. Rand ...

  2. gulp插件学习01

    1.安装和使用 安装node环境:官网:https://nodejs.org: 命令行输入 npm i gulp -g ,gulp-v查看安装是否成功: 创建项目目录: 进入目录,并在目录中按住shi ...

  3. 常用中文分词工具分词&词性标注简单应用(jieba、pyhanlp、pkuseg、foolnltk、thulac、snownlp、nlpir)

    1.jieba分词&词性标注 import jieba import jieba.posseg as posseg txt1 =''' 文本一: 人民网华盛顿3月28日电(记者郑琪)据美国约翰 ...

  4. 关于Fragment的点击切换数据滞留问题

    场景再现:当我使用tabLayout + Fragment 切换不同的fragment时,出现了数据重复显示的问题: 思考逻辑: - 每次切换fragment都会重新获取数据,但是list集合是全局的 ...

  5. Keycloak & Asp.net core webapi 整合跳坑之旅

    前言 之前,一直使用IdentityServer4作为.net core程序的外部身份认证程序,ID4的优点自不必说了,缺点就是缺乏完善的管理界面. 后来,学习java quarkus框架时,偶然遇到 ...

  6. python机器学习笔记:EM算法

    EM算法也称期望最大化(Expectation-Maximum,简称EM)算法,它是一个基础算法,是很多机器学习领域的基础,比如隐式马尔科夫算法(HMM),LDA主题模型的变分推断算法等等.本文对于E ...

  7. java -> 异常类与自定义异常

    异常 什么是异常?Java代码在运行时期发生的问题就是异常. 在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置.原因等). 异常的继承体 ...

  8. GitHub 热点速览 Vol.20:VSCode 插件全家桶新增画图小能手

    作者:HelloGitHub-小鱼干 摘要:后浪,这个五月热词用来概括 GitHub 本周热点无疑是最佳词汇.Deno 这个 Node.js 作者制造出来的后浪,掀起了 GitHub Trending ...

  9. 分布式文件存储库MinIO可还行?

    在传统的单体应用架构中,一个应用程序对应一台服务器,提供单进程服务. 但是随着业务的升级,技术的更新迭代,分布式.集群架构.微服务等现已俨然成为主流. 几乎所有的项目都会与文件挂钩,例如OA系统的报表 ...

  10. spark机器学习从0到1特征选择-卡方选择器(十五)

      一.公式 卡方检验的基本公式,也就是χ2的计算公式,即观察值和理论值之间的偏差   卡方检验公式 其中:A 为观察值,E为理论值,k为观察值的个数,最后一个式子实际上就是具体计算的方法了 n 为总 ...