第10章 协处理器访问指令的实现

10.1 协处理器介绍

协处理器通常表示处理器的一个可选部件,负者处理指令集的某个扩展,具有与处理器核独立的寄存器。MIPS32架构提供了最多4个协处理器,分别是CP0~CP3,作用:
在这里插入图片描述

  • CP1、CP3用作浮点处理单元,CP2保留,除CP0外的协处理器都是可选的,OpenMIPS没有实现浮点运算,所以CP1,CP3不用实现,CP2也没有作用,而CP0是必须实现的。
  • 截至本章,我们的OpenMIPS处理器实现了很多指令,但是这些指令都是用来运算的,实际的处理器还要支持其他广泛的操作,例如:中断处理,提供可选的配置,观察并控制系统缓存或时钟,地址转换等。MIPS32架构定义的协处理器CP0的作用就是协助实现上述的广泛操作。主要负责工作如下:
  1. 配置cpu工作状态:符合MIPS32架构的硬件通常是很灵活的,可以童国读写一个或一些内部寄存器来改变一些根本的CPU特性(如:将字节次序从MSB变为LSB)
  2. 高速缓存控制:控制读写缓存
  3. 异常控制:异常发生时的检测核处理都由CP0中的一些控制寄存器来定义和控制
  4. 存储管理单元控制:对系统的存储区域进行合理控制、管理和分配,主要是对MMU、TLB的一些配置,管理、访问
  5. 其他:当要把额外的功能集成在CPU中,但又不方便当做外设访问时,常常在CP0中增加一些模块以实现这些功能例如:时钟,时间计数器,奇偶校验等

10.2 协处理器CP0中的寄存器

在这里插入图片描述
在这里插入图片描述
从表中可以发现很多寄存器都是与缓存、MMU、TLB、调试有关的,而OpenMIPS的设计目标是一个轻量级的处理器,并不打算实现缓存,MMU,TLB等复杂功能,所以相关寄存器都可以不用实现,本章主要实现以下7个寄存器:

  1. Count寄存器(标号9)
    在这里插入图片描述
    Count寄存器是一个不停计数的32位寄存器,技术频率一般与CPU时钟频率相同,当计数达到32位无符号的上限时,会从0开始重新计数。Count寄存器可读可写,其字段如表10-3所示:
    在这里插入图片描述
  2. Compare寄存器(标号11)
    Compare寄存器是一个32位的寄存器,与Count寄存器一起完成定时中断功能。当Count寄存器中的计数值与Compare寄存器中的值一样时,会产生定时中断。这个中断会一直保持,知道有数据被写入Compare寄存器。Compare寄存器可读可写。其字段如表10-4所示:
    在这里插入图片描述
  3. Status寄存器(标号12)
    Status寄存器也是一个32位可读可写的寄存器,用来控制处理器的操作模式、中断使能以及诊断状态。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  4. Cause 寄存器(标号13)
    用于记录最近一次异常发生的原因,也控制软件中断请求。Cause寄存器的各字段如表10-6所示,除了IP,IV和WP,其余字段都是只读的。
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
5. EPC寄存器(标号14)
异常程序计数器,存储异常返回地址
6. PRId寄存器(标号15)
处理器标志寄存器,包含:制造商信息,处理器类型以及处理器版本等。
在这里插入图片描述
7. Config寄存器
包含与处理器有关的各种配置和功能信息,大部分子弹由硬件在重启时进行初始化,或定为常量。
在这里插入图片描述
在这里插入图片描述
10.3 协处理器CP0的实现
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

10.4 协处理器访问指令说明

要实现CP0的控制功能,需要对CP0中的有关寄存器进行设置,这设计对CP0中寄存器的访问,需要使用处理器访问指令。MIPS32指令集架构中定义了2条协处理器访问指令:mtc0.mfc0,前者实现修改CP0中的寄存器,后者实现读取CP0中的寄存器。指令如图所示:
在这里插入图片描述
在这里插入图片描述

10.5 协处理器 访问指令实现思路

10.5.1 实现思路

与HI、LO寄存器的访问一样,对CP0中所有寄存器的写操作也都放在回写阶段。

  1. mtc0实现思路
    在这里插入图片描述
    在这里插入图片描述
  2. mfc0实现思路
    在这里插入图片描述

10.5.2 数据流图的修改

在这里插入图片描述

10.5.3 系统结构的修改

在这里插入图片描述

在这里插入图片描述

10.6 修改OpenMIPS以实现协处理器访问指令

10.6.1 修改译码阶段

10.6.2 修改执行阶段

  1. 修改EX模块
  2. 修改EX/MEM模块

修改访存阶段

  1. 修改MEM模块
  2. 修改MEM/WB模块

10.6.4 修改OpenMIPS模块

10.7 测试程序

猜你喜欢

转载自blog.csdn.net/tanfuz/article/details/113818578