10.1 协处理器介绍
协处理器通常表示处理器的一个可选部件,负者处理指令集的某个扩展,具有与处理器核独立的寄存器。MIPS32架构提供了最多4个协处理器,分别是CP0~CP3,作用:
- CP1、CP3用作浮点处理单元,CP2保留,除CP0外的协处理器都是可选的,OpenMIPS没有实现浮点运算,所以CP1,CP3不用实现,CP2也没有作用,而CP0是必须实现的。
- 截至本章,我们的OpenMIPS处理器实现了很多指令,但是这些指令都是用来运算的,实际的处理器还要支持其他广泛的操作,例如:中断处理,提供可选的配置,观察并控制系统缓存或时钟,地址转换等。MIPS32架构定义的协处理器CP0的作用就是协助实现上述的广泛操作。主要负责工作如下:
- 配置cpu工作状态:符合MIPS32架构的硬件通常是很灵活的,可以童国读写一个或一些内部寄存器来改变一些根本的CPU特性(如:将字节次序从MSB变为LSB)
- 高速缓存控制:控制读写缓存
- 异常控制:异常发生时的检测核处理都由CP0中的一些控制寄存器来定义和控制
- 存储管理单元控制:对系统的存储区域进行合理控制、管理和分配,主要是对MMU、TLB的一些配置,管理、访问
- 其他:当要把额外的功能集成在CPU中,但又不方便当做外设访问时,常常在CP0中增加一些模块以实现这些功能例如:时钟,时间计数器,奇偶校验等
10.2 协处理器CP0中的寄存器
从表中可以发现很多寄存器都是与缓存、MMU、TLB、调试有关的,而OpenMIPS的设计目标是一个轻量级的处理器,并不打算实现缓存,MMU,TLB等复杂功能,所以相关寄存器都可以不用实现,本章主要实现以下7个寄存器:
- Count寄存器(标号9)
Count寄存器是一个不停计数的32位寄存器,技术频率一般与CPU时钟频率相同,当计数达到32位无符号的上限时,会从0开始重新计数。Count寄存器可读可写,其字段如表10-3所示:
- Compare寄存器(标号11)
Compare寄存器是一个32位的寄存器,与Count寄存器一起完成定时中断功能。当Count寄存器中的计数值与Compare寄存器中的值一样时,会产生定时中断。这个中断会一直保持,知道有数据被写入Compare寄存器。Compare寄存器可读可写。其字段如表10-4所示:
- Status寄存器(标号12)
Status寄存器也是一个32位可读可写的寄存器,用来控制处理器的操作模式、中断使能以及诊断状态。
- 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中所有寄存器的写操作也都放在回写阶段。
- mtc0实现思路
- mfc0实现思路
10.5.2 数据流图的修改
10.5.3 系统结构的修改
10.6 修改OpenMIPS以实现协处理器访问指令
10.6.1 修改译码阶段
10.6.2 修改执行阶段
- 修改EX模块
- 修改EX/MEM模块
修改访存阶段
- 修改MEM模块
- 修改MEM/WB模块