【计算机系统设计】实践笔记(2)数据通路构建:第一类R型指令分析(1)

0 回顾

上一次实践笔记(0)我们实现了一个最简单的,能够每个上升沿+4的PC。

我们最需要关注的就是器件功能的独立性,避免内外功能混杂,同时一定要注意脑中有电路(RTL级描述的抽象电路而不是实际的门级电路,内个交给EDA工具就行)。

1 针对的指令

现在,我们分析一下R类指令,我们需要构建数据通路,而很多的R类指令是相似的,因此可以直接分析一类指令,就像所有指令都需要取指,我们就分析所有指令一样。

那么,我们要分析哪一类指令?这取决于我们准备实现的指令有什么,我们先看看。

add addu sub subu and or xor nor slt sltu sll srl sra sllv srlv srav jr

哦是的,我们需要实现以上R类指令,那么我们来分分类吧:

  1. 指令格式op rs rt rd 00000 func
    1. 算数运算指令:add addu sub subu and or xor nor
    2. 置位指令:slt sltu
    3. 移位指令:sllv srlv srav
  2. 指令格式op 00000 rt rd shamt func:移位指令:sll srl sra
  3. 指令格式op rs 00000 00000 00000 func:跳转指令:jr

我们需要注意的是,我们是按照指令格式的形式进行分类的,而不是功能,因为同样指令格式的指令,(各阶段的)执行过程是类似的,可以有类似的器件和信号。


下面,我们来分析一下第一类指令格式:

指令格式op rs rt rd 00000 func的分析如下:


2 功能分析

我们一直强调的是类似,而不是相同,因此我们先完成通用器件的分析,再针对个别特殊情况处理。

2.1 指令格式

指令oprsrtrdshamtfunce.g.explainoperation
add000000rsrtrd00000100000add $1,$2,$3$1=$2+S3(rd)←(rs)+(rt); rs=$2,rt=$3,rd=$1

我们就先看这一条add指令,它具备通用的特征,首先声明,我们不实现add指令的异常处理机制

我们依次分析一下各个字段

2.2 指令识别

CPU设计最重要的点,就是需要识别出当前执行的指令,对于该格式来说,需要识别是编码是 opfunc

  1. op = 6'b000_000,几乎所有R型指令都是这样,在我们要实现的R型指令中,全部都是op = 6'b000_000
  2. 对于func,是R型指令识别的关键,不同的R型指令(op = 000000),func字段一定不一样,每个func编号,对应了一个指令,对应了一种操作。

2.3 指令操作

这一类指令,shamt = 00000都是一样的,并且并不使用该字段,可以直接忽略。

而对于rs rt rd字段,这类指令都执行rd = rs 操作 rt

我们使用一种通用的表述方式:op $reg1,$reg2,$reg3,那么对应的是

  1. 字段:rs = reg2rt = reg3rd = reg1
  2. 操作:rd = rs op rt

我们目前分析的这一类,都是这样的!

它的完整功能(RTL)描述是:

  1. 取指:M[PC]; PC <- PC + 4
  2. 执行:R[rd] <- R[rs] op R[rd]

3 需要的器件

之前我们知道了指令的识别操作,现在,我们看看需要什么器件来完成操作

首先,毫无疑问是从ROM中取指(IF阶段),这一点,我们上一篇完成了PC,但是还没有设计ROM,后面再说。

现在,假设我们取到了指令,接下来该如何处理呢?

3.1 ID(译码)阶段

我们看看这个操作:R[rd] <- R[rs] op R[rd]

毫无疑问,我们需要寄存器,是的,就是MIPS的32个内部寄存器,然后我们需要控制器,因为寄存器需要控制的,至少写入操作需要控制,不是任何时候每条指令都能够写入寄存器的。

现在,我们知道我们需要2个器件了

  1. 控制器
  2. 寄存器

