你了解CPU吗?(二)

本文详细介绍了RISC-V指令集的实现,包括ALU控制、主控制单元设计和数据通路操作。通过分析指令格式和操作码,阐述了如何根据输入字段生成ALU控制信号,并展示了R型、加载、存储和条件分支指令在数据通路中的执行步骤。此外,还讨论了控制单元的实现及其优化,指出单周期实现的局限性。
摘要由CSDN通过智能技术生成

1.写在前面

上一篇博客我们简单的介绍了如何CPU的一些核心的指令集,这节博客我们继续讲剩下的部分。

2.一个简单的实现方案

2.1ALU的控制

下图定义了四根输入控制线的以下四种组合:

在这里插入图片描述

根据不同的指令类型,ALU嘘执行以上四种功能的中的一种。对于load和store指令,ALU做加法计算存储地址。对于R型指令,根据指令的7位funct7字段和3位funct3字段,ALU需执行四种操作(与、或、加、减)中的一种,对于条件分支指令,ALU将两个操作数做减法(本质还是作差法)并检测结果是否为0。

4位ALU的输入控制信号可由一个小型控制单元产生,其输入是指令的funct7和funct3字段以及2位的ALUOP字段,ALUOP指明要执行的操作是load和store指令要做的加法(00),还是beq指令要做的减法并检测是否0(01)或是由funct7和funct3字段决定(10),该控制单元输出一个4位信号,即前面介绍的4位组合之一来控制ALU。

下图说明如何根据指令小红的2位ALUOP控制字段、funct7和funct3字段设置ALU的输入控制信号。

在这里插入图片描述

这种多级译码的方式—主控制单元生成ALUOp位用作ALU的控制信号,再生成实际信号来控制ALU----是一种常见的实现方式。多级控制可以减少主控制单元的规模。多个小的控制单元可能潜在地减少控制单元的延迟。这样的优化很重要,因为控制单元的延迟是决定时钟周期的关键因素。

有几种不同的方法把2位ALUOp字段和funct字段映射到四位ALU输入控制信号。由于只有少数funct字段有意义,并且仅在ALUOp位等于10时才使用funct字段,因为可以使用一个小逻辑单元来识别可能的取值并生成恰当的ALU控制信号。

为设计这个逻辑单元,有必要为funct字段和ALUOp信号的有意义组合生成一张真值表。

在这里插入图片描述

上边给出了如何根据这些输入字段设置4位ALU输入控制信号。由于完整真值表非常大,我们并不关心所有的输入组合,所以只列出了使ALU控制信号有值的部分表项。

在很多情况下不关心某些输入的取值,为了简化真值表,我们也列出无关项。真值表中的无关项(在输入列中用X表示)表明输出不依赖于与该列对应的输入。

2.2设计主控制单元

前面我们已经描述了如何使用操作码和2位信号作为输入进行ALU控制单元的设计,现在考虑控制的其他的部分。我们主要看四类指令的的格式:算术、载入、存储和条件分支指令。

RISC-V指令格式遵循以下规则:

  • 操作码字段总是0~6位。根据操作码,funct3字段和funct7字段作为扩展的操作码字段
  • 对于R型指令和分支指令,第一个寄存器操作数时钟在15~19位。该字段也可用来定义载入和存储指令的基址寄存器。
  • 对于R型指令和分支指令,第二个寄存器操作数始终在20~24位。该字段也可用来定义载入和存储指令中的寄存器,该寄存器保存了写入存储器的操作数。
  • 对于分支指令、载入指令和存储指令,另一个操作数可以是12位立即数。
  • 对于R型指令和载入指令,目标寄存器始终在7~11位。

在这里插入图片描述

然后我们就可以得到如下的设计图,具体的如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.3数据通路操作

我们要知道每天指令是如何使用数据通路的。接下来的几张图说明了三类不同指令在数据通路中的流动。有效的控制信号和数据通路单元已标出。请注意,多选择器在控制信号为0时也有对应的动作,及时其控制信号没有着重标出。对于多位信号,只要其中任何信号有效,就着重标出。

我们先看R型指令的数据通路操作,例如add x1,x2,x3。虽然所有操作都发生在一个时钟周期内,但我们认为执行该指令分为四个步骤,这些步骤按照信息的流动排序:

  1. 取出指令,PC自增。
  2. 从寄存器堆读出两个寄存器x2和x3,同时主控制单元在此步骤计算控制信息。
  3. 根据部分操作码确定ALU的功能,对从寄存器堆读出的数据进行操作。
  4. 将ALU的结果写入寄存器堆汇总的目标寄存器(x1)

在这里插入图片描述

例如:ld x1,offset(x2),可将load指令执行分为五个步骤:

  1. 从指令存储器中取出指令,PC自增
  2. 从寄存器堆读出寄存器x2的值
  3. ALU将从寄存器堆中读出的值和符号扩展后的指令中的12位(偏移量)相加
  4. 将ALU的结果用作数据存储器的地址。
  5. 将从存储器读出的数据写入寄存器堆(x1)

在这里插入图片描述

最后例如:beq x1,x2,offset指令,执行的步骤如下:

  1. 从指令存储器中取出指令,PC自增
  2. 从寄存器堆中读出两个寄存器x1和x2
  3. ALU将从寄存器堆对出的两数相减。PC与左移一位、符号扩展的指令中的12位(偏移)相加,结果是分支目标地址。
  4. ALU的零输出决定将哪个加法器的结果写入PC。

在这里插入图片描述

2.4控制的结束

我们已经了解了指令如何按步骤操作,现在继续讨论控制单元的实现。控制单元的功能可根据前面的内容进行定义,其输出时控制线,输入是几位操作码。因此,可以根据操作码的二进制编码为每个输出建立一个真值表。

将控制单元的逻辑定义为一个大的真直表,它将所有输出与输入组合在一次,输入为操作码,并且完整地描述了控制单元的功能,可以自动地转换为门电路实现。

2.5为什么现在不使用单周期实现

单周期的效率太低。在单周期设计中时钟周期对于每条指令必须等长。这样,处理器中的最长路径决定了时钟周期。这条路径很可能是一条load指令,它连续的使用5个功能单元:指令存储器、寄存器堆、ALU、数据存储器和寄存器堆。早期具有简单指令集的计算机确实采用这种实现方式。但是,如果要实现浮点单元或更复杂的指令集,单周期设计根本无法正常工作。

在这里插入图片描述

由于时钟周期必须满足所有指令中最坏的情况,所以不能使用哪些缩短常用指令执行时间而不改变最坏情况的实现技术。

3.写在最后

这篇博客主要简单的介绍了下指令集的一种的简单的设计方案。下节博客我们要介绍CPU的流水线的操作了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值