多周期CPU设计

  1. 实验要求

在单周期CPU的基础上增加流水线寄存器,实现五级流水线CPU框架,使它能够执行一段没有数据冒险和控制冒险的程序。处理两种EXE级数据冒险。使实现的五级流水线CPU能够执行fibonacci程序。

  1. 实验过程
    1. 基本模块
      1. 不考虑冒险的流水线CPU

1实验思路

       想要实现流水线, 即将我们的单周期cpu 分成几个部分,每个部分在一个周期内执行,并将计算结果临时存入流水线寄存器, 等到下一拍使用这些值继续执行. 根据这样的思路,我们增加流水线寄存器,把数据通路分成五部分。

2具体实现

数据流图:

 

       1.定义流水线寄存器,并且将数据线接好.

       2. 在上升沿赋值

       3.波形分析

可以看到,同一条指令 所得到的数据在不同的周期,均正确存在了流水线寄存器中,  模块设计正确.

3遇到的问题及解决

实验中有遇到接线错误的情况. 后来通过仿真发现错误, 并改正. 这次流水线的接线才到达了数量的巅峰, 不仅要细心, 还要注意将数据线定义正确,意义清晰明了. 而我的做法,每个周期,每个流水线都有复杂的命名, 这样可以很好的区分, 不至于混乱不堪.

4实验反思及思考

1. 这次流水线的接线数量极多, 不仅要细心, 还要注意将数据线定义正确,意义清晰明了.2. 对我个人而言,实验中基本只会遇到两种问题, 一是线接错,二是控制逻辑写错导致错误. 然而对于第一种错误, 在这次实验中可以让我深刻体会到其后果, 我以后接线一定要细心再细心.

 

EXE级数据冒险

1实验思路

       数据冒险的根源是要用的寄存器值要被前三条指令写回, 而写回发生在WB阶段末,这样导致读出值可能是旧值, 从而发生数据冒险. 本次实验, 通过旁路技术解决此冒险. 而旁路的思想就是将后面EXE_MEM , MEM_WB 寄存器的值引一条数据线到EXE级来,在通过一定的选择手段, 让新值得到提前使用.

2具体实现

       1.增加选择器,并接好线.

       2. 书写旁路控制逻辑

       旁路的控制逻辑就是: 只需要判断要写回的地址是否和要使用的相同,并且写使能有效

对双重数据冒险的判断: 只需要先判断EXE_MEM级,后判断MEM_WB级即可,因为 EXE_MEM级是后发生的指令, 值更新.

       3. 具体的仿真分析

可以看到,需要旁路的指令可以成功判断并选择旁路执行.

3遇到的问题及解决

实验开始, 对旁路的控制逻辑理解不深, 尝试了很多方法, 也停了很多同学的思路, 他们将指令分成好多种情况, 后来我进过独立思考, 认为我们既然已经存了写回地址, 那么就只需要判断写回地址相同并且写使能有效即可. 后来将其实现, 认为正确.

4实验反思及思考

       对控制逻辑的理解要深刻, 简洁明了, 不需要的分类就不要分.

EXE级数据冒险(2)

1实验思路

       本次将通过阻塞来实现数据冒险的处理. 通过思考, 我认为, 需要使用ALU的数据冒险, 在新的周期旧的指令已经计算完, 所以只有读mem指令需要阻塞一个周期. 所以引入is_lw信号判断是否是lw指令, 并在需要使用的时候判断要写入的地址是否和需要用的数据的地址相同, 相同则阻塞,再下一个周期就可以通过旁路引入数据.

2具体实现

       1. 增加的控制判断逻辑:

       判断EXE_MEM级正在执行的指令是否是lw指令,如果是在判断地址,相同则将pc , IF_ID写使能, 和flush信号给出, 这样在下一个周期开始就可以阻塞.

       2. 波形分析:

可以看到, 在需要阻塞的周期, 阻塞信号成功给出, 再下一个周期成功发生阻塞.

3遇到的问题及解决

       本实验开始,对控制逻辑理解不深, 分了很多中情况, 最后在安静的时候进行深入思考, 发现只有lw需要阻塞, 故将判断逻辑简化, 最后成功实现.

4实验反思及思考

       在书写控制逻辑之前, 头脑一定要清晰, 想好再写, 不要写一大堆, 然而在执行的时候 却做了很多无用功.

EXE级数据冒险(3)

1实验思路

       由于写寄存器实在周期末才执行, 故前三条指令都有可能引起数据冒险. 本次实验, 如果是这样的情况, 有两种解决办法. 1.将写地址和写使能在MEM_WB阶段之后再存一次. (我最初的想法) 2. 将对旁路的判断提前一个周期, 经过对比发现, 这样就避免了多余的数据储存, 并且实现电路更加简单 .

2具体实现

      1. 增加的数据选择器:

       2. 增加的控制逻辑:

       3. 波形仿真:

