云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > MIPS流水线CPU的verilog实现 - 图文

MIPS流水线CPU的verilog实现 - 图文

  • 62 次阅读
  • 3 次下载
  • 2025/6/16 12:49:33

图3.5 一阶数据相关实例图

如前所述,or指令在第五时钟周期向sub指令结果发出请求时,sub指令的结果已经产生。所以,我们同样采用“转发”,即通过MEM/WB流水线寄存器,将sub指令结果转发给or指令,而不需要先写回寄存器堆。如图3.5中虚线所示。转发数据为RegWriteData_wb

转发条件:

① WB级指令是写操作,即RegWrite_wb=1;

② WB级指令写回的目标寄存器不是$0,即RegWriteAddr_wb≠0;

③ WB级指令写回的目标寄存器与在EX级指令的源寄存器是同一寄存器,即

RegWriteAddr_wb=RsAddr_ex 或 RegWriteAddr_wb=RtAddr_ex; ④ EX冒险不成立,即RegWriteAddr_mem≠RsAddr_ex 或

RegWriteAddr_mem=RtAddr_ex。

(3)三阶数据相关与转发

最后讨论sub指令与add指令之间的相关问题。

sub指令与add指令在第五时钟周期内同时读写同一个寄存器。这类同一周期内同时读写同一个寄存器的数据相关称之为三阶数据相关。如图3.6中实线所示。

图3.6 三阶数据相关实例图

假设寄存器的写操作发生在时钟周期的上升沿,而读操作发生在时钟周期的下降沿,那么读操作将读取到最新写入的内容。在这种假设条件下将不会发生数据冒险。这就要求流水线中的寄存器具有“先写后读(Read After Write)”的特性。

这类“写操作发生在时钟周期的上升沿,读操作发生在时钟周期的下降沿”的寄存器虽然在理论上是可实现的,但是不适合应用于同步系统,因为它不但影响系统的运行速度,而且影响系统的稳定性,是不可取的。

因此,我们采用“转发”机制来解决三阶数据相关冒险。该部分转发电路我们放在寄存器堆的设计中完成。如图3.6中虚线所示。转发数据为RegWriteData_wb。

转发条件为:

5

① WB级指令是写操作,即RegWrite_wb=1;

② WB级指令写回的目标寄存器不是$0,即RegWriteAddr_wb≠0;

③ WB级指令写回的目标寄存器与在ID级指令的源寄存器是同一寄存器,即

RegWriteAddr_wb=RsAddr_id 或 RegWriteAddr_wb=RtAddr_id。

2.2)数据冒险与阻塞

当一条指令试图读取一个寄存器,而它前一条指令是lw指令,并且该lw指令写入的是同一个寄存器时,定向转发的方法就无法解决问题。如图3.7所示

注意到lw指令只能在第 四时钟周期从内存中读 出数据,因此它和紧随其 后的and指令之间的依 赖关系与时序方向是相 反的,这种冒险是无法通 过转发来实现的。 图3.7 数据冒险与阻塞实例图 这类冒险不同于数据相关冒险,需要单独一个“冒险检测单元(Hazard Detector)”,它在ID级完成。

冒险成立的条件为:

① 上一条指令是lw指令,即MemRead_ex=1;

② 在EX级的lw指令与在ID级的指令读写的是同一个寄存器,即

RegWriteAddr_ex=RsAddr_id 或 RegWriteAddr_ex=RtAddr_id。

冒险的解决:

为解决数据冒险,我们引入流水线阻塞。当Hazard Detector检测到冒险条件成立时,在lw指令和下一条指令之间插入阻塞,即流水线气泡(bubble),使后一条指令延迟一个时钟周期执行,这样就将该冒险转化为二阶数据相关,可用转发解决。如图3.8所示。

6

图3.8 流水线气泡的引入

需要注意的是,如果处于ID级的指令被阻塞,那么处于IF级的指令也必须阻塞,否则,处于ID级的指令就会丢失。防止这两条指令继续执行的方法是:保持PC寄存器和IF/ID流水线寄存器不变,同时插入一个流水线气泡。

具体实现方法如下:

在ID级检测到冒险条件时, HazardDetector输出两个信号:Stall与PC_IFWrite。

Stall信号将ID/EX流水线寄存器中的EX、MEM和WB级控制信号全部清零。这些信号传递到流水线后面的各级,由于控制信号均为零,所以不会对任何寄存器和存储器进行写操作,高电平有效。

PC_IFWrite信号禁止PC寄存器和IF/ID流水线寄存器接收新数据,低电平有效。

2.3)分支冒险

还有一类冒险是包含分支的流水线冒险,下图。

7

图3.10 分支冒险实例

流水线每个时钟周期都得取指令才能维持运行,但分支指令必须等到MEM级才能确定是否执行分支。这种为了确定预取正确的指令而导致的延迟叫做控制冒险或分支冒险。

一种比较普遍的提高分支阻塞速度的方法是假设分支不发生,并继续执行顺序的指令流。如果分支发生的话,就丢弃已经预取并译码的指令,指令的执行沿着分支目标继续。由于分支指令直到MEM级才能确定下一条指令的PC,这就意味着为了丢弃指令必须将流水线中的IF、ID和EX级的指令都清除掉(flush)。这种优化方法的代价较大,效率较低。

如果我们能在流水线中提前分支指令的执行过程,那么就能减少需要清除的指令数。这是一种提高分支效率的方法,降低了执行分支的代价。

因此我们采用提前分支指令的方法解决分支冒险。 提前分支指令需要提前完成两个操作: ① 计算分支的目的地址:

由于已经有了PC值和IF/ID流水线寄存器中的指令值,所以可以很方便地将EX级的分支地址计算电路移到ID级。我们针对所有指令都执行分支地址的计算过程,但只有在需要它的时候才会用到。

② 判断分支指令的跳转条件:

我们将用于判断分支指令成立的Zero信号检测电路(Z test )从ALU中独立出来,并将它从EX级提前至ID级。具体的设计将在ID级设计中介绍。

在提前完成以上两个操作之外,我们还需丢弃IF级的指令。具体做法是:加入一个控制信号IF_flush,做为IF/ID流水线寄存器的清零信号。当分支冒险成立,即Z=1,则IF_flush=1,否则IF_flush=0,故IF_flush = Z。

考虑到本系统还要实现的无条件跳转指令:J和JR,在执行这两个指令时也必须要对IF/ID流水线寄存器进行清空,因此, IF_flush的表达式应表示为:

IF_flush = Z || J || JR。

8

搜索更多关于: MIPS流水线CPU的verilog实现 - 图文 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

图3.5 一阶数据相关实例图 如前所述,or指令在第五时钟周期向sub指令结果发出请求时,sub指令的结果已经产生。所以,我们同样采用“转发”,即通过MEM/WB流水线寄存器,将sub指令结果转发给or指令,而不需要先写回寄存器堆。如图3.5中虚线所示。转发数据为RegWriteData_wb 转发条件: ① WB级指令是写操作,即RegWrite_wb=1; ② WB级指令写回的目标寄存器不是$0,即RegWriteAddr_wb≠0; ③ WB级指令写回的目标寄存器与在EX级指令的源寄存器是同一寄存器,即RegWriteAddr_wb=RsAddr_ex 或 RegWriteAddr_wb=RtAddr_ex; ④ EX冒险不成立,即RegWriteAddr_mem

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com