从零开始写riscv处理器(六)控制冒险:流水线冲刷

1. 控制冒险

1.1 定义

控制冒险:也叫分支冒险,决策依赖于一条指令的结果,而其他指令正在执行中。比如说分支跳转指令,必须等ALU给出结果后才知道该跳转到哪一条语句。

1.2 引例

按照已有的硬件设计,分支指令在EX阶段决定是否跳转,分支指令后续的两条指令都将被取值并且开始执行。如果不进行干预,这两条条后续指令会在 beq 指令跳转之前就开始执行,这样就是我们不期望的。
所以,在BEQ指令的EX阶段,后两条指令分别进入取指和译码阶段,如果要跳转,则需要将后两条指令清理掉,否则放任两条指令继续执行会改变寄存器的值从而导致错误的结果,这就是后面要讲的流水线冲刷机制。

2. 流水线冲刷

将前两级流水线寄存器冲刷掉可以通过插入nop指令(气泡)来实现,当BEQ指令的EX阶段判断要跳转时,给IF_ID、ID_EX流水线寄存器一个clear信号,使得它们在下一周期输出为0。同时,也要将ID_EX流水线寄存器中的控制信号清零。为便于理解,以下链接是流水线冲刷机制的动画示意图(求赞aaa)。
流水线冲刷机制动画_哔哩哔哩_bilibili

3. 流水线冲刷的硬件实现

3.1 多路选择器

为清除ID_EX阶段的控制信号,在控制信号的产生路径上添加一个二选一多选器如图所示,多选器选择信号为1时,多选器输出为0达到清除控制信号的目的。

3.2 跳转控制单元

跳转控制单元输入为jump信号,即跳转指令发生信号;输出有PC_sel、IF_ID_clear、ID_EX_clear、Ctrl_clear,分别是PC跳转地址选择信号,IF_ID流水线寄存器清空信号、ID_EX流水线寄存器清空信号、主控单元清空信号。

将这几个单元添加进已有的硬件架构中如下图所示:

至此,RISCV处理器核基础版本已全部实现,得到最终的硬件架构图如下图所示:

建议将代码搭配最终硬件架构图食用效果更佳hhh
终于整理得差不多了,挺累的,后续有空再继续更新….

来自广东

评论

  1. 蝈男
    iPad AppleWebKit
    5月前
    2023-10-08 17:32:19

    求更新

    来自四川
    • 博主
      蝈男
      Windows Edge
      5月前
      2023-10-10 9:21:38

      老师这就学完了?😡

      来自广东

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