您好、欢迎来到现金彩票网!
当前位置:2019欢乐棋牌 > 转移延迟槽 >

MIPS

发布时间:2019-06-24 22:09 来源:未知 编辑:admin

  流水线中经常有一些被称为“相关”的情况发生,它使得指令序列中下一条指令无法按照设计的时钟周期执行,这些“相关”会降低流水线的性能。流水线中的相关分为三种类型。

  (1)结构相关:指的是在指令执行的过程中,由于硬件资源满足不了指令执行的要求,发生硬件资源冲突而产生的相关。比如:指令和数据都共享一个存储器,在某个时钟周期,流水线既要完成某条指令对存储器中数据的访问操作,又要完成后续的取指令操作,这样就会发生存储器访问冲突,产生结构相关。

  (2)数据相关:指在流水线中执行的几条指令中,一条指令依赖于前面指令的执行结果。

  (3)控制相关:指流水线中的分支指令或者其他需要改写PC的指令造成的相关。

  结构相关、控制相关将在后续指令分析中讨论,本节重点讨论数据相关的问题。流水线数据相关又分为三种情况:RAW、WAR、WAW。

  RAW:Read After Write,假设指令j是在指令i后面执行的指令,RAW表示指令i将数据写入寄存器后,指令j才能从这个寄存器读取数据。如果指令j在指令i写入寄存器前尝试读出该寄存器的内容,将得到不正确的数据。

  WAR:Write After Read,假设指令j是在指令i后面执行的指令,WAR表示指令i读出数据后,指令j才能写这个寄存器。如果指令j在指令i读出数据前就写该寄存器,将使得指令i读出的数据不正确。

  WAW:Write After Write,假设指令j是在指令i后面执行的指令,WAW表示指令i将数据写入寄存器后,指令j才能将数据写入这个寄存器。如果指令j在指令i之前写该寄存器,将使得该寄存器的值不是最新值。

  对于第4章建立的原始OpenMIPS五级流水线而言,从ori指令的实现过程可以知道,只有在流水线回写阶段才会写寄存器(实际上其余指令也是一样的,在后面实现其余指令时,对这一点会更加清楚),因此不存在WAW相关。又因为只能在流水线译码阶段读寄存器、回写阶段写寄存器,所以不存在WAR相关,所以OpenMIPS的流水线只存在RAW相关。RAW相关有三种情况。

  第1条ori指令会写寄存器$1,随后的第2条ori指令需要读出$1的数据,但是第1条ori指令在回写阶段才会将其运算结果写入$1,而第2条ori指令在译码阶段就需要读取$1的值,此时第1条ori指令还处于执行阶段,所以得到的必然不是第1条ori指令计算得出的结果,按这个值运算,必然会出错。如图5-1所示。这种情况可以称为相邻指令间存在数据相关,针对OpenMIPS具体情况,也可以称为流水线译码、执行阶段存在数据相关。

  第1条ori指令会写寄存器$1,第3条ori指令在译码阶段需要读取寄存器$1,此时第1条ori指令还处于访存阶段,所以得到的必然也不是正确的值。如图5-2所示。这种情况可以称为相隔1条指令的指令间存在数据相关,针对OpenMIPS具体情况,也可以称为流水线译码、访存阶段存在数据相关。

  第1条ori指令会写寄存器$1,第4条ori指令在译码阶段需要读取寄存器$1,此时第1条指令处于回写阶段,在回写阶段最后的时钟上升沿才会将运算结果写入$1,所以第4条ori指令得到的不是正确的寄存器$1的值。如图5-3所示。这种情况可以称为相隔2条指令的指令间存在数据相关,针对OpenMIPS具体情况,也可以称为流水线译码、回写阶段存在数据相关。

  其中相隔2条指令存在数据相关(即流水线译码、回写阶段存在数据相关)这种情况,在第4章设计的Regfile模块中已经得到了解决,Regfile模块部分代码如下。

  // raddr1是读地址、waddr是写地址、we是写使能、wdata是要写入的数据

  // raddr2是读地址、waddr是写地址、we是写使能、wdata是要写入的数据

  在读操作中有一个判断,如果要读取的寄存器,是在下一个时钟上升沿要写入的寄存器,那么就将要写入的数据直接作为结果输出。如此就解决了相隔2条指令存在数据相关的情况。

  对于相邻指令间存在数据相关、相隔1条指令的指令间存在数据相关这两种情况,有三种解决方法。

  (1)插入暂停周期:当检测到相关时,在流水线中插入一些暂停周期,如图5-4所示。

  (2)编译器调度:编译器检测到相关后,可以改变部分指令的执行顺序,如图5-5所示。

  (3)数据前推:将计算结果从其产生处直接送到其他指令需要处或所有需要的功能单元处,避免流水线条ori指令的执行阶段已经计算出来了,可以直接将该值从第1条ori指令的执行阶段送入第2条ori指令的译码阶段,从而使得第2条ori指令在译码阶段得到$1的新值。也可以直接将该值从第1条ori指令的访存阶段送入第3条ori指令的译码阶段,从而使得第3条ori指令在译码阶段也得到$1的新值。

  读者需要注意,第(3)种方法有一个前提就是新的寄存器的值可以在执行阶段计算出来,如果是加载指令,那么就不满足这个前提,因为加载指令在访存阶段才能获得最终结果,这是一种load相关,本书将在实现加载存储指令的时候考虑这种情况,本章暂不考虑。

  OpenMIPS处理器采用数据前推的方法来解决流水线数据相关问题。通过补充完善图4-4原始的数据流图,添加部分信号使得可以完成数据前推的工作,如图5-7所示。主要是将执行阶段的结果、访存阶段的结果前推到译码阶段,参与译码阶段选择运算源操作数的过程。

  图5-8给出了为实现数据前推而对OpenMIPS系统结构所做的修改。有两个方面。

  (1)将处于流水线执行阶段的指令的运算结果,包括:是否要写目的寄存器wreg_o、要写的目的寄存器地址wd_o、要写入目的寄存器的数据wdata_o等信息送到译码阶段,如图5-8中虚线)将处于流水线访存阶段的指令的运算结果,包括:是否要写目的寄存器wreg_o、要写的目的寄存器地址wd_o、要写入目的寄存器的数据wdata_o等信息送到译码阶段。

  以等待这些多周期指令执行完毕,一种直观的实现方法是:要暂停流水线,只需保持取指令地址PC的值不变,同时保持流水线各个阶段的寄存器(也就是IF/ID、ID/EX、EX/MEM、MEM/WB模块的输出)不变。OpenMIPS采用的是一种改进的方法:假如位于流水线第n阶段的指令需要多个时钟周期,进而请求流水线暂停,那么需保持取指令地址PC的值不变,同时保持流水线第n阶段、第n阶段之前的各个阶段的寄存器不变,而第n阶段后面的指令继续运行。比如:流水线执行阶段的指令请求流水线暂停,那么保持PC不变,同时保持取指、译码、执行阶段的寄存器不变,但是可以允许访存、回写阶段的指令继续运行。

  为此,设计添加CTRL模块,其作用是接收各个阶段传递过来的流水线暂停请求信号,从而控制流水线各个阶段的运行。为了实现流水线暂停机制,对系统结构做如图7-10所示的修改。

  CTRL模块对暂停请求信号进行判断,然后输出流水线暂停信号stall。从图7-10中可知,stall输出到PC、IF/ID、ID/EX、EX/MEM、MEM/WB等模块,从而控制PC的值,以及流水线各个阶段的寄存器。

  数据需要再访存的时候才有,但访存的时候下一条指令已经到了执行阶段。所以解决方法:在译码阶段检查当前指令与前一个指令是否有LOAD相关的问题,如果有,就让流水线的译码,取指暂停一个周期,然后再将访存阶段的数据前推到译码阶段,这样就解决了load相关(相当于要把访存阶段的数据往前推两个阶段,一个暂停加一个前推,刚好往前走两步)

  流水线中,分支指令执行时因为确定下一条指令的目标地址(紧随其后 or 跳转目标处?)一般要到第 2 级以后,在目标确定前流水线的取指级是不能工作的,即整个流水线就“浪费”(阻塞)了一个时间片,为了利用这个时间片,在体系结构的层面上规定跳转指令后 面的一个时间片为分支延迟槽(branch delay slot)。位于分支延迟槽中的指令总是被执行,与分支发生与否没有关系。这样就有效利用了一个时间片,消除了流水线的一个“气泡”。Q1:为什么跳转指令或者分支指令之后的两个指令无效,

  答:猜测是因为跳转指令执行后,希望继续执行的是新位置之后的指令,但是由于跳转指令或者分支指令是在执行阶段才有效,取指和译码阶段依旧是原来位置递增的两个指令,所以是两个无效的指令。

  ,因为跳转指令是在执行阶段才有效,所以会有连个时钟周期的浪费(取指和译码),通过设置延迟槽,可以避免浪费一个时钟周期(译码),又通过将转移判断提前到译码阶段,就可以再避免一个周期的浪费(取指)Q3:分支指令的返回地址答:如果没出现异常,返回地址是转移指令之后的第二条指令的地址(第一条是延迟槽指令,已经被执行了,),

  简单说,一般CPU的分支跳转指令流是:分支跳转指令-目标跳转地址的指令。

  如果PC在延时槽地址中断后,中断返回时返回延时槽指令地址的话,重新执行的指令流为:延时槽指令 - (延时槽指令地址 + 4)地址的指令,没有跳转了!

  这样完全不是原来被打断的指令流,为了恢复原来的指令流需要将延时槽前面的跳转指令重新装入流水线。

  MIPSMillionInstructionsPerSecond的缩写,每秒处理的百万级的机器语言指令数。这是衡量CPU速度的一个指标。像是一个Intel80386电脑可以每秒处理3百万到5百万机器语...

  【参考原文】由于要在本地编译程序,在嵌入式系统上运行,因此需要在本地装编译器,目前主要...

  最近一年都在学习研究MIPS架构的东西,现在也在做Cavium的案子,所以把一些MIPS相关的东西整理一下。在学习MIPS架构的时候,肯定要涉及到相关的指令集,在x86上BIOS都需要熟练掌握汇编语言...

  MIPS指令 指令功能应用实例LB从存储器中读取一个字节的数据到寄存器中LBR1,0(R2)LH从存储器中读取半个字的数据到寄存器中LHR1,0(R2)LW从存储器中读取一个...

  20代表的是重复的个数,意思是在内存中创建了20个word,在mips当中,一个word相当于4个byte参考链接: 

  博客地址转至一、实验要求设计一个单周期MIPSCPU,依据给定过的指令集,设计核心的控制信号。依据给定的数据通路和控制单元信号进行设计。二、实验内容1.数据通路...

  mips体系结构下的汇编指令指令集是存储在CPU内部,对CPU运算进行指导和优化的硬程序。拥有这些指令集,CPU就可以更高效地运行。Mips汇编语言的风格汇编语言指令格式[标签:]操作符[操作数][#...

  MIPS架构与ARM架构都是小型设备的处理器架构。MIPS架构的处理器多用在网关、猫、机顶盒什么的。ARM处理器用在便携设备,智能手机。这两个东西的市场几乎很少重叠。普通用户关注MIPS主要还是因为我...

  标签:MIPS汇编汇编语言编程语言快速入门转载翻译原文MIPS汇编快速入门数据类型1.MIPS使用定长指令,所有指令都是32位长的2.1字节=8位,半字长=2个字节(32位),1字长=4个字节3.一个...

  MIPS通用寄存器MIPS有32个通用寄存器($0-$31),各寄存器的功能及汇编程序中使用约定如下:下表描述32个通用寄存器的别名和用途REGISTERNAMEUSAGE$0$zero常量0(con...

  定点与浮点在《计算机组成原理》有很详细的说明,但是电子专业的学生只学《单片机》,而《单片机》并没有介绍定点与浮点的内容,所以电子专业的学生缺了这点基础,导致在FPGA处理运算时遇到拦路虎。一、定点。定...

  CPU性能衡量参数-主频,MIPS,CPI,时钟周期,机器周期,指令周期1,主频主频=时钟频率,它是指CPU内部晶振的频率,常用单位为MHz,它反映了CPU的基本工作节拍;时钟频率又称主频,它是指CP...

  一、普及一些相关概念指令集:一个给定的计算机体系结构所包含的指令集合。存储程序概念:多种类型的指令和数据均以数字形式存储于存储器的概念,存储程序型计算机即缘于此。1二、MIPS操作数之32个寄存器寄存...

  mips-simulator项目地址:任务描述1.载入一个MIPS文件,生成与输入文件等效的汇编代码2.通过指令模拟MIP...

  程序目标从键盘输入10个无符号字数并从大到小进行排序,排序结果在屏幕上显示出来。准备工作编程的入门级知识:循环、冒泡排序、内存和堆栈的概念MIPS语法:程序基本结构汇编语言:不同寄存器作用、数据存储、...

  本文介绍mips体系结构中异常处理机制,并详细分析了系统调用异常的实现。

  ARM是业界领先的微处理器技术供应商,提供最广泛的微处理器内核,可满足几乎所有应用市场的性能、功耗和成本要求。 ARM的技术将一个充满活力的生态系统与超过1000个合作伙伴相结合,提供芯片,开发工具和...

  MIPS-单周期CPU设计设计一个单周期CPU,该CPU至少能实现以下指令功能操作。需设计的指令与格式如下:实验原理单周期CPU指的是一条指令的执行在一个时钟周期内完成,然后开始下一条指令的执行,即一...

  1、Kubernetes是什么Kubernetes是一个轻便的和可扩展的开源平台,用于管理容器化应用和服务。通过Kubernetes能够进行应用的自动化部署和扩缩容。在Kubernetes中,会将组成...

  MIPS指令集 详解及例子04-11MIPS 指令集的详解及例子, 有需要的请下载, 希望对你有帮助

  MIPS编程入门(妈妈说标题要高大上,才会有人看_!)05-25阅读数 6970

  最近在学习MIPS反汇编代码,参数传递约定已经理解了,但是函数调用却始终没能参透,求高手指点。 以下是两个简单的C函数TestFunc1与TestFunc2,以及对应的反汇编代码。 问题:如果没有对应

  jquery/js实现一个网页同时调用多个倒计时(最新的)11-25阅读数 54万+

  fifo 使用同步触发sinat_36337737:题主请问你在比较几乎满的时候预设间隔是怎么设置的

http://femi-speaks.com/zhuanyiyanchicao/86.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有