自己动手写CPU(1)五级流水线及CPU第一条指令ori

自己动手写CPU(1)五级流水线及CPU第一条指令ori

动机

不知为何研一的自由时间突然多起来,可能人一闲下来就容易焦虑吧,hhhhhh。正好之前看到一本《自己动手写CPU》,就按照此书从头实做一遍MIPS指令集的CPU,也当做对大学课程的总结。之前看龙芯杯比赛的代码震惊到我了,想想那堆大佬本科在搞这东西而我本科在瓜瓜地刷分,感叹人之间的差距真的好大。痛定思痛,还是先动手做起来这才能假意安慰自己,我好像也不错。闲言少叙,让我们开始吧!

由于作者提供了各章实现的具体代码,所以该系列博客主要记录我过程中有哪些观点花了较长的时间才得以理解,文章末尾我也会提供自己照着写的Verilog源码,仅供大家学习交流使用,还希望大家多多支持原作。

ori指令说明

ori是进行逻辑“或”运算的指令,指令格式如下图所示

3.png

指令用法为:ori rs,rt,immediate,作用是将指令中的16位立即数immediate进行无符号拓展至32位,然后与索引为rs的通用寄存器进行逻辑“或”运算,将运算结果保存至索引位rt的通用寄存器中。

流水线结构的建立

原始的OpenMIPS五级流水线结构

自己动手写CPU(1)五级流水线及CPU第一条指令ori_第1张图片

  • 取指:取出指令存储器中的指令,PC值递增,准备取下一条指令;
  • 译码:对指令进行译码,依据译码结果从通用寄存器中取出源操作数、取出操作码,将其送到执行阶段;
  • 执行:依据译码阶段送入的源操作数、操作码进行运算;
  • 访存:对于本实验中的ori指令,在访存阶段无操作;
  • 回写:将运算结果保存到目的寄存器;

下图是原始的OpenMIPS五级流水线系统结构图

自己动手写CPU(1)五级流水线及CPU第一条指令ori_第2张图片

各模块的注意点

书本作者雷思磊为提高代码的可读性和易懂性,使用的较多的宏,都在文件defines.v中进行定义。且随着后面OpenMIPS功能的不断完善,会有更多的宏添加进来,可拓展性很强,以后自己编写项目代码时该点要向作者学习;

因为MIPS32架构规定$0的值只能为0,所以不能写入,大家在看regfile.v的时候需留意这点;

原文作者在译码模块id.v中,在组合逻辑always @(*)里用非阻塞赋值<=且对同一变量赋值两次(赋默认值),这点我仍存在疑问。在我自己写的代码中,将组合逻辑中的赋值全部改用阻塞赋值=;目前功能测试通过;

弯路

我的环境是ubuntu18.04书本提供的toolchain有点老旧,直接使用gcc-mips-linux-gnu会比较好,安装代码如下:

sudo apt-get install gcc-mips-linux-gnu

将光盘里提供的Bin2Mem.c拿到linux下重新编译后再进行调用,不要直接用exe文件;

更新后的Makefile代码如下(将CORSS_COMPILE的定义修改掉即可),解释见书本

ifndef CROSS_COMPILE
CROSS_COMPILE = mips-linux-gnu-
endif
CC = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump

OBJECTS = inst_rom.o

export	CROSS_COMPILE

# ********************
# Rules of Compilation
# ********************

all: inst_rom.om inst_rom.bin inst_rom.asm inst_rom.data

%.o: %.S
	$(CC) -mips32 $< -o $@
inst_rom.om: ram.ld $(OBJECTS)
	$(LD) -T ram.ld $(OBJECTS) -o $@
inst_rom.bin: inst_rom.om
	$(OBJCOPY) -O binary $<  $@
inst_rom.asm: inst_rom.om
	$(OBJDUMP) -D $< > $@
inst_rom.data: inst_rom.bin
	./Bin2Mem -f $< -o $@
clean:
	rm -f *.o *.om *.bin *.data *.mif *.asm

在vivado中用$readmemh函数进行ROM的初始化时,要将数据文件补成绝对路径,不然vivado找不到rom的初始化文件,示例代码如下所示:

initial $readmemh ("/home/wg/OpenMips/Vivado/Chapter4/rtl/inst_rom.data",inst_mem);

波形结果

自己动手写CPU(1)五级流水线及CPU第一条指令ori_第3张图片

心得

  • 本章通过一个简单的ori指令,搭建了一个原始的五级流水线结构,后续会逐渐对指令进行完善;
  • 实现了一个用于测试的最小SOPC,学习了从汇编代码到仿真中使用的指令存储器初始化文件的过程;

项目链接

你可能感兴趣的:(自己动手写CPU,verilog,cpu)