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

开展晒书评送书活动,在亚马逊、京东、当当三大图书站点上,发表《自己动手写CPU》书评的前十名读者,均可获赠《步步惊芯——软核处理器内部设计分析》一书,大家踊跃參与吧!活动时间:2014-9-11至2014-10-20

8.4.3 改动运行阶段的EX 模块

參考图8-6可知,EX模块须要添加一些接口,添加的接口描写叙述如表8-4所看到的。

EX模块的代码主要改动例如以下,完整代码请參考本书附带光盘Code\Chapter8文件夹下的ex.v文件。

module ex(

  ......

  // 处于运行阶段的转移指令要保存的返回地址
input wire[`RegBus] link_address_i, // 当前运行阶段的指令是否位于延迟槽
input wire is_in_delayslot_i, ...... ); ...... always @ (*) begin ...... case ( alusel_i )
`EXE_RES_LOGIC: begin
wdata_o <= logicout;
end
`EXE_RES_SHIFT: begin
wdata_o <= shiftres;
end
`EXE_RES_MOVE: begin
wdata_o <= moveres;
end
`EXE_RES_ARITHMETIC: begin
wdata_o <= arithmeticres;
end
`EXE_RES_MUL: begin
wdata_o <= mulres[31:0];
end
`EXE_RES_JUMP_BRANCH: begin
wdata_o <= link_address_i;
end
default: begin
wdata_o <= `ZeroWord;
end
endcase
end ...... endmodule

假设alusel_o为EXE_RES_JUMP_BRANCH,那么就将返回地址link_address_i作为要写入目的寄存器的值赋给wdata_o。

注意一点,此处并没有利用输入的信号is_in_delayslot_i,该信号表示当前处于运行阶段的指令是否是延迟槽指令,这个信号会在异常处理过程中使用到,本章临时不须要。

8.4.4 改动OpenMIPS模块

由于有一些模块加入了接口,所以须要改动顶层模块OpenMIPS,以将这些新添加的接口依照图8-6所看到的的关系连接起来。详细改动也非常easy,不在书中列出,读者能够參考本书附带光盘Code\Chapter8文件夹下的openmips.v文件。

8.5 測试转移指令的实现效果

本节将通过两个測试程序验证转移指令是否实现正确,这两个測试程序分别验证跳转指令、分支指令。

8.5.1 測试跳转指令

測试代码例如以下,源文件是本书光盘Code\Chapter8\AsmTest\Test1文件夹下的inst_rom.S文件。

.org 0x0
.set noat
.set noreorder # 加入这个伪操作,指示编译器不要对程序做出不论什么优化或是修改
.set nomacro
.global _start
_start:
ori $1,$0,0x0001 # (1)$1 = 0x1
j 0x20 # 转移到0x20处
ori $1,$0,0x0002 # (2)$1 = 0x2,这是延迟槽指令
ori $1,$0,0x1111
ori $1,$0,0x1100 .org 0x20
ori $1,$0,0x0003 # (3)$1 = 0x3
jal 0x40 # 转移到0x40处,同一时候设置$31为0x2c
div $zero,$31,$1 # (4)此时$31 = 0x2c, $1 = 0x3,所以得到除法结果
# HI = 0x2, LO = 0xe,这是延迟槽指令 ori $1,$0,0x0005 # (6)$1 = 0x5
ori $1,$0,0x0006 # (7)$1 = 0x6
j 0x60 # 转移到0x60处
nop .org 0x40
jalr $2,$31 # 此时$31为0x2c,所以转移到0x2c,同一时候设置$2为0x48
or $1,$2,$0 # (5)$1 = 0x48,这是延迟槽指令 ori $1,$0,0x0009 # (10)$1 = 0x9
ori $1,$0,0x000a # (11)$1 = 0xa
j 0x80 # 转移到0x80处
nop .org 0x60
ori $1,$0,0x0007 # (8)$1 = 0x7
jr $2 # 此时$2为0x48,所以转移到0x48处
ori $1,$0,0x0008 # (9)$1 = 0x8,这是延迟槽指令
ori $1,$0,0x1111
ori $1,$0,0x1100 .org 0x80
nop _loop:
j _loop
nop

8.5.2 測试分支指令

測试代码例如以下,源文件是本书光盘Code\Chapter8\AsmTest\Test2文件夹下的inst_rom.S文件。

.org 0x0
.set noat
.set noreorder
.set nomacro
.global _start
_start:
ori $3,$0,0x8000
sll $3,16 # 设置$3 = 0x80000000
ori $1,$0,0x0001 #(1)$1 = 0x1
b s1 # 转移到s1处
ori $1,$0,0x0002 #(2)$1 = 0x2,这是延迟槽指令
1:
ori $1,$0,0x1111
ori $1,$0,0x1100 .org 0x20
s1:
ori $1,$0,0x0003 #(3)$1 = 0x3
bal s2 # 转移到s2处,同一时候设置$31为0x2c
div $zero,$31,$1 #(4)此时$31 = 0x2c, $1 = 0x3,所以除法结果为
# HI = 0x2, LO = 0xe,这是延迟槽指令
ori $1,$0,0x1100
ori $1,$0,0x1111
bne $1,$0,s3
nop
ori $1,$0,0x1100
ori $1,$0,0x1111 .org 0x50
s2:
ori $1,$0,0x0004 #(5)$1 = 0x4
beq $3,$3,s3 # $3等于$3,所以会发生转移,目的地址是s3
or $1,$31,$0 #(6)$1 = 0x2c,这是延迟槽指令
ori $1,$0,0x1111
ori $1,$0,0x1100
2:
ori $1,$0,0x0007 #(9)$1 = 0x7
ori $1,$0,0x0008 #(10)$1 = 0x8
bgtz $1,s4 # 此时$1为0x8,大于0,所以转移至标号s4处
ori $1,$0,0x0009 #(11)$1 = 0x9,这是延迟槽指令
ori $1,$0,0x1111
ori $1,$0,0x1100 .org 0x80
s3:
ori $1,$0,0x0005 #(7)$1 = 0x5
bgez $1,2b # 此时$1为0x5,大于0,所以转移至前面的标号2处
ori $1,$0,0x0006 #(8)$1 = 0x6,这是延迟槽指令
ori $1,$0,0x1111
ori $1,$0,0x1100 .org 0x100
s4:
ori $1,$0,0x000a #(12)$1 = 0xa
bgezal $3,s3 # 此时$3为0x80000000,小于0,所以不发生转移
or $1,$0,$31 #(13)$1 = 0x10c
ori $1,$0,0x000b #(14)$1 = 0xb
ori $1,$0,0x000c #(15)$1 = 0xc
ori $1,$0,0x000d #(16)$1 = 0xd
ori $1,$0,0x000e #(17)$1 = 0xe
bltz $3,s5 # 此时$3为0x80000000,小于0,所以发生转移,转移至s5处
ori $1,$0,0x000f #(18)$1 = 0xf,这是延迟槽指令
ori $1,$0,0x1100 .org 0x130
s5:
ori $1,$0,0x0010 #(19)$1 = 0x10
blez $1,2b # 此时$1为0x10,大于0,所以不发生转移
ori $1,$0,0x0011 #(20)$1 = 0x11
ori $1,$0,0x0012 #(21)$1 = 0x12
ori $1,$0,0x0013 #(22)$1 = 0x13
bltzal $3,s6 # 此时$3为0x80000000,小于0,所以发生转移,转移到s6处
or $1,$0,$31 #(23)$1 = 0x14c,这是延迟槽指令
ori $1,$0,0x1100 .org 0x160
s6:
ori $1,$0,0x0014 #(24)$1 = 0x14
nop _loop:
j _loop
nop

上面的測试程序使用到了全部的分支指令,程序的凝视给出了寄存器$1的变化情况,及指令运行顺序,注意寄存器$1的变化是依照凝视中的序号顺序进行的。ModelSim仿真结果如图8-9所看到的,观察$1的变化可知OpenMIPS正确实现了分支指令。

至此,转移指令也实现完成了,下一步将实现载入存储指令,敬请关注!

自己动手写CPU之第八阶段(4)——转移指令实现过程2的更多相关文章

  1. 自己动手写CPU之第七阶段(7)——乘累加指令的实现

    将陆续上传本人写的新书<自己动手写CPU>.今天是第30篇.我尽量每周四篇 亚马逊的销售地址例如以下.欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8 ...

  2. 自己动手写CPU之第五阶段(1)——流水线数据相关问题

    将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第15篇,我尽量每周四篇 上一章建立了原始的OpenMIPS五级流水线结构,可是仅仅实现了一条ori指令,从本章開始,将逐步完 ...

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

    将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第21篇,我尽量每周四篇 6.2 移动操作指令实现思路 6.2.1 实现思路 这6条移动操作指令能够分为两类:一类是不涉及特殊 ...

  4. 自己动手写CPU之第四阶段(3)——MIPS编译环境的建立

    将陆续上传本人写的新书<自己动手写CPU>(尚未出版).今天是第13篇.我尽量每周四篇 4.4 MIPS编译环境的建立 OpenMIPS处理器在设计的时候就计划与MIPS32指令集架构兼容 ...

  5. 自己动手写CPU之第五阶段(2)——OpenMIPS对数据相关问题的解决措施

    将陆续上传本人写的新书<自己动手写CPU>(尚未出版).今天是第16篇.我尽量每周四篇 5.2 OpenMIPS对数据相关问题的解决措施 OpenMIPS处理器採用数据前推的方法来解决流水 ...

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

    将陆续上传本人写的新书<自己动手写CPU>.今天是第25篇.我尽量每周四篇 亚马逊的预售地址例如以下,欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8 ...

  7. 自己动手写CPU之第七阶段(5)——流水线暂停机制的设计与实现

    将陆续上传本人写的新书<自己动手写CPU>,今天是第28篇.我尽量每周四篇 China-pub的预售地址例如以下(有文件夹.内容简单介绍.前言): http://product.china ...

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

    将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第17篇.我尽量每周四篇 5.4 逻辑.移位操作与空指令说明 MIPS32指令集架构中定义的逻辑操作指令有8条:and.and ...

  9. 自己动手写CPU之第七阶段(6)——乘累加指令实现思路

    将陆续上传本人写的新书<自己动手写CPU>.今天是第29篇.我尽量每周四篇 亚马逊的销售地址例如以下,欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8 ...

随机推荐

  1. SVN模型仓库中的资源从一个地方移动到另一个地方的办法(很久才解决)

    弄了很久,想使用domove这个操作,但是都失败了.最后给svnkit的邮箱写了封邮件,他们告诉我这样做就成功了.实际上是使用docopy这个函数实现了move操作.package com.repos ...

  2. SWT的TitleAreaDialog详解

    转自:http://www.cnblogs.com/AllenYoung/archive/2006/10/05/521805.html Dialog是SWT和JFace的一个重要的组成部分,我们在开发 ...

  3. sublime text 2安装及使用

    1.首先下载Sublime Text:http://www.sublimetext.com/ 2.基本设置.參考此文:http://blog.jobbole.com/40660/ { "au ...

  4. c语言移位操作

    应该先看看C语言是指所有的位二进制算术位计算.即使输入的是十进制的数,在存储器存储为二进制形式. “<<”使用方法: 的格式是:a<<m,a和m式,要求m>=0. 功能: ...

  5. SQL:多表关联采取这一纪录迄今为止最大

    笔者:iamlasong 1.需求 两个表,投递记录表和封发开拆记录表,如今想知道投递日期距最后一次封发日期天数分布情况. 对这个需求,须要先查询出投递明细,同一时候要知道相应的邮件最后一次封发情况. ...

  6. 京东评论情感分类器(基于bag-of-words模型)

    京东评论情感分类器(基于bag-of-words模型) 近期在本来在研究paraVector模型,想拿bag-of-words来做对照. 数据集是京东的评论,经过人工挑选,选出一批正面和负面的评论. ...

  7. FZUOJ Problem 2178 礼品配送

    Problem 2178 礼物分配 题目链接: Click Here~ Problem Description 在双胞胎兄弟Eric与R.W的生日会上,他们共收到了N个礼物,生日过后他们决定分配这N个 ...

  8. 构建轻量级的Table View注意事项[UIKit]

    參考文章来自objcio站点 一.使用ChildViewController 将Table ViewController作为Child View Controller加入到其它View Control ...

  9. Composite Design Pattern 设计模式组合

    设计模式组合,它能够更类组合在一类,形成一个树状结构. #include <set> #include <iostream> #include <string> u ...

  10. Bash ShellShock 解决办法

    2014 年 9 月 24 日,Bash 惊爆严重安全漏洞,编号为 CVE-2014-6271,该漏洞将导致远程攻击者在受影响的系统上执行任意代码.GNU Bash 是一个为 GNU 计划编写的 Un ...