tinyrisc-v学习笔记(四.代码执行)

阶段三.执行

ex**(组合逻辑电路)**
在id.v中我们已经简单说明了,比如在Mul和在add中我们指令中reg_data(op_o是reg_data赋予的)是指令内容,reg_addr是指令地址(rs赋予给他的,从逻辑上来说rs在某些指令下他们两是相等的例如R,S,B指令)。
我们对指令也就是op1_i,op2_i(这里我想说的是因为这里是用)进行操作如下图13
在这里插入图片描述
图13
上图中我们可以认为我们提前将这些值算好,如果用到我们直接在里面使用,比如说如果我们用到ADDI,我们就赋值与reg_wdata=op1_add_op2_res。没有涉及到的信任设为默认值(一般都是0)
在执行中每个操作都有对应的操作码,在I指令中有funct3,在R指令由funct7,funct3等等。还是以I指令和R指令分别各举一个例子,其他指令还是换汤不换药。I指令如下图14
在这里插入图片描述
图14
我们可以看到ADDI中,我们将其他使能全为0,然后写内容为两个相加。像mem,jump这里暂时不说。SLTI也是特定的操作。感兴趣的可以自己百度查看各指令的操作。
再看一个R指令的如图15
在这里插入图片描述
图15
相比I指令多一个funct7的判断,还有在inst[30]的判断为0是加法,为1是减法,为写的数据。没有什么特别的。只是在乘法,除法等指令由于是二进制的算法,所以操作要复杂一点,涉及到补码反码的知识。
计算的具体操作可以看小汪的自习室,三.risc-v执行的代码讲解。网页链接为代码讲解
2.Ram.v
作用是存储临时数据,这里的代码操作和rom.v一样。
这里想说的是首先rom是只读存储器,ram是随机读写存储器,我们在这里不讨论速度,以前供电会不会消失之类的。
我们举个例子,可以把ram比喻成图书馆中格子,对于RAM 等存储器来说也是一样的,虽然存储的都是代表0 和1 的代码,但是不同的组合就是不同的数据。如果有一个书架上有10 行和10 列格子(每行和每列都有0-9 的编号),有100 本书要存放在里面,那么我们使用一个行的编号加一个列的编号就能确定某一本书的位置。如果已知这本书的编号87,那么我们首先锁定第8 行,然后找到第7 列就能准确的找到这本书了。在RAM 存储器中也是利用了相似的原理。

我们以还是在图中找到其中几个做举例子:
在INST_SW的指令下,如图16
在这里插入图片描述
图16
我们查阅资料的得知SW的指令功能是如下图17
在这里插入图片描述
将寄存器中的值写入数据寄存器,这样也就好理解了。

再例如SB如下图18,19
在这里插入图片描述

图18
在这里插入图片描述
在这里插入图片描述
图19
可以看到SB的作用是将地址为rt(rs1,这里结合上面代码,我个人觉得应该是将rs2的值加到了rs1上,所以才会出现mem_waddr和mem_raddr都等于op1_add_op2_res)的通用寄存器的最低字节(也可以看到是reg2_rdata中的7:0)存储到内存中的指定地址,根据mem_wdata_o的值,确定存储在什么位置。
这里的mem_raddr_index的含义就是32位内存数据(4个字节)中的哪一个字节,2’b00表示第0个字节,即最低字节,2’b01表示第1个字节,2’b10表示第2个字节,2’b11表示第3个字节,即最高字节。
这里我想说一点,我之前在阶段3开头的第一句话又说op中是指令内容,这里我们确实在许多地方看到op=reg_rdata_i。我这里想说的是op这里应该是在用作计算时他在很多时候等于reg_rdata但是有的时候也不是例如图20,我们仔细看可以发现,op等于的是地址和立即数。
在这里插入图片描述
图20
这里我们还是要说一下的就是,这里的操作是由ram辅助完成的,也就是说在进行这些地址改变时,地址中的内容也变了。

3.div
这里的除法属于执行阶段的,但是由于其比较繁杂,所以单独列出来,这里采用的是试商法。方法如下图21,图22举个例子。
需要注意的是:每次除法运算至少需要33个时钟周期(clk,具体为什么33个周期我觉得是32位加上一个类似于启动的位数)才能完成,主要分为四种:
wire op_div = (op_r == INST_D); //有符号除法,结果为商
wire op_divu = (op_r == INST_DIVU);//无符号除法,结果为商
wire op_rem = (op_r == INST_REM);//有符号余数
wire op_remu = (op_r == INST_REMU);//无符号余数
在这里插入图片描述
图21
因为这里我们是对有符号数进行运算,所以有符号数中正数不变,但是负数会对其取反加1。并且我们知道值在存储时是以补码进行存储的。所以负数在这里是先取补码,再取反加1(第一步取补符号位不变,第二步取反加1符号位可以变)
在这里插入图片描述
图22
Tips:IC设计的阶段reg或者wire变量进行赋值以及计算器存储数据的时候,都是用补码形式进行。

以上,所有不涉及的外设以及中断的就此结束。下一节我们单独对中断进行讲解。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

数字IC佛耶戈

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

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

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

打赏作者

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

抵扣说明:

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

余额充值