RISC-V单周期处理器设计(指令和控制器)(二)

指令和控制器

数据通路在上一篇文章中已经讲解了,接下来就是另一部分:控制器和指令。

1.指令

首先说明一下我准备设计的这一款单周期处理器支持的指令:

1.基本R型指令

add,sub(加减),sll,srl,sra(移位),and,or,xor(逻辑运算)

R型指令:主要就是一些基本的寄存器中数据过ALU的操作,相对容易。

2.基本I型指令和load指令

addi,subi(立即数加减),slli,srai,srli(立即数移位),andi,ori,xor(立即数逻辑运算)

load指令

基本I型指令:上面的R型改成寄存器与立即数之间操作就行,相对好实现一些。

主要是load指令,访存取数指令,这个相对特殊需要注意。

3.s型存储指令

store

只有将数据存储到内存中的指令。

4.jalr指令(jalr实际上是I型)

由于这个指令相对一般I型有所不同,单独处理

5.J型指令

jal

直接跳转指令

6.B型指令

beq,bne,blt,bge

主要是一些条件跳转类指令。

2.控制器

控制器实质:解析每条指令,给数据通路基于相应的控制信号,使数据通路可以按照指定的指令流动起来(自己的理解)

首先需要知道数据通路中那些位置都需要控制信号?

RISC-V单周期处理器设计(指令和控制器)(二)_第1张图片

 首先看RTL图,可以看出输入只有一个,就是指令,输出则是各种控制信号。

上图给出了所需要的控制信号,我会依次讲解的。

1.RegWrite(寄存器写控制信号)

大致意思就是这条语句是否向寄存器中写入数据,我们回顾之前RISC-V指令集的知识,可以知道R型,I型,load指令,jal,jalr指令都需要向寄存器写入数值,具体可以看之前博客。

所以这个信号的判断标准就是判断改指令类型是否是上述类型,判断方法也很简单,就是判断每条指令的opcode是否为对应值。

2.ALUSrc(是否有立即数信号)

与上面分析方法一致,我们知道在RISC-V中有立即数的指令类型有:I型,s型,load指令。(对于jal,jalr其实也有立即数,但是我们这里不考虑因为它是直接在pc操作)

判断方法与上面一致,判断指令opcode是否为上面对应值

3.MemWrite(是否向内存中写入数据)

这个更好判断,我们知道RISC-V中只有S型指令需要向内存中写入数据,因此只用判断指令opcode是否为S型指令。

4.MemtoReg(是否从内存中读取数据)

与上面一致,我们知道只有load指令需要读内存,因此,只用判断指令opcode是否为load指令。

5.beq,bne,blt,bge,jal,jalr(指令判断)

如果对RISC-V指令结构熟悉的话,相信很好判断的。不做说明了。

6.ALUoperation和ALUop

事实上这两个是可以一起理解的。我们可以换位思考,假如我们是数据通路,面对各种类型的R型和I型指令,又该如何识别到底是移位操作还是算术操作那?着实际上就是通过fun3和fun7来控制的。具体如果实现可以参考代码。

代码链接:verilog单周期处理器(目前无流水线)(risc-v)-硬件开发文档类资源-CSDN文库


总结

我自己的理解:如果看到这里都没有什么太大的问题,这就说明整体框架已经有了,没有什么大的问题了。接下来就是各个模块的设计和一些优化算法以及如果实现5级流水的细节问题了。接下来我也会写一些重要模块如寄存器堆,桶型移位器,超前进位加法器等等,期待大家的关注。

你可能感兴趣的:(RISC-V单周期处理器设计,risc-v,学习)