目录
8.4.3 修改执行阶段的EX 模块
8.4.4 修改OpenMIPS模块
8.5 测试转移指令的实现效果
8.5.1 测试跳转指令
8.5.2 测试分支指令
首页 数据库 mysql教程 自己动手写CPU之第八阶段(4)转移指令实现过程2

自己动手写CPU之第八阶段(4)转移指令实现过程2

Jun 07, 2016 pm 03:20 PM
cpu 实现 手写 指令 自己 转移 过程 阶段

将陆续上传本人写的新书《 自己动手写CPU 》,今天是第36篇,我尽量每周四篇 开展晒书评送书活动,在亚马逊、京东、当当三大图书网站上,发表《自己动手写CPU》书评的前十名读者,均可获赠《步步惊芯——软核 处理器 内部 设计 分析 》一书,大家踊跃参与吧

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

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


8.4.3 修改执行阶段的EX 模块

      参考图8-6可知,EX模块需要增加一些接口,增加的接口描述如表8-4所示。

自己动手写CPU之第八阶段(4)转移指令实现过程2

      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 <br>

<p>      如果alusel_o为EXE_RES_JUMP_BRANCH,那么就将返回地址link_address_i作为要写入目的寄存器的值赋给wdata_o。</p>
<p>      注意一点,此处并没有利用输入的信号is_in_delayslot_i,该信号表示当前处于执行阶段的指令是否是延迟槽指令,这个信号会在异常处理过程中使用到,本章暂时不需要。</p>
<h3 id="修改OpenMIPS模块">8.4.4 修改OpenMIPS模块</h3>
<p>      因为有一些模块添加了接口,所以需要修改顶层模块OpenMIPS,以将这些新增加的接口按照图8-6所示的关系连接起来。具体修改也很简单,不在书中列出,读者可以参考本书附带光盘Code\Chapter8目录下的openmips.v文件。</p>
<h2 id="测试转移指令的实现效果">8.5 测试转移指令的实现效果</h2>
<p>      本节将通过两个测试程序验证转移指令是否实现正确,这两个测试程序分别验证跳转指令、分支指令。</p>
<h3 id="测试跳转指令">8.5.1 测试跳转指令</h3>
<p>      测试代码如下,源文件是本书光盘Code\Chapter8\AsmTest\Test1目录下的inst_rom.S文件。</p>
<pre class="brush:php;toolbar:false">.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
登录后复制

自己动手写CPU之第八阶段(4)转移指令实现过程2

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


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

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

泰拉瑞亚怎么用指令获得物品?-泰拉瑞亚怎么收藏物品? 泰拉瑞亚怎么用指令获得物品?-泰拉瑞亚怎么收藏物品? Mar 19, 2024 am 08:13 AM

泰拉瑞亚怎么用指令获得物品?一、什么是泰拉瑞亚给予物品指令在泰拉瑞亚游戏中,给予物品指令是一项非常实用的功能。通过这个指令,玩家可以直接获取需要的物品,而不必费力地去打怪或者传送到某个地点。这样可以极大地节省时间,提高游戏的效率,让玩家更专注于探索和建设世界。总的来说,这个功能让游戏体验变得更加流畅和愉快。二、如何使用泰拉瑞亚给予物品指令1.打开游戏并进入游戏界面。2.按下键盘上的“Enter”键,打开聊天窗口。3.在聊天窗口中输入指令的格式:“/give[玩家名称][物品ID][物品数量]”。

WIN10服务主机太占cpu的处理操作过程 WIN10服务主机太占cpu的处理操作过程 Mar 27, 2024 pm 02:41 PM

1、首先我们右击任务栏空白处,选择【任务管理器】选项,或者右击开始徽标,然后再选择【任务管理器】选项。2、在打开的任务管理器界面,我们点击最右端的【服务】选项卡。3、在打开的【服务】选项卡,点击下方的【打开服务】选项。4、在打开的【服务】窗口,右击【InternetConnectionSharing(ICS)】服务,然后选择【属性】选项。5、在打开的属性窗口,将【打开方式】修改为【禁用】,点击【应用】后点击【确定】。6、点击开始徽标,然后点击关机按钮,选择【重启】,完成电脑重启就行了。

