自己动手写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五级流水线结构

1.png

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

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

2.png

各模块的注意点

书本作者雷思磊为提高代码的可读性和易懂性,使用的较多的宏,都在文件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);

波形结果

vivado仿真波形.png

心得

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

项目链接

  • 13
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

日拱一卒_未来可期

若复习顺利望有闲钱的同学支持下

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

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

打赏作者

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

抵扣说明:

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

余额充值