赞
踩
数据通路在上一篇文章中已经讲解了,接下来就是另一部分:控制器和指令。
首先说明一下我准备设计的这一款单周期处理器支持的指令:
add,sub(加减),sll,srl,sra(移位),and,or,xor(逻辑运算)
R型指令:主要就是一些基本的寄存器中数据过ALU的操作,相对容易。
addi,subi(立即数加减),slli,srai,srli(立即数移位),andi,ori,xor(立即数逻辑运算)
load指令
基本I型指令:上面的R型改成寄存器与立即数之间操作就行,相对好实现一些。
主要是load指令,访存取数指令,这个相对特殊需要注意。
store
只有将数据存储到内存中的指令。
由于这个指令相对一般I型有所不同,单独处理
jal
直接跳转指令
beq,bne,blt,bge
主要是一些条件跳转类指令。
控制器实质:解析每条指令,给数据通路基于相应的控制信号,使数据通路可以按照指定的指令流动起来(自己的理解)
首先需要知道数据通路中那些位置都需要控制信号?
首先看RTL图,可以看出输入只有一个,就是指令,输出则是各种控制信号。
上图给出了所需要的控制信号,我会依次讲解的。
大致意思就是这条语句是否向寄存器中写入数据,我们回顾之前RISC-V指令集的知识,可以知道R型,I型,load指令,jal,jalr指令都需要向寄存器写入数值,具体可以看之前博客。
所以这个信号的判断标准就是判断改指令类型是否是上述类型,判断方法也很简单,就是判断每条指令的opcode是否为对应值。
与上面分析方法一致,我们知道在RISC-V中有立即数的指令类型有:I型,s型,load指令。(对于jal,jalr其实也有立即数,但是我们这里不考虑因为它是直接在pc操作)
判断方法与上面一致,判断指令opcode是否为上面对应值
这个更好判断,我们知道RISC-V中只有S型指令需要向内存中写入数据,因此只用判断指令opcode是否为S型指令。
与上面一致,我们知道只有load指令需要读内存,因此,只用判断指令opcode是否为load指令。
如果对RISC-V指令结构熟悉的话,相信很好判断的。不做说明了。
事实上这两个是可以一起理解的。我们可以换位思考,假如我们是数据通路,面对各种类型的R型和I型指令,又该如何识别到底是移位操作还是算术操作那?着实际上就是通过fun3和fun7来控制的。具体如果实现可以参考代码。
代码链接:verilog单周期处理器(目前无流水线)(risc-v)-硬件开发文档类资源-CSDN文库
我自己的理解:如果看到这里都没有什么太大的问题,这就说明整体框架已经有了,没有什么大的问题了。接下来就是各个模块的设计和一些优化算法以及如果实现5级流水的细节问题了。接下来我也会写一些重要模块如寄存器堆,桶型移位器,超前进位加法器等等,期待大家的关注。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。