介绍RocketChip Instruction解码逻辑的实现。
 
1. RISC-V
 
RocketChip实现了RISCV ISA:
 
 
作为RISC-V的官方实现,实现的规范版本比较新,使用的编码技术也比较激进。
 
 
2. decode_table
 
在RocketImpl类中,定义了decode_table解码表:
 
里面定义了每个指令的key与译码结果(包含许多参数)的映射表,如IDecode里面的table定义:
 
key为指令的编码,以BitPat的形式定义的:
 
值亦即译码结果是一组BitPat,如:
 
其结构定义为类IntCtrlSigs:
 
默认值为:
 
 
3. 指令解码(ID)的输入与输出
 
解码的输入即是指令本身,指令从内存中读入;
解码的输出即是IntCtrlSigs中定义的各个信号;
 
解码的过程:
根据输入指令,使用decode_table中定义的映射表,查找出与其对应的IntCtrlSigs这一组信号。
 
因为decode_table过大,译码逻辑需要简化,简化的理论根据是布尔代数,方法类似于卡诺图化简。
 
4. id_ctrl
 
其中:
a. id_inst(0)为需要解码的指令;
b. id_ctrl为解码的输出;
c. decode_table为查找表;
 
5. IntCtrlSigs
 
a. 调用DecodeLogic解出译码结果;
b. decoder中的比特组成及顺序与sigs序列中定义的顺序一一对应:
c. 把decoder中的各个比特组成部分与sigs中的信号一一连接:
 
 
6. DecodeLogic
 
a. mappingIn即为decode_table,其中为key(BitPat)到values(Seq[BitPat])的映射;
b. mapping(i)为key(BitPat)到values中第i个BitPat(如:rocc, br, jal等)的映射表;
c. 调用另外一个apply,每次解出一个value,即每次生成解出一个value的逻辑:
 
7. 解码单个信号
 
代码为提高可读性,已做重构:
 
 
 

Rocket - decode - Inst Decode的更多相关文章

  1. python编码问题之\"encode\"&\"decode\"

    python encode decode 编码 decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换 ...

  2. Oracle 中 nvl、nvl2、nullif、coalesce、decode 函数的用法详解

    NVL(EXPR1,EXPR2) NVL2(EXPR1,EXPR2,EXPR3) NULLIF(EXPR1,EXPR2) COALESCE(EXPR1,,..,EXPRn) decode ------ ...

  3. Oracle / PLSQL函数 - DECODE

    1.DECODE( expression , search , result [, search , result]... [, default] ) 参数说明: expression : 表中的某一 ...

  4. Oracle特有函数 case when decode exists 分页rownum

    select * from EMP eselect * from dept dselect * from salgrade s--Oracle特有函数 case whenselect case 2 w ...

  5. [Algorithm -- Dynamic programming] How Many Ways to Decode This Message?

    For example we have 'a' -> 1 'b' -> 2 .. 'z' -> 26 By given "12", we can decode t ...

  6. 【转】python 字符编码与解码——unicode、str和中文:UnicodeDecodeError: 'ascii' codec can't decode

    原文网址:http://blog.csdn.net/trochiluses/article/details/16825269 摘要:在进行python脚本的编写时,如果我们用python来处理网页数据 ...

  7. Oracle中sign/decode/nvl/round/trunc/(+)/instr/substr/replace解释

    1. sign函数 sign函数语法: sign(n); sign函数说明: 取数字n的符号,大于0返回1,小于0返回-1,等于0返回0(n可以是表达式,(n-200)) 例子: a=10; b=50 ...

  8. 简单接触oracle数据库nvl函数decode函数

    SQL语句的DECODE()和NVL()函数用法 SELECT DECODE(choose_tool,0,'宝马',1,'电动车',2,'自行车','步行')  AS my_tool FROM dat ...

  9. DECODE 与CASE WHEN 的比较以及用法

    1.DECODE 只有Oracle 才有,其它数据库不支持; 2.CASE WHEN的用法, Oracle.SQL Server. MySQL 都支持; 3.DECODE 只能用做相等判断,但是可以配 ...

随机推荐

  1. spring mvc从后台往前台传参数的三种方式

    第一种:使用Model对象(常用) 第一步:使用model对象往前台传递数据 第二步:在jsp中接收从后台传递过来的参数 第二种:使用HttpServletRequest对象 第一步:使用HttpSe ...

  2. docker-compose安装rabbitmq

    编写时间:2020-05-08 参考文档:docker安装rabbitmq 1. 编写docker-compose.yml version: '3' services: rabbitmq: image ...

  3. 【Kafka】Consumer API

    Consumer API Kafka官网文档给了基本格式 http://kafka.apachecn.org/10/javadoc/index.html?org/apache/kafka/client ...

  4. 一篇博客带你轻松应对Springboot面试

    1. SpringBoot简介 SpringBoot是简化Spring应用开发的一个框架.他整合了Spring的技术栈,提供各种标准化的默认配置.使得我们可以快速开发Spring项目,免掉xml配置的 ...

  5. PHP正则表达式语法汇总

    首先,让我们看看两个特别的字符:'^' 和 ‘$' 他们是分别用来匹配字符串的开始和结束,一下分别举例说明"^The": 匹配以 "The"开头的字符串;&qu ...

  6. ASP.NET Core依赖注入(DI)

    ASP.NET Core允许我们指定注册服务的生存期.服务实例将根据指定的生存时间自动处理.因此,我们无需担心清理此依赖关系,他将由ASP.NET Core框架处理.有如下三种类型的生命周期. 关于依 ...

  7. 5.7 Go 捕获异常

    5.7 Go 捕获异常 Go语言处理异常不同于其他语言处理异常的方式. 传统语言处理异常: try catch finally go语言 引入了defer.panic.recover 1.Go程序抛出 ...

  8. kudu_单master集群安装

    1.配置JDK1.7/1.8,免密设置,ntp时间同步配置. 2. 将下载下来的文件放到/etc/yum.repos.d/ 目录下后,进行下一步 3.使用yum管理器安装 (集群搭建) sudo yu ...

  9. Form action 方法上传文件

    <form method="post" id="form1" runat="server" enctype="multipa ...

  10. oracle [精华] 你是否仍迷信rowid分页?

    http://www.itpub.net/thread-1603830-1-1.html