问题:为什么这两个器件在译码阶段?

  1. 经典的流水线就是这么设计的(好吧这不是什么分析…)
  2. 你可以想想,我们刚刚拿到了一串二进制信息,总得知道它是什么吧,控制器就是解析编码用的,根据opfunc的信息,来确定这是什么指令,需要什么控制信号。
  3. 我们又知道,译码是需要时间的,不过组合逻辑执行会非常快。我们知道硬件是并行工作的,控制器执行的同时,也可以干点别的事情,我们知道MIPS大部分指令都需要寄存器组的内容,所以,我们就用指令的其他字段完成**寄存器访问(读)**的工作。
  4. 另外,我们再探析一下,什么叫做译码,译码就是解析指令,它完成了2项内容
    1. 控制器解析opfunc字段,获取控制信号
    2. 寄存器使用rsrtrd字段,完成数据的访问,当然,第一阶段实际上只是读取数据,没有使用rd
    3. shamt字段并没有使用,我们当前分析的指令不需要管它,至于后面的,以后再说。
    4. 剧透(可以先不看):后面我们会看见,指令的解析不仅仅在译码阶段,也可以在其他阶段,shamt可以在EX执行阶段被使用,而func也可以在该阶段被解析,这完全取决于设计者的意志,我们最终能够达到正确执行指令的目标就好了。

3.1.1 寄存器堆(Register Files)的设计

在这里插入图片描述
我们看看这个寄存器堆的信号

  1. 指令字段相关:rs rt rd
  2. 通用功能:clk时钟上升沿\下降沿(取决于设计)触发写入操作,rst高电平复位
  3. 数据:R[rd]是待写入的数据,是计算结果,R[rs] R[rd]是根据指令字段读取的数据
  4. 控制相关:RegWrite代表是否允许写入数据,是来自控制器的控制信号,高电平有效

图中有一个错误:右边输出的下面的R[rd]应该是R[rt]

3.1.2 控制器的设计

我们的输入信号是opfunc字段,输出是什么?是控制信号。需要什么控制信号?我们之后再说。

我们能够得到输入输出,一个纯组合逻辑的电路不难设计,是的,控制器的硬件实现非常简单,困难的是如何设计控制信号,我们后面一步步展开。
在这里插入图片描述我们先建立一个空架子。

3.2 EX(执行)阶段

再这个操作:R[rd] <- R[rs] op R[rd],我们需要执行操作是op,那么

  1. 这个操作是什么?
  2. 如何识别这个操作?
  3. 识别操作后,如何执行?

我们依次解答一下。

首先,这个操作是什么,取决于opfunc字段,我们需要使用控制器识别操作,并且输出相应的控制信号。

给出了相应的控制信号,我们就知道要执行什么操作(加法,减法,还是乘法……),然后我们就需要ALU运算器完成运算。

因此,我们需要的新器件是ALU运算器

在这里插入图片描述这就是我们的ALU了

  1. 两个输入的数据来自于刚才从寄存器堆读取的值
  2. ALU的操作op来自于控制器输出的**运算操作ALUop**信号
  3. 输出的值R[rd]会被写回到寄存器堆中去

在这里插入图片描述现在,我们的数据通路是这样了,其中红色字是指令的字段。

4 控制信号

4.1 控制器设计

  • 输入信号:op func
  • 输出信号:RegWrite ALUop
instructionopfuncALUopRegWrite
add00000010000000001
addu00000010000100011
sub00000010001000101
subu00000010001100111
and00000010010001001
or00000010010101011
xor00000010011001101
nor00000010011101111
slt00000010101010001
sltu00000010101110011
sllv00000010101010101
srlv00000000011010111
srav00000000011111001

其中,RegWrite高电平有效,代表能够写入到寄存器,再配合时钟触发(暂定上升沿触发)即可向寄存器堆写入数据。

现在有13种操作,后面还有一些操作,因此暂时设置ALUop为4位信号(最多识别16种操作),后续如果需要再更改。

