tinyrisc-v学习笔记(二.代码取指)

二.代码理解:(因作者水平有限,写文档是为了帮助自己学习,锻炼自己。所以可能会有理解不到位,和错误的地方。请加以指正)
我们要做的是理解流水线,以及risc-v指令。
本文流水线为三级流水线,常规的一般都会用五级,这里用三级并没有多大差异,只是将访存,回写等步骤合并到执行步骤,本工程三级流水分别问取指→译码→执行。
我们常写的CPU主要由:
1.寄存器:不同的寄存器作用不同,例如
程序计数器PC:记录执行的指令地址;
指令寄存器:暂存指令内容;
数据寄存器:保存指令执行过程中临时存放的寄存器操作数和中间操作结果。
2.控制单元Control:以流水线方式对指令取指,译码,执行。并且发出为完成每条指令索要执行的各个操作的控制信号。
3.算数逻辑单元ALU:执行运算操作,移位操作以及逻辑操作,包括地址运算等等。
对于本文每个.v文件(或者说每个子模块)的作用我们可以参考CSDN的up主小汪的自习室以及作者的官方文档都有很好的解释。不做一一解释。(提示:jtag的文档暂时不用看,作为数字IC设计目前来说,暂时需要要弄懂它)

大致整个功能说完,我们这里先从取指阶段开始讲。
首先!我们暂时不考虑中断,从头到尾梳理一遍思路:(本小节所有说明都不涉及中断,中断后面单独说)


阶段一.取指

*** 1.rom(时序逻辑电路):我们看到tb文件中有这样一句指令:
在这里插入图片描述
rom的作用是存储烧写的指令码,并根据PC寄存器的值向外输出指令码;这里要单独解释一下rom中的位宽是32位但是索引地址是[31:2]最低两位不要,只要高30位。因为我们知道在计算机体系中一个字节可以存储8bit,内存空间中对应一个8bit,一条32Bit指令由4个字节组成,所以PC_reg中pc每次加的都是4也是这个原因。
但是呢,pc的低两位[1:0]都是以4为周期变化,不能作为rom的索引地址,所以pc[1:0]从0加4对应32Bit数据中pc[31:2]也递加1(这里我也不是很了解,我们可以单独理解1:0是以4为周期变化,与前文的8bit不匹配)。
我们将文档中Inst.data的内容存入rom由if_id传入。我们可以查看波形与文档内容:如下图8,我们可以看到文档内容和inst波形中的数据是一致的,例如第一个clk为00000d13,第二个clk为00000d93。
在这里插入图片描述
图8
2.pc_reg(时序逻辑电路):同时呢,我们可以看到Inst_addr这个参数,这里也就是pc_reg所给予的,我们前文也说过pc是以4的倍数递增的,原因也说明了因为一个字节8位,4*8=32,正好是一个数据的位宽。pc传递的就是inst_addr里的地址改变。我们可以在tinyrisc.v文档里看连线以及pc_reg的波形中得以验证,其地址值为00000000→000000004→00000008→……。
3.If_id(时序逻辑电路):主要功能就是取指,我们将rom得到的指令打一拍送入译码模块(也就是流水线的第二级,译码)这里的if_id我更愿意称为他是过度阶段,我个人的理解是我们把pc寄存器给的地址,和rom给的内容整合到一起,我觉得有一个收集者的作用,打一拍也是帮助信号对应整合在一起(这样理解可能会有问题,有懂得人可以教教大家)。还有的其他作用像是中断控制的是这里(后续再说)
所以目前的逻辑就是,我们要给出指令。指令给你了,地址也给你了。用表格图表示如下图(后面省略了,这里是16进制,所以每一个数代表4位两个代表8位,不知道这里的入栈方式是不是有错,有错的话请指出)
在这里插入图片描述
能看懂波形的也可以参考波形图。
所以取指阶段至此不包括中断的部分就到这里。还是较为简单的!

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数字IC佛耶戈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值