将陆续上传本人写的新书《自己动手写CPU》(尚未出版),今天是第23篇,我尽量每周四篇
6.4 测试程序
本节将通过一个测试程序验证为OpenMIPS处理器添加的移动操作指令是否实现正确,测试程序如下,对应本书附带光盘Code\Chapter6\AsmTest目录下的inst_rom.S文件。
.org 0x0 .set noat .global _start _start: // 给寄存器$1、$2、$3、$4赋初值 lui $1,0x0000 # $1 = 0x00000000 lui $2,0xffff # $2 = 0xffff0000 lui $3,0x0505 # $3 = 0x05050000 lui $4,0x0000 # $4 = 0x00000000 // 对于movz指令而言,由于寄存器$1为0,所以将$2的值赋给$4 movz $4,$2,$1 # $4 = 0xffff0000 // 对于movn指令而言,由于寄存器$1为0,所以不赋值,$4保持不变 movn $4,$3,$1 # $4 = 0xffff0000 // 对于movn指令而言,由于寄存器$2不为0,所以将$3的值赋给$4 movn $4,$3,$2 # $4 = 0x05050000 // 对于movz指令而言,由于寄存器$3不为0,所以不赋值,$4的值保持不变 movz $4,$2,$3 # $4 = 0x05050000 // 连续三条mthi指令,分别将寄存器$0、$2、$3的值保存到HI寄存器 mthi $0 # hi = 0x00000000 mthi $2 # hi = 0xffff0000 mthi $3 # hi = 0x05050000 // 读取HI寄存器的值到$4,同时可验证HI、LO寄存器带来的数据相关问题是否处理正确 mfhi $4 # $4 = 0x05050000 // 连续三条指令mtlo,分别将寄存器$3、$2、$1的值保存到LO寄存器 mtlo $3 # lo = 0x05050000 mtlo $2 # lo = 0xffff0000 mtlo $1 # lo = 0x00000000 // 读取LO寄存器的值到$4,同时可验证HI、LO寄存器带来的数据相关问题是否处理正确 mflo $4 # $4 = 0x00000000
程序的注释给出了预期效果,将上述inst_rom.S文件,与第4章建立的Bin2Mem.exe、Makefile、ram.ld这三个文件拷贝到Ubuntu虚拟机中的同一个目录下,打开终端,使用cd命令进入该目录,然后输入make all,即可得到用于ModelSim仿真的指令存储器初始化文件inst_rom.data。
在ModelSim中新建一个工程,添加本书附带光盘Code\Chapter6目录下的所有.v文件,然后可以编译。再复制上面的inst_rom.data文件到ModelSim工程的目录下,就可以进行仿真了。
ModelSim仿真输出如图6-7、6-8所示,观察$4、HI、LO寄存器值的变化可以知道OpenMIPS正确实现了移动操作指令。
好了,移动操作指令至此就已经实现了,也验证通过了,下一步将实现算术操作指令,敬请关注!