4.2 ALU设计

  • 数据输入:R[rs] R[rd]
  • 控制输入:ALUop
  • 数据输出:R[rd]
ALUop操作
  • 操作:对应4.1中的instruction
  • ALUop:对应4.1中的ALUop

这里就不写了。

5 数据线

输入的指令就是最重要的数据。

6 地址线

7 控制线

clk时钟信号和rst复位信号。

8 实现

8.1 控制器

control_1.v

`timescale 1ns / 1psmodule control_1(input [5:0] op,input [5:0] func,output reg RegWrite,output reg [3:0] ALUop);always @(*)
beginif(op == 0)begincase (func)6'b100000:  // addbeginRegWrite <= 1;ALUop <= 4'b0000;end6'b100001:  // addubeginRegWrite <= 1;ALUop <= 4'b0001;end6'b100010:  // subbeginRegWrite <= 1;ALUop <= 4'b0010;end6'b100011:  // sububeginRegWrite <= 1;ALUop <= 4'b0011;end6'b100100:  // andbeginRegWrite <= 1;ALUop <= 4'b0100;end6'b100101:  // orbeginRegWrite <= 1;ALUop <= 4'b0101;end6'b100110:  // xorbeginRegWrite <= 1;ALUop <= 4'b0110;end6'b100111:  // norbeginRegWrite <= 1;ALUop <= 4'b0111;end6'b101010:  // sltbeginRegWrite <= 1;ALUop <= 4'b1000;end6'b101011:  // sltubeginRegWrite <= 1;ALUop <= 4'b1001;end6'b000100:  // sllvbeginRegWrite <= 1;ALUop <= 4'b1010;end6'b000110:  // srlvbeginRegWrite <= 1;ALUop <= 4'b1011;end6'b000111:  // sravbeginRegWrite <= 1;ALUop <= 4'b1100;enddefault:beginRegWrite <= 0;ALUop <= 4'b1111;endendcaseendelsebeginRegWrite <= 0;ALUop <= 4'b1111;end
endendmodule

注意默认情况下的值。

RTL优化
在这里插入图片描述

功能仿真测试

tb_control_1.v

`timescale 1ns / 1psmodule tb_control_1();
// control_1 Parameters
parameter PERIOD  = 10;// control_1 Inputs
reg   [5:0]  op                            = 0 ;
reg   [5:0]  func                          = 0 ;// control_1 Outputs
wire  RegWrite                             ;
wire  [3:0]  ALUop                         ;initial
beginop = 1 ;func = 0 ;#10op = 0 ;func = 6'b100000;#10op = 0 ;func = 6'b100001;#10op = 0 ;func = 6'b100010;#10op = 0 ;func = 6'b000111;#10op = 0 ;func = 6'b111111;
endcontrol_1  u_control_1 (.op                      ( op        [5:0] ),.func                    ( func      [5:0] ),.RegWrite                ( RegWrite        ),.ALUop                   ( ALUop     [3:0] ));endmodule

是的,控制器非常简单,2个输入,2个输出,真值表都有了,非常容易不是吗?


8.2以及之后的内容,在下一篇文章。

【计算机系统设计】实践笔记(2)数据通路构建:第一类R型指令分析(2)

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

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

相关文章

接口的抽象与实现(概述)

概述 我们先建立一个整体的接口格局观&#xff0c;建立知识地图&#xff0c;了解接口的大概面貌。 整体来说&#xff0c;就这点事儿&#xff0c;4个箭头代表了所有&#xff01; 三个器件4个箭头 把这几个都想明白&#xff0c;就完事儿了。 第一层&#xff08;顶层&#xf…

从功能层次,阐述CPU、接口和外设之间的交互

我们从功能抽象层次&#xff0c;阐述一下CPU、接口芯片和外设之间的交互情况&#xff1a; 三个器件4个箭头 我们依次将其描述清楚。 数据 箭头①和③ CPU给接口可以发送数据&#xff0c;然后接口暂存数据&#xff0c;之后再发给外设&#xff0c;这就是数据缓冲。 发送的数…

