天天看点

自己动手写CPU之第五阶段(5)——测试逻辑、移位与空指令的实现

将陆续上传本人写的新书《自己动手写CPU》(尚未出版),今天是第19篇,我尽量每周四篇

5.6 测试程序1——测试逻辑操作实现效果

      编写如下测试程序用于检验逻辑操作指令是否实现正确,文件名命名为inst_rom.S,在本附带光盘Code\Chapter5_2\AsmTest\LogicInstTest目录下有测试程序源文件。

.org 0x0
.global _start
.set noat
_start:
lui  $1,0x0101           # $1 = 0x01010000
ori  $1,$1,0x0101        # $1 = $1 | 0x0101 = 0x01010101
ori  $2,$1,0x1100        # $2 = $1 | 0x1100 = 0x01011101
or   $1,$1,$2            # $1 = $1 | $2     = 0x01011101
andi $3,$1,0x00fe        # $3 = $1 & 0x00fe = 0x00000000
and  $1,$3,$1            # $1 = $3 & $1     = 0x00000000
xori $4,$1,0xff00        # $4 = $1 ^ 0xff00 = 0x0000ff00
xor  $1,$4,$1            # $1 = $4 ^ $1     = 0x0000ff00
nor  $1,$4,$1            # $1 = $4 ~^ $1    = 0xffff00ff
           

      在程序的注释中给出了程序预期执行效果,在这里就是寄存器$1-$4的变化情况。将上述inst_rom.S文件,与第4章建立的Bin2Mem.exe、Makefile、ram.ld这三个文件拷贝到Ubuntu虚拟机中的同一个目录下,打开终端,使用cd命令进入该目录,然后输入make  all,即可得到用于ModelSim仿真的inst_rom.data文件。

      在ModelSim中新建一个工程,添加本书光盘Code\Chapter5_2目录下的所有.v文件,然后可以编译。再复制上面得到的inst_rom.data文件到ModelSim工程的目录下,就可以进行仿真了。上述仿真步骤以后不再重复说明。

      ModelSim仿真结果如图5-16所示,regs[1]、regs[2]、regs[3]、regs[4]分别是寄存器$1、$2、$3、$4,观察这4个寄存器值的变化,可知符合预期,所以OpenMIPS正确实现了逻辑操作指令。

自己动手写CPU之第五阶段(5)——测试逻辑、移位与空指令的实现

5.7 测试程序2——测试移位操作与空指令实现效果

      编写如下测试程序用于检验移位操作与空指令是否实现正确,文件名依然命名为inst_rom.S,在本书光盘的Code\Chapter5_2\AsmTest\ShiftInstTest目录下有测试程序源文件。

.org 0x0
.set noat
.global _start
_start:
lui   $2,0x0404    # $2 = 0x04040000
ori   $2,$2,0x0404 # $2 = 0x04040000 | 0x0404 = 0x04040404
ori   $7,$0,0x7
ori   $5,$0,0x5
ori   $8,$0,0x8
sync
sll   $2,$2,8      # $2 = 0x40404040 sll 8  = 0x04040400
sllv  $2,$2,$7     # $2 = 0x04040400 sll 7  = 0x02020000
srl   $2,$2,8      # $2 = 0x02020000 srl 8  = 0x00020200
srlv  $2,$2,$5     # $2 = 0x00020200 srl 5  = 0x00001010
nop
pref
sll   $2,$2,19     # $2 = 0x00001010 sll 19 = 0x80800000
ssnop
sra   $2,$2,16     # $2 = 0x80800000 sra 16 = 0xffff8080
srav  $2,$2,$8     # $2 = 0xffff8080 sra 8  = 0xffffff80 
           

      在程序的注释中给出了程序预期执行效果,主要就是寄存器$2的变化情况。ModelSim仿真结果如图5-17所示,观察寄存器$2的变化可以知道OpenMIPS正确实现了移位操作指令与空指令。

自己动手写CPU之第五阶段(5)——测试逻辑、移位与空指令的实现

5.8 小结

      本章首先分析了流水线中存在的数据相关问题,然后使用数据前推的方法解决了数据相关问题,随后修改OpenMIPS,实现了对逻辑、移位操作和空指令的支持,主要修改的是译码阶段的ID模块、执行阶段的EX模块。其中,在ID模块添加对新指令的译码,在EX模块添加对新的运算类型的支持。

从下次开始将移动操作指令的实现,敬请关注!

继续阅读