处理器流水线——时空图作图原理

一、基础知识

1、每个阶段的含义

a3a89f843e3b41f1ac15f8c12dc0ad52.png

f2f7e08e5b084d7ea70f25947dc54b8d.png

 2、为何要产生阻塞

ce0e15346ad949ddbf6391ed9cc708af.png

上一条需要写寄存器指令的目的寄存器与当前指令的源寄存器相同,使得当前指令需要用到上一条指令的结果,若顺序执行,由于上一条指令还未写入寄存器,使得本条指令源寄存器中的数据不是正确的,那么EX阶段得到的结果也是错误的,所以为了得到正确的数据,不得不等待上一条指令将结果写回到目的寄存器中或者可能需要等待旁路得到正确指令。即产生阻塞。

无转发和有转发的区别

无转发不能在中间过程得到所需的数据。只能等待上一条指令的WB阶段执行时,才能同时执行ID阶段。(一个时钟周期内,前半个时钟周期WB先写入寄存器,后半个时钟周期ID读取寄存器,先写后读,各占一半,所以WB和ID可以同时进行,ID可以取到正确的数据)

有转发可以在中间阶段从流水线寄存器组里通过旁路得到所需要的数据。只要流水线寄存器组内有了需要的值即可。

33cc7f695df54e7cb40d49365db9a720.png

3、何时才能产生阻塞

        要得知是否产生阻塞,则需要得知上一条指令是什么,以及当前指令是什么(因为只有Write after Read才可能阻塞)。而得知指令具体是什么,在IF阶段(通过PC中的指令地址在指令存储器中取指令)是不能得知的,只能在ID阶段(指令译码和读寄存器堆)进行译码才能得知当前指令与上一条指令是否需要产生阻塞。

所以即使是如下指令:

lw $t0,200($s0)

add $t1,$t0,$s1

在lw进行ID阶段时,add指令也一定会执行IF阶段,因为此时是不知道是否产生阻塞的。

指令执行情况:

db6f7b2fba674dd19601fa0d9b42a61c.png

4、产生阻塞的条件

ee777a48c4c640aa9178efb529039f78.png

对于每一条指令,对应阶段的流水线寄存器会保存该指令的数据和控制信号。

9e41dae4dbc54bfe9c9e851b7b046e88.png

(1)无转发(无旁路):

第一种情况:只能等待上一条指令的结果写回寄存器

①ID/EX.RegWrite=1//上一条是写寄存器的指令,包括lw和add等

②上一条写指令的目的寄存器与当前源寄存器冲突

第二种情况:间隔阻塞

lw $t1,2304($t0)

sub $0,$s3,$t2

add $s1,$t1,$0//t1必须等第一条lw的t1取回才行。

(2)有转发

①ID/EX.MemRead=1  //上一条指令是存储器读指令,即lw指令

②ID / EX.RegisterRt = IF/ID. RegisterRs or
ID/ EX.RegisterRt = IF/ IDRegisterRt  //上一条指令的目的寄存器和本条指令的源寄存器相同
2c1255f9dced4addb2ea5e693441a447.png

5、产生阻塞的流程以及后续情况

基本认知:

当流水线发生阻塞时,阻塞的流水线寄存器和PC保持数据不变,直到可以执行时才开始顺序执行,即当前指令发生阻塞,同样表现为以后的指令阻塞。阻塞是通过产生空指令实现的,而锁定不变的部分,但是同样会往前执行,只是锁定的内容不再更改。

因为是顺序执行的,当前指令在执行当前阶段时,下一条指令只可能执行上一阶段。

如(随便举个例子,不用考虑实际第一条指令和第二条指令为什么是这样的):

cbbd7d2aecf34a92aab7cfa570140899.png

c4677eb40c0a4b7282843cbc9c79b9f3.png

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

无转发:若上一条指令是写寄存器指令,由于不能通过旁路得到正确数据,则必须从寄存器里取得,所以当前指令的ID阶段 必须等到 上一条指令的WB阶段时才能执行。

