08|手写CPU(三):如何实现指令执行模块?
LMOS
你好,我是 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
《计算机基础实战课》,新⼈⾸单¥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归属地:湖北21 - 吴建平“如果它们的最高位不相等,则根据 ALU 运算控制码 aluOp 的最低位判断。如果 aluOp 最低位为“1”,表示是无符号数比较,直接取操作数 2 的最高位作为比较结果。如果 aluOp 最低位为“0”,表示是有符号数比较,直接取操作数 1 的最高位作为比较结果。” 这句话什么意思,比如,为什么无符号数比较,直接取操作数2的最高位为比较结果,这个最高位和大小没关系吧
作者回复: 两个无符号数相减,被减数小的话,结果会变成负数,最高位就算"1"
2022-08-23归属地:湖北31 - 😇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
收起评论