观察到,在需要的周期, 此处的旁路控制信号正确给出, 旁路选择器输出值正确.

3遇到的问题及解决

       本次实验中, 有了前面几次的基础, 实验过程中仅遇到线接错的问题, 没有遇到控制逻辑的大问题, 在上课时就写出.

4实验反思及思考

       对控制逻辑的理解要深刻, 接线时, 要细心, 宁可将名称定义的更加清晰, 也不要混乱,这样很难找.

J, JR, JAL指令控制冒险

1实验思路

       我们在ID阶段对指令进行译码, 如果是J,JR,JAL指令, 此时这种跳转指令已经到ID阶段,而正常的pc+4所指向的指令(跳转指令的下一条)也已经写入pc, 即将再下一个周期写入IF_ID寄存器. 此时发现是这三种指令时, 正确的跳转地址已经算好, 并即将写入pc ,所以我们只需要阻止原本跳转指令的下一条指令执行即可. 即在下一个周期flushIF_ID寄存器.

2具体实现

 

       1. flush控制逻辑:

Flush的控制和is_J型相同(在此J包括J,JR,JAL)

而is_j的判断:

       2.波形分析:

可以看到,图中标出的J型指令,flush信号成功给出,在下一个周期,成功按照自己的设定将IF__IDflush成自己设定的值(必须设定成算出s_npc要指向pc+4的op和funct , 故不是零)

3遇到的问题及解决

       实验中, 对指令类型的判断所在的周期,和阻塞的周期一开始理解不深刻, 由于s_npc要在crrl单元给出, 但我们没有写nop的控制逻辑, 一开始初始化时s_npc指向了其他地方,导致了难以发现的错误, 最后flush时,不是设定为零,而设定成一种R型指令,但有没有具体的内容, 这样s_npc的信号也正确, 流水线能正确执行.

4实验反思及思考

       对不同的情况判断要理解清楚, 三种J型指令本质上控制逻辑相同,不需要再细分.

2.6 beq指令

1实验思路

       由于又引入了新的beq指令,beq只需要在zero(即gpr[rs]==gpr[rt])时才需要阻塞, 这样需要增加判断逻辑电路, 也需要将对zero的判断提前到id阶段,需要增加一个zero判断电路.

2具体实现

 

       1. zero判断:

       2.顶层模块接线的改变

3.控制逻辑的增加:

       4.波形分析:

       可以观察到,图中标注的beq指令, 判断需要阻塞后, 阻塞信号成功给出, IF_ID寄存器成功保持了一个周期.

3遇到的问题及解决

       一开始对beq具体的阻塞逻辑不理解, 将flush信号也给出, 但是此次阻塞只需要flush掉ID_EXE寄存器, 一开始导致错误,后来改正.

4实验反思及思考

       对控制逻辑的理解要深刻.

 

添加ID级数据冒险(1)

1实验思路

       由于将beq的判断提前到ID阶段, 故该阶段所需要的值也可能是前三条指令要写回寄存器的值, 所以在这里还要增加旁路来处理数据冒险. 此处还有一个问题, 就是如果beq前一条指令要写回的寄存器刚好要用, 此时alu的计算出结果需要在下一个周期才能正确获得(这个周期获得的不一定正确,因为组合逻辑的最长路径不确定,并不知道什么时候计算出正确结果,) 故这种情况必须阻塞一个周期, 让结果计算出来后, 通过旁路引入.

2具体实现

 

       1.增加的选择器:

       2.zero的判断:

       3. 控制逻辑的增加:

       4. 波形分析:

可以看到,这条beq指令成功发生阻塞, 并再下一个周期旁路回来正确的数值,完成判断.

3遇到的问题及解决

       本次实验开始, ,没有仔细思考, 写了老师发的MEM写数据端口的选择器. 然而后来经过思考,发现这样的旁路不需要, 这种情况仅对应先读MEM后写MEM的情况, 然而这种情况我们之前的旁路就可以解决, 故不需要.

4实验反思及思考

       要理解控制逻辑, 写代码一次写对.

3. 实验总结

1. 这次流水线的接线数量很多, 不仅要细心, 还要注意将数据线定义正确,意义清晰明了.2. 对我个人而言,实验中基本只会遇到两种问题, 一是线接错,二是控制逻辑写错导致错误. 然而对于第一种错误, 在这次实验中可以让我深刻体会到其后果, 我以后接线一定要细心再细心.

实验开始, 对旁路的控制逻辑理解不深, 尝试了很多方法, 也停了很多同学的思路, 他们将指令分成好多种情况, 后来我进过独立思考, 认为我们既然已经存了写回地址, 那么就只需要判断写回地址相同并且写使能有效即可. 后来将其实现, 认为正确.

对控制逻辑的理解要深刻, 简洁明了, 不需要的分类就不要分.在书写控制逻辑之前, 头脑一定要清晰, 想好再写, 不要写一大堆, 然而在执行的时候 却做了很多无用功.

  • 5
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值