当前指令地址给PC,PC经过IF,数据存入IF/ID,PC=PC+4;继续执行到ID译码,发现前一条写指令的目的寄存器和当前指令的源寄存器相同,锁定PC和IF/ID保持不变,对ID阶段的控制清0(这些控制信号在每个时钟周期都向前传递, 但不会产生不良后果,因为如果控制信号都是0, 那么所有寄存器和存储器都不进行写操作,相当于只是推迟ID的执行),直到上一条指令执行到WB,解锁PC和IF/ID,不再清0控制。

A:lw $t0,200($s0)

B: add $t1,$t0,$s1

C:addi $t1,$t1,2304

D:sub  $s1,$s2,$s3

057d960bc5d7460fa86c9a8a46ccfda7.png

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

38b14ee8206d4809baa3f8eb4e1e3bd6.png

有转发

当前指令地址给PC,PC经过IF到IF/ID,PC=PC+4(下一条指令地址给PC),继续执行到ID译码(并且同时进行的IF阶段),发现前一条指令的目的寄存器和当前指令的源寄存器相同,锁定PC和IF/ID保持不变,此时并不需要对ID阶段的控制清0,因为我们只用在EX阶段取到正确的值即可,这个值可来源于旁路。所以只对EX阶段的控制清0,这样ID实际上是执行了的(锁定ID/EX实际上也行,不锁定也行),因为IF/ID的数据一直在往前送,直到上一条指令执行完MEM,解锁PC和IF/ID,不再清0控制,再一起往前运行。

f8cda6df5caf4e7187fed172646e206f.png

A:lw $t0,200($s0)

B: add $t1,$t0,$s1

C:addi $t1,$t1,2304

799dbe9465674bd3bf8f64a62b271804.png

6、特殊情况

①取最近旁路的值

两种旁路,第一种答案可从EX/MEM中取得,第二种答案可从MEM/WB中取得。

情况:

一个指令的两个源寄存器分别是上两个指令的目的寄存器。如:

add $s0,$t0,$t1

add $t1,$t2,$t0

add $s1,$s0,$t1

这时,当第三条add到ALU输入时,第二条已经ALU运算完了,结果在EX/MEM里可以取出,第一条已经到MEM/WB里,可以取出

一个指令的一个源寄存器是上两个指令的目的寄存器。如:

add $t1,$t0,$t1

add $t1,$t2,$t0

add $s1,$s0,$t1

这时第二条已经ALU运算完了,结果在EX/MEM里可以取出,第一条已经到MEM/WB里,可以取出,但是第三条需要的t1是最新的t1也就是第二条指令里面的t1,所以它需要从最新的EX/MEM中取出。阻断MEM/WB的。

一个指令的一个源寄存器是上一个指令的目的寄存器或者是上上一个指令的目的寄存器。

②$0寄存器不接受旁路

add $0,$t1,$t2

add $t3,$0,$t1

        上一条指令的目的寄存器为$zero不接受旁路。并不是$zero的值被修改了,实际上零号寄存器的值没有被修改。上一条指令的ALU的计算结果放在了EX/MEM流水线寄存器组里面,这个时候的结果并没有传给$zero,而此时目的寄存器实实在在确实是$zero,也就是说,它会误认为现在EX/MEM流水线寄存器组里面的值就是需要的结果值,也就ID/EX.RS=EX/MEM.Rd成立,所以会把结果值通过旁路拿出来,但实际上$zero还是那个zero。这种命令它只判断目的寄存器是否为源寄存器,然后把流水线的值转发给ALU,这个流水线的值实际上并不是目的寄存器的现有值。实际上需要在旁路的判断条件上加上EX/MEM.Rd≠$zero,所以$0寄存器不接受旁路,而直接采用当前值。

二、具体问题分析

580b8626168b4206b3ebb1baf3ee901b.png

无转发

a740279fc35845d58a981d41c9f68c21.png

无转发,ID必须等到上一条指令写回才能运行。所以遇到写指令的目的寄存器和源寄存器相同,就得将ID推迟到上一条指令的WB。

e2d087b6bca6468d9b7e88efcd2ed5f5.png

有转发

7c0bc354f7bb41d2aaff879374bfed5f.png

fd25fab0bfff466c82127690fc74a7fb.png

  • 14
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yorelee.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值