CPU可以分成几个部分,不同的设计方案有不同的分割方式,在经典的五级流水线中被分割成取指、译码、执行、访存和写回五级。
首先是取指。取指就是从指令内存中读取出CPU要执行的指令。计算机的指令是由0和1组成的。比如说00000000000100010000000110110011这个指令的意思是把寄存器x1与x2的数相加后的值放入寄存器x3中。不同的指令集的指令都不相同,这个是RISC-V架构指令。就像这样的指令一条接一条占满了内存。那么我们要想从内存中读出这些指令肯定不能随便读,我们需要一个像书签一样的东西告诉我们读到哪里了,这个东西被称作程序计数器PC(program counter)。我们就根据PC值作为地址去访问内存,每访问完一次内存就把PC值往下加,让PC值始终指向我们接下去要读的位置。
这边所指的内存是指令内存,此外还有数据内存。顾名思义,指令内存中存储的是指令,数据内存中存储的是数据。比如打开相册,相册作为一个程序是在指令内存中被读取出来的,而相册中的图片则是在数据内存中被读取。这个只是个比喻,真实情况应该不是这样的。而对于单片机等计算机,这两种内存是分开的;对于手机电脑等大多数设备这两种内存是被承载在同一个物理内存上的,但是其内涵还是有区别的。这边所说的是内存,要与处理器的缓存和硬盘区分开。
接着是译码。我们需要把像上面那样的指令翻译成电路实际操作的控制信号,控制数据的走向完成指令所要求的任务。比如说这个指令是个加法指令,那么我就要把数据往加法器那儿领,而不是把数据送向减法器。而这个起向导作用的就是译码完的控制信号。
译码单元(部分)
再是执行。基础的RISC-V的架构中有加、减、与、或、移位、比大小等操作。所谓执行就是算出结果。这边说说移位是什么,移位就是把数字扩大或缩小2的整数次方倍,在二进制中看起来就是数字往高位或低位移动了几位。这里拿十进制数字举例。例如2048000缩小1000(10的3次方)倍,那就变为了2048,看起来就像数字向右移了三位。
执行单元
然后是访存。这里的存指的就是数据内存了。访存既可以是访(读取)也可以是存(写入)。同样的我们要知道我们要访哪或者存哪,因此我们还是需要一个书签,但是不同于前面的PC,我们需要在一个相对集中却又不一定按顺序的地方读取数据。这里应该很好理解,我们编程的时候是按顺序编辑的(程序不一定按顺序执行,程序也可以进行跳转,但大部分情况按顺序执行),但是我们的文件可是随便哪读随便哪写的,甚至可能没有一点顺序可言。因此我们需要一个相对灵活的书签。这个书签被称作基地址,我们想访存的地址与基地址的差值被称作偏移量。基地址加上偏移量就是我们想要的目标地址了,基地址相对固定,偏移量由指令给出,这样我们就可以灵活的进行访存了。
访存单元
最后是写回。当指令进行完了之后,我们需要把最后的结果写回寄存器组,把结果记录下来。有些指令可能没有什么要写回的,比如储存某个数到内存这样的指令就没什么要写回的,那就忽略这一级流水线(走个过场)就行了。这个图很零散,就不放上来了。