09|手写CPU(四):如何实现CPU流水线的访存阶段?
LMOS
你好,我是 LMOS。
先简单回顾一下上一节课,我们设计了 MiniCPU 流水线的执行相关模块。其中包括执行控制模块、通用寄存器模块,以及可以进行加减法运算、大小比较、移位操作的 ALU 模块。
指令执行之后就到了流水线的下一级——访存。这节课我们就重点聊聊怎么设计实现访存的相关模块。在你的设想里,访存模块必要的组成部分有哪些呢?
如果你的第一反应是访存控制模块,我只能说你只答对了一部分。访存控制模块虽然是流水线的主线,但你可能忽略了流水线中的数据相关性问题。因此,今天我们先想办法解决流水线的数据冒险问题,然后再完成流水线访存阶段相关模块的设计。
流水线数据冒险
在开始设计访存模块之前,我们得先解决一个问题,即流水线的数据冒险。
在 CPU 流水线里,执行不同的指令时会发生这样的情况:一条指令 B,它依赖于前面还在流水线中的指令 A 的执行结果。当指令 B 到达执行阶段时,因为指令 A 还在访存阶段,所以这时候就无法提供指令 B 执行所需要的数据。这就导致指令 B 无法在预期的时钟周期内执行。
当指令在流水线中重叠执行时,后面的指令需要用到前面的指令的执行结果,而前面的指令结果尚未写回,由此导致的冲突就叫数据冒险。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
CPU流水线中的数据冒险问题及解决方法是本文的核心内容。作者首先介绍了数据冒险对CPU流水线的影响,随后详细讲解了通过编译器调整指令顺序和硬件前递来解决数据冒险问题的方法。文章还深入讲解了数据前递模块的设计和访存控制模块的设计,展示了相应的Verilog代码。通过这些内容,读者可以快速了解CPU流水线中的数据冒险问题及解决方法。此外,文章还提到了CPU流水线中可能存在的其他冲突问题,并鼓励读者在留言区交流讨论。整体而言,本文对CPU流水线设计的技术细节进行了深入剖析,对于对CPU流水线设计感兴趣的读者具有一定的参考价值。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《计算机基础实战课》,新⼈⾸单¥68
《计算机基础实战课》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(6)
- 最新
- 精选
- 苏流郁宓在硬件层面,为提高流水线效率。按照同时钟周期原则,假如ac为一组指令,c的运算必须依赖a的结果,那可以把同样周期的bd插入ac中组为abcd指令,a指令下去运算,紧接着b指令也下去运算,这样表面上c需要a的等待时间,但等待时间途中b指令也忙着,相当于cpu核没有空闲,利用指令b指令的时间间隙,a指令完成执行,结果返回给c,c执行差不多,b指令完成执行结果就可以立马返回给d指令执行了 cpu核执行指令没有空闲时间,乱序执行,这是通过增加晶体管来完成的! 这可以和今天的流水线执行方式进行互补的啊
作者回复: 是的
2022-08-15归属地:湖北8 - 苏流郁宓cpu流水线下,软硬件中断导致须停下手头工作来处理中断问题,频繁的软硬件中断会降低cpu工作效率(比如正在运行的数据需要来回存取读写),在明面上如用户一下打开多个app容易卡住,或者浏览器打开多个网页…… 解决方法,如浏览器给定同时允许打开网页的最大数,或者app中也设软件cache,减少因网络即时数据存储问题导致的中断量加大,比如,优化软件结构。能就近找到的数据不要让cpu遍历去找! 在cpu层面,尽量将宽度一致的数据/指令列为一组,减少内存不该有的缺页异常(该有的还得有)!
作者回复: 是的
2022-08-15归属地:湖北2 - 枫落空泡是什么指令呢?这个时候流水线是也处于忙状态吗?
作者回复: 是的
2022-09-04归属地:湖北 - +1不太理解在什么情况下需要在访存这个阶段从存储器中读取数据,不是能在执行阶段通过寄存器地址完成么?另外存储器和寄存器有什么区别呢?然后为何还有给pc地址加4的情况,不是在预读取的时候就完成了么
作者回复: 外存储器一般 是内存
2022-08-21归属地:湖北2 - 青玉白露精彩!锁、内存屏障等概念其实说到底就是基于访存阶段进行的特性化操作,还有很多的东西需要妈那美女消化。
作者回复: 哈哈
2022-08-17归属地:湖北 - A君数据冒险,下一条指令的源寄存器地址等于当前执行的目标寄存器地址,下一条指令的执行必须等待上一条指令完成访存和写回才能进行下去。解决方案是访存模块会把输入寄存器地址和操作数发给执行前的forwarding模块,如果该地址执行所需的源操作数地址一致,就可以用操作数替换前面从通用寄存器中读出的值,这样流水线就不需要暂停。2023-11-29归属地:上海
收起评论