fpga_feixiang 发表于 2020-11-23 14:24:13

CPU的工作流程

常见的CPU内部有5级流水线组成。cpu的工作大致分为以下几个步骤;
https://img-blog.csdnimg.cn/20200421103047692.png
1:取指。该阶段从内存中读取指令,PC(程序计数器)制定指令的地址。
2:译码。该阶段将从内存读取的指令翻译为各种操作。并从寄存器中取出操作数。
3:执行。该阶段算数逻辑单元执行指令表示的操作。
4:访存。该阶段将结果数据写入到内存中。
5:写回。将结果写会到寄存器文件中。
(1)取指令(IF)
CPU在取指令阶段(IF阶段)时,先向一级指令缓存要指令,要到指令后我们将程序计数器(PC)自增1(1表示移动一条指令的宽度,如果数据单位是32位,那么就自增1,如果数据单位是8位1字节,那么就自增4)。这样我们在下次取指令的时候就能取到下一条指令了。同时如果你实现了分支预测,那么在这里则需要做另外的处理。
(2)解码(ID)
注意到我们有这些指令对:add和addi,addu和addui,or和ori等,这些指令对的功能是一样的,只是取操作数的方式不一样,如果我们能用某种方式统一这些指令对,那么我们在实现这些指令的执行将会变得更简单,因为对于同一类的指令我们能做同一个操作。解码器就是做这个事情的。

CPU在解码阶段(ID阶段)时还需要根据解码器得到的操作数寄存器的编号,从相应的寄存器中取出ALU所需要的操作数,因此我们也将寄存器归到解码阶段中。
(3)执行(EX)
执行阶段(EX阶段)是我们调用ALU进行真正的计算过程。由于乘法和除法的速度比较慢,如果1个周期能完成加法的计算,那么乘法和除法就需要超过1个周期的时间,也就是说乘法器和除法器在多周期CPU里是多周期的。同时,所有的浮点运算也都是多周期的,比如浮点加是4个周期(另外在浮点运算单元中同样存在流水线,把浮点加法分成4个阶段计算)。

同时对于syscall指令,我们也要在执行阶段完成操作。

因此执行阶段CPU一共会有以下执行模块,分别是ALU、整数的乘除运算单元、浮点运算单元(内部仍存在流水线,而且加减法和乘除法可以并行执行)和其他的一些处理电路。
【ALU】
ALU在执行阶段将会按照给定的ALU的微指令,对两个操作数进行运算(无论是加减运算、位运算、比较运算以及跳转指令需要的比较运算),并得到结果输出(输出包括运算结果、是否跳转等信息)。对于内存操作的指令,我们也需要ALU计算出我们要读取的内存的真实地址(因为指令规范中给定的是某个寄存器的偏移,或者当前指令的偏移)。
(4)内存读写(MEM)
对于lb、lbu、lh、lhu、lw、sb、sbu、sh、shu、sw等内存操作的指令,这个阶段将被启用。这个阶段将会与一级的数据缓存交互。
(5)寄存器写(WB)
这个阶段(WB阶段)有结果的指令将会把数据存到对应的寄存器里。

在CPU的工作流程中,首先读取PC(程序计数器)指向的地址的指令,送入到译码模块,译码器对opcode指令进行译码,经过译码之后得到指令需要的操作数寄存器索引,可以使用此索引从通用寄存器组(Register File,Regfile)中将操作数读出。指令译码之后所需要进行的计算类型都已得知,并且已经从通用寄存器组中读取出了所需的操作数,那么接下来便进行指令执行。指令执行是指对指令进行真正运算的过程。譬如,如果指令是一条加法运算指令,则对操作数进行加法操作;如果是减法运算指令,则进行减法操作。

zhangyukun 发表于 2020-11-23 14:51:52

CPU的工作流程

zxopenhl 发表于 2020-11-26 10:35:47

CPU的工作流程
页: [1]
查看完整版本: CPU的工作流程