文章是在我遇到这部分问题时查找的所有感觉挺好的内容的整合(全部是转载的)
流水线基础理论就不加了,最新的处理器流水线处理的机制也没有(一般以用不到),想了解去随便找个芯片厂商官网下个手册自己查。
这部分学习呢,包括整个计算机组成原理的学习我认为别太较真,因为计算机的各个部件有很多厂商也就有了很多标准,所以掌握理论就行。
下文也有挺多地方是不严谨的,不同指令集不同的操作方式,不同芯片也有不同的操作方式(不过芯片也是和指令集统一的.......),反正下面的文章中是针对某个指令集的,了解思想就行。
想要实现流水线CPU内部总线必须是多条的,共用的!!!!!
一条经典的5段流水线
一条指令的执行过程分为以下5个周期:
取指令周期(IF)
指令译码/读寄存器周期(ID)
执行/有效地址计算周期(EX)
存储器访问/分支完成周期(MEM)
写回周期(WB)
流水线冲突和相关的链接:
体系结构 | 流水线 | 流水线相关 | 流水线冲突
一条经典的5段流水线
- 介绍一条经典的5段RISC流水线
- 每一个周期作为一个流水段;
- 在各段之间加上锁存器(流水寄存器)。
一条指令的执行过程分为以下5个周期:
以程序计数器PC中的内容作为地址,从存储器中取出指令并放入指令寄存器IR;
同时PC值加4(假设每条指令占4个字节),指向顺序的下一条指令。
对指令进行译码,并用IR中的寄存器地址去访问通用寄存器组,读出所需的操作数。
不同指令所进行的操作不同:
load和store指令:ALU把指令中所指定的寄存器的内容与偏移量相加,形成访存有效地址。
寄存器-寄存器ALU指令:ALU按照操作码指定的操作对从通用寄存器组中读出的数据进行运算。
寄存器-立即数ALU指令:ALU按照操作码指定的操作对从通用寄存器组中读出的操作数和指令中给出的立即数进行运算。
分支指令:ALU把指令中给出的偏移量与PC值相加,形成转移目标的地址。同时,对在前一个周期读出的操作数进行判断,确定分支是否成功。
该周期处理的指令只有load、store和分支指令。
其它类型的指令在此周期不做任何操作。
- load和store指令
load指令:用上一个周期计算出的有效地址从存储器中读出相应的数据;
store指令:把指定的数据写入这个有效地址所指出的存储器单元。
- 分支指令
分支“成功”,就把转移目标地址送入PC。
分支指令执行完成。
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
----------------------------------------------------
https://blog.csdn.net/qq_35260622/article/details/51657165?utm_medium=distribute.pc_relevant.none-task-blog-title-6&spm=1001.2101.3001.4242
----------------------------------------------