自己动手写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.exe、Makefile、ram.ld这三个文件拷贝到Ubuntu虚拟机中的同一个目录下,打开终端,使用cd命令进入该目录,然后输入make all,即可得到用于ModelSim仿真的指令存储器初始化文件inst_rom.data。

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

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

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

时间: 2024-08-27 00:26:12

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

自己动手写CPU之第六阶段(3)——移动操作指令的实现

将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第22篇,我尽量每周四篇 6.3 修改OpenMIPS以实现移动操作指令 6.3.1 HI.LO寄存器的实现 在HILO模块中实现HI.LO寄存器,HILO模块的接口描述如表6-1所示. HILO模块的代码如下,源文件是本书附带光盘Code\Chapter6目录下的hilo_reg.v.整个代码很简单:在时钟上升沿,如果复位信号无效,那么就判断输入的写使能信号we是否为WriteEnable,如果是WriteEnable,那么就将输

自己动手写CPU之第六阶段(2)——移动操作指令实现思路

将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第21篇,我尽量每周四篇 6.2 移动操作指令实现思路 6.2.1 实现思路 这6条移动操作指令可以分为两类:一类是不涉及特殊寄存器HI.LO的指令,包括movn.movz:另一类是涉及特殊寄存器HI.LO的指令,包括mfhi.mflo.mthi.mtlo.前一类很好实现,基本思路与第5章实现逻辑.移位操作指令时类似,只需要修改ID.EX模块即可.后一类涉及到特殊寄存器HI.LO,需要为OpenMIPS添加HI.LO寄存器,以及相应

自己动手写CPU之第六阶段(1)——移动操作指令说明

将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第20篇,我尽量每周四篇 本章将实现移动操作指令,首先在6.1节介绍了MIPS32指令集架构中定义的移动操作指令的格式.作用,接着在6.2节给出移动操作指令实现思路,介绍了修改后的数据流图.新出现的数据相关问题及其解决措施,并给出了修改后的OpenMIPS系统结构图.在6.3节列出了详细的修改过程.本章最后通过一个测试程序验证移动操作指令是否实现正确. 6.1 移动操作指令说明 MIPS32指令集架构中定义的移动操作指令共有6条:m

自己动手写CPU之第五阶段(3)——MIPS指令集中的逻辑、移位与空指令

将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第17篇,我尽量每周四篇 5.4 逻辑.移位操作与空指令说明 MIPS32指令集架构中定义的逻辑操作指令有8条:and.andi.or.ori.xor.xori.nor.lui,其中ori指令已经实现了,本章要实现其余7条指令. MIPS32指令集架构中定义的移位操作指令有6条:sll.sllv.sra.srav.srl.srlv. MIPS32指令集架构中定义的空指令有2条:nop.ssnop.其中ssnop是一种特殊类型的空操作

自己动手写CPU之第七阶段(11)——除法指令实现过程2

将陆续上传本人写的新书<自己动手写CPU>,今天是第33篇,我尽量每周四篇 亚马逊的销售地址如下,欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8/ref=cm_sw_r_si_dp_5kq8tb1gyhja4 在当当.京东.互动.北发等网上书店均有! 除法指令的实现过程有点长,分两篇博文介绍,今天是第二篇. 7.12.2 修改译码阶段的ID模块 译码阶段的ID模块要增加对除法指令的分析,根据图7-15给出的指令格式可知,除法指令都是SPECIAL类指令,

自己动手写CPU之第九阶段(2)——载入存储指令说明2(lwl、lwr)

将陆续上传新书<自己动手写CPU>.今天是第38篇,我尽量每周四篇,可是近期已经非常久没有实现这个目标了.一直都有事,不好意思哈. 开展晒书评送书活动,在q=%E4%BA%9A%E9%A9%AC%E9%80%8A&ie=utf-8&src=se_lighten_f" style="color:rgb(51,102,153); text-decoration:none; font-family:Arial; font-size:14px; line-heigh

自己动手写CPU之第七阶段(9)——除法指令说明及实现思路

将陆续上传本人写的新书<自己动手写CPU>,今天是第32篇,我尽量每周四篇 亚马逊的销售地址如下,欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8/ref=cm_sw_r_si_dp_5kq8tb1gyhja4 China-pub的销售地址如下: http://product.china-pub.com/3804025 北发的销售地址如下: http://book.beifabook.com/Product/BookDetail.aspx?Plucode=

自己动手写CPU之第七阶段(10)——除法指令实现过程1

将陆续上传本人写的新书<自己动手写CPU>,今天是第33篇,我尽量每周四篇 亚马逊的销售地址如下,欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8/ref=cm_sw_r_si_dp_5kq8tb1gyhja4 China-pub的销售地址如下: http://product.china-pub.com/3804025 在京东.北发等网上书店均有! 除法指令的实现过程有点长,分两篇博文介绍,今天是第一篇. 7.12 修改OpenMIPS以实现除法指令 7.

自己动手写CPU之第七阶段(3)——简单算术操作指令实现过程(续)

将陆续上传本人写的新书<自己动手写CPU>,今天是第26篇,我尽量每周四篇 China-pub的预售地址如下(有目录.内容简介.前言): http://product.china-pub.com/3804025 亚马逊的预售地址如下,欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8/ref=cm_sw_r_si_dp_5kq8tb1gyhja4 为了实现简单算术指令,需要修改译码阶段的ID模块.执行阶段的EX模块,上一篇博文中已经介绍了对译码阶段ID模块的