计算机基础实战课
彭东
网名 LMOS,Intel 傲腾项目关键开发者
19719 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 57 讲
计算机基础实战课
15
15
1.0x
00:00/00:00
登录|注册

10|手写CPU(五):CPU流水线的写回模块如何实现?

你好,我是 LMOS。
今天我们一起来完成迷你 CPU 的最后一个部分——写回相关模块的设计(课程代码在这里)。
简单回顾一下,上节课我们完成了 CPU 流水线的访存相关模块的设计。在设计访存模块之前,我们发现流水线中存在数据冒险的问题。为了解决这个问题,我们设计了数据前递模块。
但是我们采用的数据前递模块,只局限于解决算术操作和数据传输中的冒险问题。在 CPU 流水线中还可能存在结构冒险和控制冒险的问题,我们在进行流水线规划时,已经合理地避免了结构冒险。但是,控制冒险还可能出现,下面我们就来探讨一下流水线的控制冒险问题。

流水线控制冒险

还记得前面我们说过的条件分支指令吗?就是根据指令设置的数值比较结果,改变并控制跳转的方向,比如 beq 和 bne 指令。
假如在流水线取出分支指令后,紧跟着在下一个时钟周期就会取下一条指令。但是,流水线并不知道下一条指令应该从哪里取,因为它刚从存储器中取出分支指令,还不能确定上一条分支指令是否会发生跳转。
上面这种流水线需要根据上一条指令的执行结果决定下一步行为的情况,就是流水线中的控制冒险。这时候该怎么办呢?
控制冒险可以使用流水线停顿的方法解决,就是在取出分支指令后,流水线马上停下来,等到分支指令的结果出来,确定下一条指令从哪个地址取之后,流水线再继续。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了CPU流水线设计中的控制冒险问题及解决方法。首先介绍了数据冒险和数据前递模块的设计,然后讨论了可能存在的结构冒险和控制冒险问题。针对控制冒险,文章提出了流水线停顿和分支预测两种解决方法。流水线停顿会导致性能损失,而分支预测则提升了分支阻塞的效率。文章还详细介绍了控制冒险模块的代码实现和内部产生的信号作用,以及在不同情况下产生的控制信号。通过解决流水线的冒险问题,可以确保指令执行结果的正确性,进而将执行结果写回到寄存器。这些解决方案对于理解和解决CPU流水线设计中的问题具有重要参考价值。 文章还介绍了写回控制模块和写回数据通路模块的设计,这些模块在流水线的最后一级起着关键作用。通过对这些模块的设计,文章展示了如何处理数据冒险和控制冒险,确保流水线产生的结果无误。最后,文章提出了思考题,引发读者对其他解决控制冒险问题的办法进行思考和讨论。 总的来说,本文通过深入分析CPU流水线设计中的控制冒险问题及解决方法,为读者提供了宝贵的技术参考和思路。读者可以从中了解到流水线设计中的挑战和解决方案,对于从事CPU设计和计算机体系结构的专业人士具有重要的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《计算机基础实战课》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • 苏流郁宓
    置顶
    缩减单次指令程序流执行规模(比如执行三次,假如分支预测概率为50%,第一次下去,后面两次预测一次性对的概率为0.25。执行六次则预测对的概率更低) 还有一个方法增加晶体管的规模,假如分支预测的概率为50%,增加晶体管规模,也能提高分支预测命中率(就好比,把所有的可能在同一时间利用不同的晶体管组走一遍)!

    作者回复: 66666 有见解

    2022-08-17归属地:湖北
    3
  • 青玉白露
    还有其他的办法,第一种,延迟分支,在分支指令之后插入一条一定会执行的指令(根据编译器和系统来确定),这样可以充分利用时钟周期;第二种,多分支执行,跳转和不跳转并行取指,哪条不执行就丢掉

    作者回复: 66666

    2022-08-17归属地:湖北
    5
  • 云海
    老师,请问要跑仿真的话,是还需要assembler的代码吗?谢谢

    作者回复: 需要

    2022-08-18归属地:湖北
  • A君
    控制和数据冒险还是很多的:分支预测失败得把取指和译码得到信号清掉,然后更新pc;如果下条指令要读取的寄存器需要等上一条指令访存完,那就得插入一个停顿周期。如果不想因停顿导致性能损失,可以在原停顿点插入另一条无关指令,这需要编译器来做,而且可能还需要解决信号的跨指令存储,
    2023-11-29归属地:上海
  • 送过快递的码农
    看不懂,硬看。看完还是不懂,但是还是硬着头皮提个问题,cpu有个概念叫ipc,单个周期的处理量。是不是增加流水线深度也是提升ipc的办法。流水线深度增加,是不是能够增加预测的准确率(纯属外行瞎猜)
    2023-11-24归属地:上海
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部