处理机流水线------经典五段流水线

文章是在我遇到这部分问题时查找的所有感觉挺好的内容的整合(全部是转载的)

流水线基础理论就不加了,最新的处理器流水线处理的机制也没有(一般以用不到),想了解去随便找个芯片厂商官网下个手册自己查。

 

这部分学习呢,包括整个计算机组成原理的学习我认为别太较真,因为计算机的各个部件有很多厂商也就有了很多标准,所以掌握理论就行。

下文也有挺多地方是不严谨的,不同指令集不同的操作方式,不同芯片也有不同的操作方式(不过芯片也是和指令集统一的.......),反正下面的文章中是针对某个指令集的,了解思想就行。

 

想要实现流水线CPU内部总线必须是多条的,共用的!!!!!

 

一条经典的5段流水线

一条指令的执行过程分为以下5个周期:

取指令周期(IF)

指令译码/读寄存器周期(ID)

执行/有效地址计算周期(EX)

存储器访问/分支完成周期(MEM)

写回周期(WB)


流水线冲突和相关的链接:

体系结构 | 流水线 | 流水线相关 | 流水线冲突

一条经典的5段流水线

  • 介绍一条经典的5段RISC流水线
  • 每一个周期作为一个流水段;
  • 在各段之间加上锁存器(流水寄存器)。 

一条指令的执行过程分为以下5个周期:

  • 取指令周期(IF)

以程序计数器PC中的内容作为地址,从存储器中取出指令并放入指令寄存器IR;

同时PC值加4(假设每条指令占4个字节),指向顺序的下一条指令。  

  • 指令译码/读寄存器周期(ID)

对指令进行译码,并用IR中的寄存器地址去访问通用寄存器组,读出所需的操作数。

  • 执行/有效地址计算周期(EX)

不同指令所进行的操作不同:

load和store指令:ALU把指令中所指定的寄存器的内容与偏移量相加,形成访存有效地址。

寄存器-寄存器ALU指令:ALU按照操作码指定的操作对从通用寄存器组中读出的数据进行运算。

寄存器-立即数ALU指令:ALU按照操作码指定的操作对从通用寄存器组中读出的操作数和指令中给出的立即数进行运算。

分支指令:ALU把指令中给出的偏移量与PC值相加,形成转移目标的地址。同时,对在前一个周期读出的操作数进行判断,确定分支是否成功。

  • 存储器访问/分支完成周期(MEM)

该周期处理的指令只有load、store和分支指令。

其它类型的指令在此周期不做任何操作。

  • loadstore指令

load指令:用上一个周期计算出的有效地址从存储器中读出相应的数据;

store指令:把指定的数据写入这个有效地址所指出的存储器单元。

  • 分支指令

分支“成功”,就把转移目标地址送入PC。

分支指令执行完成。

  • 写回周期(WB)

ALU运算指令和load指令在这个周期把结果数据写入通用寄存器组。

ALU运算指令:结果数据来自ALU。

load指令:结果数据来自存储器。

  • 在这个实现方案中:

分支指令需要4个时钟周期(如果把分支指令的执行    提前到ID周期,则只需要2个周期);

store指令需要4个周期;

其它指令需要5个周期才能完成。

 

https://blog.csdn.net/stone_fall/article/details/88414017#%E4%B8%80%E6%9D%A1%E7%BB%8F%E5%85%B8%E7%9A%845%E6%AE%B5%E6%B5%81%E6%B0%B4%E7%BA%BF

----------------------------------------------------

1

 

https://blog.csdn.net/qq_35260622/article/details/51657165?utm_medium=distribute.pc_relevant.none-task-blog-title-6&spm=1001.2101.3001.4242

----------------------------------------------

### RISC-V 架构五级流水线 CPU 的设计与实现 #### 1. 指令系统概述 RISC-V 是一种开源指令集架构 (ISA),其设计理念强调简单性和效率。RV32I 子集作为基础整数指令集,定义了一组精简而强大的指令用于基本运算操作[^1]。 #### 2. 单周期处理器设计 单周期处理器是最简单的处理器模型之一,在这种结构中每条指令在一个时钟周期内完成全部处理过程。然而,由于不同类型的指令所需时间差异较大,这使得整体性能受限于最慢的操作速度。因此,为了提高吞吐量和降低延迟,引入了多周期以及更先进的流水线技术来优化执行流程。 #### 3. ALU 的优化 算术逻辑单元(ALU)负责执行加法、减法和其他位操作等功能。对于支持多种功能的复杂 ALU 来说,可以通过分层模块化的方法构建,即先创建能够单独工作的组件再组合起来形成完整的电路;也可以利用查找表(LUTs) 或者专用硬件加速器等方式提升特定计算的速度[^4]。 #### 4. 数据通路设计 在五级流水线架构里,整个数据路径被划分为五个主要阶段:取指(IF), 解码(ID), 执行(EXE), 访存(MEM) 和写回(WB)[^5]。每个阶段都对应着不同的任务,并且这些任务可以在同一时刻针对多个指令并发进行,从而显著提高了系统的并行度和工作效率。 #### 5. 控制器设计 控制器决定了何时何地应该发生什么动作,它接收来自外部输入的信息并通过内部状态机产生相应的控制信号去驱动各个部件工作。具体来说就是根据当前正在被执行的指令类型及其所处的位置发出合适的命令给其他部分以便协调它们之间的交互活动[^6]。 #### 6. 处理各种冒险情况 当存在依赖关系时可能会引发所谓的“冒险”,比如前面一条指令的结果还没有准备好就被后面的指令读取到了(称为数据冒险);或者是条件跳转之类的分支语句造成了后续指令序列不确定性的增加(这是控制冒险的一种表现形式)[^7]。为了避免这些问题影响正常运作,通常会采取诸如插入气泡(bubble insertion)或者重新排序等措施来进行预防性管理。 #### 7. 分支预测机制 为了减少因等待分支决策而导致的时间浪费,可以提前猜测程序流的方向进而继续预取可能用得上的指令。如果最终证明最初的假设是对的话,则能节省不少开销;反之则需要做些额外的工作来回滚错误的状态改变。静态预测是一种较为简单的策略,它不依赖历史记录而是按照固定的模式做出决定,例如总是认为分支不会成功转向新的地址[^9]。 ```verilog // Verilog 实现的一个简化版分支预测器例子 module branch_predictor ( input wire clk, input wire rst_n, input wire pc_incr, output reg taken_pred ); always @(posedge clk or negedge rst_n) begin : predict_branch if (!rst_n) taken_pred <= 0; else // 这里的逻辑可以根据实际需求调整 taken_pred <= ~taken_pred && pc_incr; end endmodule ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值