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

08|手写CPU(三):如何实现指令执行模块?

你好,我是 LMOS。
上一节课,我们完成了 CPU 流水线的指令译码模块设计。我们一起探讨了 RISC-V 指令是如何翻译的,还学会了提取不同类型指令中的信息。最后根据流水线的需要,我们设计出了译码控制模块和数据通路模块。
接下来,我们利用译码后的这些信息继续设计流水线的下一级——执行单元。指令执行算是 CPU 流水线中最复杂的一个阶段了,不过别担心,经过前面课程的准备,我们一定可以搞定它。

CPU 的执行概述

回顾前面我们已经设计完成的 CPU 流水线步骤:
1. 取指模块根据程序计数器(PC)寻址到指令所在的存储单元,并从中取出指令。
2. 译码模块对取出的指令进行翻译,得到功能码、立即数、寄存器索引等字段,然后根据某些字段读取一个或两个通用寄存器的值。
经过流水线的这两个步骤之后,下一步就需要把这些指令信息发送给执行单元去执行相关操作。根据译码之后的指令信息,我们可以把指令分为三类,分别是算术逻辑指令、分支跳转指令、存储器访问指令。
上节课我们已经详细解读了 RISC-V 指令集的指令格式,正是因为格式上比较简单而且规整,所以不同类别的指令执行过程也是类似的。这样,RISC 执行单元的电路结构相比 CISC 就得到了简化。
所以在指令执行阶段,上述的这三类指令都能通过 ALU 进行相关操作。比如,存储访问指令用 ALU 进行地址计算,条件分支跳转指令用 ALU 进行条件比较,算术逻辑指令用 ALU 进行逻辑运算。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

CPU流水线中指令译码模块的设计和实现是本文的重点。文章首先回顾了CPU流水线的取指和译码步骤,并介绍了指令的三类:算术逻辑指令、分支跳转指令和存储器访问指令。针对这三类指令,文章详细讨论了ALU模块的设计框图和执行控制模块的设计思路,以及相应的Verilog代码。此外,文章还介绍了通用寄存器模块的设计,包括读取和写入操作。通过文章的讲解,读者可以了解到CPU流水线中指令译码模块的复杂性和设计原理,以及相关Verilog代码的实现细节。 在ALU模块的设计中,文章详细解释了各种运算操作的实现原理,包括加减法计算、大小比较、左移右移等操作。特别是对于左移操作转换为右移进行处理的原因进行了深入的解释,为读者提供了清晰的逻辑思路。 总的来说,本文通过详细的技术讲解,使读者能够快速了解CPU流水线中指令译码模块的设计和实现原理,为深入学习和理解相关技术提供了良好的参考。

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

全部留言(7)

  • 最新
  • 精选
  • Abcd
    置顶
    左移运算复用右移运算的电路,也体现了RISC-V精简的哲学:能够用基本的组合出来,就不创造新的电路

    作者回复: 是的

    2022-08-21归属地:湖北
    3
  • peter
    置顶
    请教老师几个问题: Q1:[31:0],什么意思? input [31:0] regWData, 是说regWData占31位,每一位是0吗? Q2:reg [31:0] regs[31:0];: 这条语句什么意思? Q3:regs[ii] <= 32'b0; 是把32'b0写到regs[ii]吗? 32'b0;,是说有32位,每一位是0吗?

    作者回复: input [31:0] regWData, 占用32位 每个位为0

    2022-08-12归属地:湖北
    2
    1
  • 吴建平
    “如果它们的最高位不相等,则根据 ALU 运算控制码 aluOp 的最低位判断。如果 aluOp 最低位为“1”,表示是无符号数比较,直接取操作数 2 的最高位作为比较结果。如果 aluOp 最低位为“0”,表示是有符号数比较,直接取操作数 1 的最高位作为比较结果。” 这句话什么意思,比如,为什么无符号数比较,直接取操作数2的最高位为比较结果,这个最高位和大小没关系吧

    作者回复: 两个无符号数相减,被减数小的话,结果会变成负数,最高位就算"1"

    2022-08-23归属地:湖北
    3
    1
  • 😇
    always @(posedge clk or posedge reset) begin if(reset) begin for(ii=0; ii<32; ii=ii+1) regs[ii] <= 32'b0; end else if(wen & (|regWAddr)) regs[regWAddr] <= regWData; end 请问这里为什么|regWAddr,没太看懂

    作者回复: U型指令是和I型指令相对应的J型指令和B型相对应,都是为了更多的bit对齐

    2022-08-27归属地:湖北
  • +1
    还是没懂$signed() 函数将符号位扩位后的作用是什么

    作者回复: 先把课程看完

    2022-08-20归属地:湖北
  • 小博(微信/手机号1849登录)
    itype我咋没找到在哪里

    作者回复: clone 新的代码

    2022-08-18归属地:湖北
  • 苏流郁宓
    在 ALU 模块代码中,为什么要把左移操作转换为右移进行处理? 这和cpu小端模式有关?

    作者回复: 不是 只是更加容易实现

    2022-08-12归属地:湖北
    2
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部