介绍解码单个信号逻辑的实现。 
 
1. 单个信号
 
每个指令对应了一组信号,每个信号对应了一个解码逻辑。
 
如BNE指令对应的信号如下:
 
各个信号的含义如下:
 
每个信号都是一个BitPat,位宽不定,并非只有一位:
 
事实上是每个信号的每一位对应了一个解码逻辑,每一次只解出一位。
 
2. generator
 
生成解码逻辑的代码(generator)定义于DecodeLogic对象中,如下(已做重构):
 
1) addr即是inst,也就是指令本身;
2) default为默认值;
3) 调用term方法把default转换为项(Term类的实例,如最小项或最大项): val dTerm = term(default)
4) 把映射表mapping解为一组keys和一组values:val (keys, values) = mapping.unzip
5) 分别求出keys和values的最大宽度:
6) 把keys和values转变成为Term:
 
7) 检查kTerms是否存在重叠的情况,即各个指令的编码是否存在重叠的情况:
 
执行示例如下:
 
intersects实现如下:
 
(value ^ x.value) &~ mask &~ x.mask 可以转换为更容易理解的形式:(value ^ x.value) & (~mask) & (~x.mask)
a. (~mask) & (~x.mask)意为:this和x共同的变量;
b. (value ^ x.value) & (~mask) & (~x.mask)意为:this和x共同的变量值都相同;
 
8) 逐个解出信号value的每一位:(0 until vMaxWidth).map(...),然后组合成为所对应的信号:Cat(...)
 
因为前者LSB在前,后者MSB在前,所以需要使用reverse逆序。
 
 
3. 解码单个位
 
先提一下项(Term)的mask中为1的位对应的变量为忽略(dont care)的变量,其对应的位在value中的值为0。mask中为0的位对应的变量为项(最大项、最小项)中包含的变量,其对应的位在value中的值可以为0或1。
 
如由四个变量(A/B/C/D)组成的项AB,则AB对应的mask位为0,CD对应的mask位为1。
 
生成解码单个位的逻辑的代码如下:
 
1) 取出最小项
 
 
k对应的为key,即指令编码;
t对应的为要解码的信号;
 
mint即minTerms,即信号的第i位为1的key的集合,也就是指令的集合。
 
 
2) 取出最大项
 
 
maxt即maxTerms,即信号的第i为为0的key的集合,也是指令的集合。
 
之所以称为maxTerms,是因为其对应的值为0,与minTerms对应的值1相反。根据反演律亦即德摩根定律,最小项取反即为最大项。
 
3) 取出无关项
 
 
mask为1的变量为无关项。
 
 
4) 根据默认值选择要参与解码的项
 
译码的结果有三种:
a. 0
b. 1
c. x/dc,不关心
 
默认值为其中一种,则只需要把 要解码的指令 到 另外两种解码结果的指令集合 中查找即可。
 
a. 默认值为不关心:((dTerm.mask >> i) & 1) != 0
 
使用minTerms和maxTerms进行查找:
 
SimplifyDC使用类似卡诺图化简的方法进行化简,返回Seq[Term]。logic中生成逐个比较并返回的逻辑。
 
b. 默认值为0:val dBit = (dTerm.value.toInt >> i) & 1
 
默认值dBit=0,使用minTerms和dc进行查找:
 
bit为查找结果,找到为1,找不到为0,即默认值。与译码结果一致。
 
c. 默认值为1:val dBit = (dTerm.value.toInt >> i) & 1
 
默认值dBit=1, 使用maxTerms和dc进行查找:
bit为查找结果,找到为1,找不到为0。与译码结果相反,需要取反。
 
4. logic
 
 
把addr与terms中的所有项逐个比对,返回比对结果。
 
 
5. term
 
 
term方法把BitPat,转换为Term。
 
a. Term的值即为BitPat的值;
b. Term的mask为BitPat的mask取反;
 
mask补码 = 2^n - mask = ~mask + 1
即:~mask = 2^n - mask - 1 = 2^n - (mask + 1)
 
 
 