144 核心,3D 堆叠 SRAM:富士通详细介绍下一代数据中心处理器 MONAKA 144 核心,3D 堆叠 SRAM:富士通详细介绍下一代数据中心处理器 MONAKA Jul 29, 2024 am 11:40 AM

本站7月28日消息,据外媒TechRader报道,富士通详细介绍了计划于2027年出货的FUJITSU-MONAKA(以下简称MONAKA)处理器。MONAKACPU基于“云原生3D众核”架构,采用Arm指令集,面向数据中心、边缘与电信领域,适用于AI计算,能实现大型机级别的RAS1。富士通表示,MONAKA将在能效和性能方面实现飞跃:得益于超低电压(ULV)工艺等技术,该CPU可实现2027年竞品2倍的能效,冷却无需水冷;此外该处理器的应用性能也可达对手2倍。在指令方面,MONAKA配备的矢量

泄漏揭示了英特尔 Arrow Lake-U、-H、-HX 和 -S 的关键规格 泄漏揭示了英特尔 Arrow Lake-U、-H、-HX 和 -S 的关键规格 Jun 15, 2024 pm 09:49 PM

英特尔ArrowLake预计将基于与LunarLake相同的处理器架构,这意味着英特尔全新的LionCove性能核心将与经济的Skymont效率核心相结合。而LunarLake仅作为ava推出

AM4 拒绝死亡,消息称 AMD 将推出 Ryzen 9 5900XT /7 5800XT:主频最高 4.8GHz AM4 拒绝死亡,消息称 AMD 将推出 Ryzen 9 5900XT /7 5800XT:主频最高 4.8GHz Jun 05, 2024 pm 09:43 PM

本站6月1日消息,消息源@CodeCommando今天发布推文,分享了AMD即将在Computex2024活动中的部分演示文档截图,推文内容为“AM4永不消亡”,配图展示了两款新的Ryzen5000XT系列处理器。根据截图内容显示以下两款产品:Ryzen95900XTRyzen95900XT定位相对高端,这是一款全新的16核AM4处理器,其时钟速度略低于AMD的Ryzen95950X。Ryzen75800XT它是AMD现有Ryzen75800X处理器的更快变体,这两款处理器的主频最高可达4.8G

华为手机如何实现双微信登录? 华为手机如何实现双微信登录? Mar 24, 2024 am 11:27 AM

华为手机如何实现双微信登录?随着社交媒体的兴起,微信已经成为人们日常生活中不可或缺的沟通工具之一。然而,许多人可能会遇到一个问题:在同一部手机上同时登录多个微信账号。对于华为手机用户来说,实现双微信登录并不困难,本文将介绍华为手机如何实现双微信登录的方法。首先,华为手机自带的EMUI系统提供了一个很便利的功能——应用双开。通过应用双开功能,用户可以在手机上同

完美解决Chrome浏览器CPU占用过高问题的办法 完美解决Chrome浏览器CPU占用过高问题的办法 Mar 14, 2024 pm 12:25 PM

  有用户在电脑运行过程中,发现任务管理器里谷歌浏览器占用了极高的CPU,如果不及时处理的话,电脑就变得越来越卡,甚至出现死机。那么Chrome浏览器CPU占用过高要如何处理呢?下面就来一起看看这个问题。谷歌浏览器的高CPU占用问题通常是由于“SoftwareReporterTool”在任务管理器中异常运行。这个工具实际上是Chrome浏览器的清理工具,用于清理掉不必要或有害的扩展、应用程序或首页劫持等。当安装Chrome时,Software_reporter_tool.exe也会被下载到SwR

2024最新CPU天梯图分享(详细高清) 2024最新CPU天梯图分享(详细高清) Mar 13, 2024 pm 08:19 PM

  游戏性能的高低和cpu有很大的关系,对于爱好游戏的用户来说cpu的性能是电脑配置的重点,尤其LOL,CS:GO这些,直接看单核性能比较准确客观,一些大型的3D游戏主要看显卡+CPU调度情况,那么哪些cpu性能较好呢?本篇文章就来为大家介绍一下天体图。  最新CPU天梯图高清完整版

See all articles