Vivado工程文件分类

只需要在创建的时候&#xff0c;选择自定义路径即可&#xff0c;最好在原有的new文件夹下新建文件夹。 至于路径的匹配&#xff0c;可以自己试试&#xff0c;在原有默认new下创建文件夹&#xff0c;选中新的文件夹后&#xff0c;内部的Verilog文件可以访问外部new文件夹的文件&…

【微机原理与接口技术】具体芯片(1)并行接口8255A(1):全局观

并行接口8255A 首先&#xff0c;它是传输并行数据的&#xff0c;与CPU一样&#xff0c;然后&#xff0c;它是可编程的&#xff0c;也是多功能的&#xff0c;CPU可以对其进行一些控制。 管脚 先从最宏观层面分类 一部分引脚与外设相连一部分引脚与CPU相连GND和Vcc 注意&…

【算法】【殊途同归】搜索算法之(深度优先 || 广度优先) (约束条件 || 限界函数)

对于所谓的分支限界法和回溯法&#xff0c;我们完全可以更加灵活&#xff0c;请看表格。 深度优先广度优先约束条件限界函数算法策略√√回溯法局部判定√√√分支限界法局部判定√√√加限界的回溯法局部判定√枚举法全局判定√枚举法全局判定 前两种是我们常见的&#xff0c…

【算法】学习笔记(0):算法初探(逻辑抽象 + 示例 + 代码实现)

什么是算法? 人生皆算法&#xff0c;算法的本质&#xff0c;是解决问题的方法&#xff0c;遇到问题&#xff0c;寻找答案&#xff0c;解决问题&#xff0c;是作为一个人&#xff0c;一生都在做的事情。 算法是人类思维的产物&#xff0c;是解决问题的方案&#xff0c;并且&a…

【Verilog】数据流建模传输问题:赋值传输有方向

这次&#xff0c;我们说明的是&#xff0c;assign语句实现的数据流建模&#xff0c;包含的是两个层面 建立联系传输方向 assign A B的本质含义是 A与B建立关联B的值传给A 这个传输方向至关重要&#xff0c;实际情况是什么&#xff0c;就必须按照顺序进行&#xff0c;不是单…

【计算机系统设计】实践笔记(2)数据通路构建:第一类R型指令分析(2)

待办事项 时钟频率高&#xff0c;取指周期长&#xff0c;远大于执行周期&#xff0c;如何处理&#xff1f; 不可综合逻辑的处理 接上一篇 【计算机系统设计】实践笔记&#xff08;2&#xff09;数据通路构建&#xff1a;第一类R型指令分析&#xff08;1&#xff09; 8.2 ALU运…

【计算机系统设计】实践笔记(2)插叙:综合与实现

接上一篇文章的第10节 之前完成了功能仿真&#xff0c;下面我们进行综合实现。 10.1.1 综合 综合成功。 实现试试 这真是令人悲伤……找Bug吧。 我们看看综合后的门级网表。 发现综合后的并不是我们想要的……看了看可能是综合的目录错误&#xff0c;我们再试试。 不是这…

【电路原理】学习笔记(1):电路模型的基本变量

上一讲说到了电路模型&#xff0c;这一电路的抽象&#xff0c;现在我们看看它的基本组成。 1 电流 1.1 概念 对于一根管道&#xff0c;它能够流通电荷&#xff0c;定向移动就形成了电流。 单位时间t内&#xff0c;&#xff0c;某一横截面&#xff0c;穿过电荷量是q&#xf…

【电路原理】学习笔记(0):电路与电路模型

东北大学电路原理MOOC 电路原理的核心点&#xff1a;研究电路模型 我们实际看见的&#xff0c;是真实电路 我们高中学的&#xff0c;是电原理图 现在&#xff0c;我们要研究的是电路模型&#xff0c;它是实际电路的抽象模型&#xff0c;并且是理想化的。 对于电路模型&#…

