tiny - riscv

271 阅读3分钟

设计了tiny -riscv处理器核和外设资源的交互。外设包括了ROM的取值。RAM的访存。

三级流水线完成取值,译码 执行。

使用32位riscv处理器格式,算术指令I型指令,如ADDI立即数相加。R型指令寄存器加减法。 B型指令分支指令,J型指令跳转指令。U型指令,LUI进行立即数移动。ADD的三级流水线过程为,从ROM进行取值,ROM按字节进行存储指令,所以一条指令占用四个地址空间,if模块根据pc_reg寄存器地址进行取值,取出指令后通过if_id进行打一拍。后进入译码电路,id译码模块通过寄存器组,rs1和rs2得到数据1和数据2。打一拍id_ex模块。 将输入传入执行模块。在第三个时钟周期到来时,进行ex执行。执行结束将回写,把结果写回到寄存器组中的目的寄存器中rd。

pc_reg模块,if取值模块ROM,mov指令通过ADDI来实现。 通过ADDI给寄存器中移入数据。I型指令可以实现NOP指令通过ADDI给X0寄存器移入0来实现。 PC_reg通过对ROM连续四个地址空间进行取值,并设置来看参数化模块defines.v通过宏定义指令来实现参数化。通过id译码模块通过case语句对指令进行译码,随后打一拍。 将数据通过ex执行模块,根据指令,进行相应的操作。并加入了优化指令相关性冲突,关于reg寄存器的读写冲突,对于流水线中第一条指令进行执行阶段对寄存器进行写回。而指令二需要对寄存器进行取值,此时指令1的值还未写回完成。 在指令2译码阶段,则对于此情况,如果在指令2译码阶段,读端口和写端口地址相同,则直接将写入的数据给读出的数据,解决此指令相关性冲突问题。

通过该ROM地址单元进行取指令。与外设进行交互。进行测试是通过txt文件进行testbench验证。通过readmemb,将文本中数据赋值到存储器中。通过display打印输出信息。 第一个时钟上升沿开始,第一个周期为不定态,未复位。第二个周期开始复位。第三个周期为cpu第一个周期取指。以此译码执行。 则第五个周期到来时,完成第一条指令,第一条指令耗时三个周期,第6个周期完成第二条指令。。。

完成了ADD指令的设计以及验证。

加入J型指令和B型指令,跳转指令和分支指令。分支指令通过比较完成跳转。加入了流水线冲刷机制,对于分支指令bne,如果rs1和rs2不相等,则跳转到其他指令。当bne执行阶段,条件成立,需要进行跳转。出现冲突需要进行流水线冲刷,通过控制模块发送控制信号给取指,译码模块。并将跳转指令地址给pc寄存器,告诉PC要跳转到jump指令的地址。给取指模块和译码模块发送NOP指令进行空操作。

补全R型和I型指令,R型为寄存器算术指令,I型为立即数算术指令。加入双口RAM,完成访存,访存指令load和store。读取和写。 ROM通过双口RAM实现的,

双口RAM,当读写同一地址时,读数据从写数据读取。

通过RAM完成访存指令。