首页 > 代码库 > 自己动手写CPU之第七阶段(4)——验证简单算术操作指令实现效果

自己动手写CPU之第七阶段(4)——验证简单算术操作指令实现效果

将陆续上传本人写的新书《自己动手写CPU》,今天是第27篇,我尽量每周四篇

China-pub的预售地址如下(有目录、内容简介、前言):

http://product.china-pub.com/3804025

亚马逊的预售地址如下,欢迎大家围观呵!

http://www.amazon.cn/dp/b00mqkrlg8/ref=cm_sw_r_si_dp_5kq8tb1gyhja4


7.4 测试简单算术操作指令实现效果

      本节通过实验来检验我们修改后的代码是否实现了简单算术操作指令,测试程序如下,源文件是本书附带光盘Code\Chapter7_1\AsmTest目录下的inst_rom.S文件。

   .org 0x0
   .set noat
   .global _start
_start:

   #########  第一段:测试add\addi\addiu\addu\sub\subu指令 ###############

   ori  $1,$0,0x8000           # $1 = 0x00008000
   sll  $1,$1,16               # $1 = 0x80000000
   ori  $1,$1,0x0010           # $1 = 0x80000010  给$1赋初值

   ori  $2,$0,0x8000           # $2 = 0x00008000
   sll  $2,$2,16               # $2 = 0x80000000
   ori  $2,$2,0x0001           # $2 = 0x80000001  给$2赋初值

   ori  $3,$0,0x0000           # $3 = 0x00000000
   addu $3,$2,$1               # $3 = 0x00000011  $1加$2,无符号加法
   ori  $3,$0,0x0000           # $3 = 0x00000000
   add  $3,$2,$1               # $2加$1,有符号加法,结果溢出,所以$3应保持不变
                               # $3保持为0x00000000

   sub   $3,$1,$3              # $3 = 0x80000010  $1减去$3,有符号减法
   subu  $3,$3,$2              # $3 = 0xF         $3减去$2,无符号减法

   addi $3,$3,2                # $3 = 0x11        $3加2,有符号加法
   ori  $3,$0,0x0000           # $3 = 0x00000000
   addiu $3,$3,0x8000          # $3 = 0xffff8000  $3加0xffff8000,无符号加法

   #############    第二段:测试slt\sltu\slti\sltiu指令   #################

   or   $1,$0,0xffff           # $1 = 0x0000ffff     
   sll  $1,$1,16               # $1 = 0xffff0000  给$1赋初值
   slt  $2,$1,$0               # $2 = 1           比较$1与0x0,有符号比较
   sltu $2,$1,$0               # $2 = 0           比较$1与0x0,无符号比较
   slti $2,$1,0x8000           # $2 = 1       比较$1与0xffff8000,有符号比较
   sltiu $2,$1,0x8000          # $2 = 1       比较$1与0xffff8000,无符号比较

   ##############         第三段:测试clo\clz指令          ################

   lui $1,0x0000          # $1 = 0x00000000  给$1赋初值
   clo $2,$1              # $2 = 0x00000000  统计$1中“0”之前的“1”的个数
   clz $2,$1              # $2 = 0x00000020  统计$1中“1”之前的“0”的个数

   lui $1,0xffff          # $1 = 0xffff0000
   ori $1,$1,0xffff       # $1 = 0xffffffff  给$1赋初值
   clz $2,$1              # $2 = 0x00000000  统计$1中“1”之前的“0”的个数
   clo $2,$1              # $2 = 0x00000020  统计$1中“0”之前的“1”的个数

   lui $1,0xa100          # $1 = 0xa1000000  给$1赋初值
   clz $2,$1              # $2 = 0x00000000  统计$1中“1”之前的“0”的个数
   clo $2,$1              # $2 = 0x00000001  统计$1中“0”之前的“1”的个数

   lui $1,0x1100          # $1 = 0x11000000  给$1赋初值
   clz $2,$1              # $2 = 0x00000003  统计$1中“1”之前的“0”的个数
   clo $2,$1              # $2 = 0x00000000  统计$1中“0”之前的“1”的个数

################     第四段:测试mul、mult、multu指令     ################

   ori  $1,$0,0xffff                  
   sll  $1,$1,16
   ori  $1,$1,0xfffb           # $1 = -5    给$1赋初值
   ori  $2,$0,6                # $2 = 6     给$2赋初值
   mul  $3,$1,$2               # $3 = -30 = 0xffffffe2
                               # $1乘以$2,有符号乘法,结果的低32位保存到$3
  
   mult $1,$2                  # HI = 0xffffffff
                               # LO = 0xffffffe2
                               # $1乘以$2,有符号乘法,结果保存到HI、LO寄存器

   multu $1,$2                 # HI = 0x5
                               # LO = 0xffffffe2
                               # $1乘以$2,无符号乘法,结果保存到HI、LO寄存器
   nop
   nop

      程序的注释给出了预期效果,将上述inst_rom.S文件,与第4章建立的Bin2Mem.exeMakefileram.ld这三个文件拷贝到Ubuntu虚拟机中的同一个目录下,打开终端,使用cd命令进入该目录,然后输入make all,即可得到用于ModelSim仿真的指令存储器初始化文件inst_rom.data

      在ModelSim中新建一个工程,并添加本书附带光盘Code\Chapter7_1目录下的所有.v文件,然后可以编译。再复制上面的inst_rom.data文件到ModelSim工程的目录下,就可以进行仿真了。仿真结果如图7-67-77-87-9所示,分别对应测试程序中的四段。




实现了简单算术指令的OpenMIPS代码下载地址如下:

http://download.csdn.net/detail/leishangwen/7801711


自己动手写CPU之第七阶段(4)——验证简单算术操作指令实现效果