自己写CPU第五级(5)——测试逻辑、实现移动和空指令
2015-07-02 10:34
323 查看
我们会继续上传新书《自己写CPU》(未公布),今天是19片,我每星期试试4
在程序的凝视中给出了程序预期运行效果,在这里就是寄存器$1-$4的变化情况。
将上述inst_rom.S文件,与第4章建立的Bin2Mem.exe、Makefile、ram.ld这三个文件复制到Ubuntu虚拟机中的同一个文件夹下。打开终端,使用cd命令进入该文件夹,然后输入make all,就可以得到用于ModelSim仿真的inst_rom.data文件。
在ModelSim中新建一个project,加入本书光盘Code\Chapter5_2文件夹下的全部.v文件,然后能够编译。
再复制上面得到的inst_rom.data文件到ModelSimproject的文件夹下。就能够进行仿真了。上述仿真步骤以后不再反复说明。
ModelSim仿真结果如图5-16所看到的,regs[1]、regs[2]、regs[3]、regs[4]各自是寄存器$1、$2、$3、$4,观察这4个寄存器值的变化,可知符合预期,所以OpenMIPS正确实现了逻辑操作指令。
在程序的凝视中给出了程序预期运行效果,主要就是寄存器$2的变化情况。
ModelSim仿真结果如图5-17所看到的,观察寄存器$2的变化能够知道OpenMIPS正确实现了移位操作指令与空指令。
当中。在ID模块加入对新指令的译码,在EX模块加入对新的运算类型的支持。
将从下一个操作命令,将实现,敬请关注!
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中新建一个project,加入本书光盘Code\Chapter5_2文件夹下的全部.v文件,然后能够编译。
再复制上面得到的inst_rom.data文件到ModelSimproject的文件夹下。就能够进行仿真了。上述仿真步骤以后不再反复说明。
ModelSim仿真结果如图5-16所看到的,regs[1]、regs[2]、regs[3]、regs[4]各自是寄存器$1、$2、$3、$4,观察这4个寄存器值的变化,可知符合预期,所以OpenMIPS正确实现了逻辑操作指令。
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正确实现了移位操作指令与空指令。
5.8 小结
本章首先分析了流水线中存在的数据相关问题,然后使用数据前推的方法攻克了数据相关问题。随后改动OpenMIPS。实现了对逻辑、移位操作和空指令的支持,主要改动的是译码阶段的ID模块、运行阶段的EX模块。当中。在ID模块加入对新指令的译码,在EX模块加入对新的运算类型的支持。
将从下一个操作命令,将实现,敬请关注!
相关文章推荐
- 查看网络图片
- 武当三丰太极拳28式 第二式 退步崩式 详解版
- COJ980 WZJ的数据结构(负二十)
- MFC 窗口自适应分辨率
- word文档转成pdf实用的方法
- 关于蓝牙通讯报 The operation is not allowed on non-connected sockets. 错误
- 【伯猫Java教程】网页游戏开发过程——Java与Flex的通信过程
- Nginx下支持Thinkphp URL Rewrite的配置示例
- Java实现二叉搜索树节点的删除
- apache防止目录列表漏洞
- jQuery入门:选择元素 Selecting Elements
- Activity与Fragment数据传递之Fragment之间获取数据
- 保存信息到手机里
- MiniTwitter记住密码等功能实现
- 大概简介
- 武当三丰太极拳28式 第一式 详解版
- sql 使用存储过程传递列名或表名作为参数
- Activity与Fragment数据传递之Fragment之间获取数据 分类: Android 2015-07-02 10:33 11人阅读 评论(0) 收藏
- 线程——委托InvokeRequired和Invoke
- ado.net 基础(一)