【计算机系统设计】实践笔记(3)改进数据通路:移位R型指令分析

0 回顾 前面的内容中&#xff0c;第一类R型指令分析&#xff0c;我们完成了一类R型指令的设计&#xff0c;完成了其数据通路&#xff0c;构建了相应的部件&#xff0c;并且完成了从ROM中取指&#xff0c;成功进行了基本的功能仿真&#xff0c;进行了综合和实现&#xff0c;但是…

【计算机系统设计】实践笔记(3)改进数据通路:jr指令分析与实现

1 jr指令分析 instructionoprsrtrdshamtfuncjr000000rs000000000000000001000 举例&#xff1a;jr $31 功能&#xff1a;PC <- &#xff08;$31&#xff09; 这是个跳转指令&#xff0c;将指定寄存器的值&#xff0c;放入PC中&#xff0c;是无条件跳转。 我们需要 更新P…

【计算机系统设计】实践笔记(4)改进数据通路:第一类I型指令分析与实现

0 回顾 之前&#xff0c;我们完成了17条R型指令的设计&#xff0c;接下来&#xff0c;我们逐步完成I型指令的设计。 1 核心思想&#xff1a;增量思维 & 复用思维 & 学会选择 & 分治思想 增量思维 我们从无到有&#xff0c;构建了支持R型指令的CPU&#xff0c;接…

【算法】学习笔记(2):递归思想

0 回顾 之前的笔记&#xff08;0&#xff09;和笔记&#xff08;1&#xff09;&#xff0c;我们介绍了算法的基本含义&#xff0c;并且举了一些实例&#xff0c;同时理解了&#xff0c;算法就是人类在教计算机做事情&#xff01; 我们知道&#xff0c;算法就是解决问题的方案…

【计算机系统设计】实践笔记(5)改进数据通路:beq和bne指令分析与实现

接下来的分析和实践非常粗糙&#xff0c;因为跟之前一样的分析流程&#xff0c;不再多说了&#xff0c;如果前面真的掌握&#xff0c;这里不看也罢。 分析 先看beq指令。 ALU输入的是rs和rt&#xff0c;不输入imm&#xff0c;进行subu操作&#xff0c;判断是否为zero&#x…

【算法】学习笔记(4):分治思想 归并排序

分治思想&#xff0c;分治策略&#xff0c;自古有之&#xff0c;与人类生活息息相关&#xff0c;其本质是将大问题拆解为小问题&#xff0c;小问题转换为已知解的问题&#xff0c;进而求解。 军队管理&#xff0c;国家分级治理…… 大规模数据排序&#xff0c;例如10000000000…

html css 学习笔记(1)背景相关

背景颜色 图片 插入图片img背景图片 背景图片 3. logo 4. 大图 5. 装饰性小图 便于控制位置&#xff01; 插入后会执行自动平铺&#xff0c;这与插入图片是不同的&#xff01; div{width: 600px;height: 300px;background-image: url(img/登录用户头像.png); }小结 盒子的第…

2020-12-15 CPU设计复盘

SOC修改 将之前完成的31条指令单周期CPU进行了重构&#xff0c;将其分开&#xff0c;实现了内外有别&#xff0c;将CPU、指令ROM和数据RAM。 这样&#xff0c;以后为其增加接口外设&#xff0c;总线控制&#xff0c;才更加清晰&#xff0c;这是进一步封装和抽象。 MARS大坑 …

Tomcat 学习笔记(0)

JavaWeb 用Java写的程序&#xff0c;可以在浏览器运行。 Request & Responce Web资源 Web服务器 我们在自己的主机启动Tomcat服务器&#xff0c;然后运行它&#xff0c;就能够通过主机访问这个服务器&#xff0c;这个服务器能够运行我们的程序。 部署Web工程 法1 将web…