찾다
데이터 베이스MySQL 튜토리얼自己动手写CPU之第八阶段(4)转移指令实现过程2
自己动手写CPU之第八阶段(4)转移指令实现过程2Jun 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으로 문의하세요.
核心数和线程数是什么意思核心数和线程数是什么意思Sep 01, 2022 pm 04:52 PM

核心数指的是CPU内核数量,表示一个CPU由多少个核心组成;cpu核心是CPU的重要组成部件,在内核频率、缓存大小等条件相同的情况下,CPU核心数量越多,CPU的整体性能越强。线程数是一种逻辑的概念,简单地说,就是模拟出的CPU核心数。CPU之所以要增加线程数,是源于多任务处理的需要;线程数越多,越有利于同时运行多个程序,因为线程数等同于在某个瞬间CPU能同时并行处理的任务数。

多核和单核的区别是什么多核和单核的区别是什么Aug 02, 2022 pm 02:04 PM

区别:1、单核就是CPU集成了一个运算核心,多核就是CPU集成了两个或多个运算核心;2、单核能同时运行的线程数较多核更少,不利于同时运行多个程序,而多核有利于同时运行多个程序;3、单核的执行速度较多核更慢,容易造成卡顿;4、多核的多任务处理效率比单核高;5、多核的性能比单核高,散热量、耗电量也比单核大;6、单核多用于部分要求轻薄、待机时间长、而对性能要求不高的笔记本电脑上。

12核16线程是什么意思12核16线程是什么意思Aug 24, 2022 am 11:45 AM

12核16线程指的是CPU中有12个内核,CPU的线程是16个,最多可以模拟16个核心;CPU的核心是运算器和控制器,多核可以增强并行处理能力,线程是进程中某个单一顺序的控制流,在单个程序中同时运行多个线程完成不同的工作,称为多线程。

cpu温度高是什么原因引起的cpu温度高是什么原因引起的Nov 28, 2022 am 10:25 AM

cpu温度高的原因:1、散热不良;2、机器内灰尘过多也会引起死机故障;3、内存条故障;4、CPU超频;5、 硬盘故障;6、软硬件不兼容;7、驱动程序安装有误;8、应用软件的缺陷;9、病毒感染;10、启动的程序太多;11、用非法格式或参数非法打开或释放有关程序;12、误删除了系统文件;13、CMOS设置不当。

cpu能直接存取内存储器上的数据吗cpu能直接存取内存储器上的数据吗Nov 25, 2022 pm 02:02 PM

能直接存取。内存储器又称内存,是外存与CPU进行沟通的桥梁,计算机中所有程序的运行都是在内存中进行。内存的作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机运行,操作系统就会把需要运算的数据从内存调到CPU中进行运算;当运算完成后,CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行。

cpu温度过高会导致什么情况cpu温度过高会导致什么情况Feb 01, 2023 am 10:53 AM

cpu温度过高导致的影响:1、CPU有自我保护功能,CPU过高会自动开启保护系统,降低电脑运行速率,系统越来越慢,直至死机,反复重启;2、长时间高温(长时间85度以上),CPU的自我保护功能可能失效,会烧坏CPU;3、自动关机,且关机之后,温度未降低之前无法开机。

手机的cpu和gpu是什么意思手机的cpu和gpu是什么意思Nov 16, 2022 pm 02:13 PM

手机CPU指的是手机处理器,它是整台手机的控制中枢系统,也是逻辑部分的控制中心;手机CPU通过运行存储器内的软件及调用存储器内的数据库,达到控制目的。手机CPU指的是手机的图形处理器,是显示卡的大脑,它决定了该显卡的档次和大部分性能,在手机主板上,GPU芯片一般都是紧挨着CPU芯片的。

cpu接口类型有几种cpu接口类型有几种Feb 01, 2023 am 10:43 AM

有14种:Socket 478、Socket 775、Socket 754、Socket 939、Socket 940、Socket 603、Socket 604、Socket A、Socket B、Socket 423、Socket 370、SLOT 1、SLOT 2、SLOT A。其中Socket 478是早期Pentium 4系列处理器所采用的接口类型,针脚数为478针。

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.