Rocket - decode - 解码单个信号的更多相关文章

  1. Rocket - decode - Inst Decode

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

  2. Fidder详解-工具简介(保存会话、decode解码、Repaly、自定义会话框、隐藏会话、会话排序)

    前言 本文会对Fidder这款工具的一些重要功能,进行详细讲解,带大家进入Fidder的世界,本文会让你明白,Fidder不仅是一个抓包分析工具,也是一个请求发送工具,更加可以当作为Mock Serv ...

  3. javascript处理HTML的Encode(转码)和Decode(解码)总结

    HTML的Encode(转码)和解码(Decode)在平时的开发中也是经常要处理的,在这里总结了使用javascript处理HTML的Encode(转码)和解码(Decode)的常用方式 一.用浏览器 ...

  4. python 编码与解码 decode解码 encode 编码

    >>> '无'   #gbk字符'\xce\xde'>>> str1 = '\xce\xde'>>> str1.decode('gbk')  # ...

  5. 二、IRIG_B解码AC信号

    AC-----过零检测(MAX913ESA)---1khzB码信号(以0v为界大于0为高,小于0为低,的 方波信号) AC-----信号放大(TLE2022ID--mv到5v) ---系统电压转换(M ...

  6. python中------decode解码出现的0xca问题解决方法

    一.错误: 解决方法: #源代码 data = sk.recv(1024) print(str(data,'gbk')) #修改代码 data = sk.recv(1024) print(str(da ...

  7. Rocket - decode - 几个问题

    https://mp.weixin.qq.com/s/pMsK_E4mQrm3QXdnp7nDPQ   讨论指令解码部分遗留的几个问题.     1. 最小项与蕴含项之间的关系   参考链接: htt ...

  8. Rocket - decode - SimplifyDC

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

  9. Rocket - decode - Simplify

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

随机推荐

  1. 硬肝4.4w字为你写成Java开发手册

    先来看一下本篇文章的思维导图吧,我会围绕下面这些内容进行讲解.内容很干,小伙伴们看完还希望不吝转发.(高清思维导图版本关注作者公众号 Java建设者 回复 Java666 获取,其他思维导图获取方式在 ...

  2. Linux下3种常用的网络测速工具

    大家好,我是良许. 不管你用的是什么操作系统,网速都是你非常关心的一个性能指标,毕竟,谁都不想看个视频结果网速卡到你怀疑人生.本文介绍三个 Linux 命令行下的网络测速工具,让你随时随地知道你的网络 ...

  3. PHP导出excel文件,第一步先实现PHP模板导出不带数据

    今天继续研究PHP导出excel文件,把复杂的事情简单化,一步步实现功能,首先实现模板文件的导出,随后再实现写入数据后导出,最终实现功能,这是基本思路.中间可以加一步,先自己写入数据导出试试,随后再数 ...

  4. 一、Spring的控制反转(IOC)学习

    一.控制反转 1.什么是控制反转? 控制反转(Inversion of Control,缩写为IoC),是面向对象中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(D ...

  5. 浅析Spring中AOP的实现原理——动态代理

    一.前言   最近在复习Spring的相关内容,刚刚大致研究了一下Spring中,AOP的实现原理.这篇博客就来简单地聊一聊Spring的AOP是如何实现的,并通过一个简单的测试用例来验证一下.废话不 ...

  6. fork...join的用法

    如果希望在仿真的某一时刻同时启动多个任务,可以使用fork....join语句.例如,在仿真开始的 100 ns 后,希望同时启动发送和接收任务,而不是发送完毕后再进行接收,如下所示: initial ...

  7. Python实现将网站域名解析为ip地址

    起因 因为一些事情,需要将域名解析为ip地址,想到Python作为万能语言,就用Python来实现这个功能 代码 import socket url = 'shiyixirui.cn' res = s ...

  8. 转帖 支撑4.5亿活跃用户的WhatsApp架构概览

    http://www.csdn.net/article/2014-02-27/2818559-an-overview-at-whatsapp's-19b-architecture/2 写的很好,确实牛 ...

  9. webpack指南(三)缓存

    缓存 把 /dist 目录中的内容部署到服务器上,客户端(通常是浏览器)就能够访问网站此服务器的网站及其资源.而通过网络获取资源是比较耗时的,这就是为什么浏览器要使用缓存这种技术.可以通过命中缓存,以 ...

  10. [Unity UGUI序列帧]简单实现序列帧的播放

    在使用序列帧之前需要准备好序列帧的图集,打图集的操作参考 [Unity UGUI图集系统]浅谈UGUI图集使用 准备好序列帧图集,序列帧的播放原理就是获取到图集中的所有图片,然后按照设置的速度按个赋值 ...