CPU设计实战-协处理器访问指令的实现

news2024/11/22 16:51:03

目录

一 协处理器的作用与功能

1.计数寄存器和比较寄存器

2.Status寄存器

3.Cause寄存器(标号为13)

4.EPC寄存器(标号为14)

5.PRId寄存器(标号为15)

6.Config 寄存器(标号为16)-配置寄存器

二 协处理器的实现

 三 协处理器访问指令说明

四 具体实现

1.译码阶段

2.执行阶段


一 协处理器的作用与功能

我们之前实现的指令操作很多都是算术操作,CPU还需要进行一些指令集扩展的操作,比如系统控制与浮点单元计算等。MIPS架构定义了四种协处理器如下:

我们在这里只实现CP0的主要功能中的中断异常处理,它还可以进行工作状态的配置如大小端模式的切换,高速缓存控制,存储管理单元控制等。

协处理器中为每种功能定义了相应的32个32位的寄存器,主要是通过读写协处理器中的寄存器去实现相关功能。

我们的目标是实现中断异常管理以及最基本的工作状态的配置,只需要关注上面标黑的寄存器即可。

1.计数寄存器和比较寄存器

定时中断的实现是通过Count计数器寄存器和Compare寄存器来实现的。

Count寄存器是一个不停计数的32位寄存器,计数频率一般与CPU时钟频率相同,当计数达到32位无符号数的上限时,会从0开始重新计数。Count 寄存器可读、可写。
Compare寄存器是一个32位的寄存器,与Count寄存器一起完成定时中断功能。 当Count寄存器中的计数值与Compare寄存器中的值一样时, 会产生定时中断。这个中断会一直保持,直到有数据被写入Compare寄存器。Compare 寄存器可读、可写。 

2.Status寄存器

 Status寄存器也是一个32位、可读、可写的寄存器,用来控制处理器的操作模式、中断使能以及诊断状态。这里我们主要进行中断使能和基本工作状态的配置。

CU3-CU0表示协处理器是否可用(Coprocessor Usability), 分别控制协处理器CP3、CP2、 CPI、
CP0。为0时,表示相应的协处理器不可用;为1时,表示相应的协处理器可用。对于OpenMIPS
处理器而言,只有协处理器CPO,所以可以设置本字段为4'b0001。

IM7-IM0表示是否屏蔽相应中断(Interrupt Mask), 0表示屏蔽,1 表示不屏蔽,MIPS处理器可以
8个中断源,对应IM字段的8位,其中6个中断源是处理器外部硬件中断,另外2个是软件中断

中断是否能够被处理器响应是由Status寄存器与Cause寄存器共同决定的,如果Status寄存器的IM字段(中断源选择)与Cause寄存器的IP字段(外部中断挂是否发生)的相应位都为1,而且Status寄存器的IE字段(全局使能中断)也为1时,处理器才响应相应中断。
EXL表示是否处于异常级(Exception Level), 当异常发生时,会设置本字段为1,表示处理器处于异常级,此时,处理器会进入内核模式下工作,并且禁止中断
IE表示是否使能中断(Interrupt Enable),这是全局中断使能标志位。为1表示中断使能,为0表示中断禁止。

3.Cause寄存器(标号为13)


Cause寄存器主要记录最近一次异常发生的原因,也控制软件中断请求。Cause寄存器的各字段如表10-6所示,除了IP[1:0]、 IV和WP,其余字段都是只读的

4.EPC寄存器(标号为14)


EPC是异常程序计数器(Exception Program Counter),用来存储异常返回地址,一般情况下,存储发生异常的指令的地址,但是,如果发生异常的指令位于延迟槽中,那么EPC存储的是前一条转移指令的地址。因为之前我们定义,延迟槽中的指令就是转移指令之后的指令并且一定执行。所以异常真正发生在转移阶段。

5.PRId寄存器(标号为15)


PRId寄存器是处理器标志( Processor Identifier)寄存器,包含的信息有:制造商信息、处理器类型以及处理器的版本等。各个字段如表10-9所示。其中R是保留字段。

6.Config 寄存器(标号为16)-配置寄存器


Config寄存器包含了与处理器有关的各种配置和功能信息,其各个字段如下所示,大部分字段由硬件在重启时进行初始化,或定为常量。

BE
其值为1表示处理器工作在大端模式(MSB),为0表示处理器工作在小端模式(LSB)。OpenMIPS处理器工作在大端模式,所以设置本字段为1。
AT
指令集架构类型(Architecture Type)字段,当其值为2'b00时,表示MIPS32架构

现在我们可以整理一下中断的实现操作:

中断分为外部中断和定时中断

定时中断的实现是通过Count计数器寄存器和Compare寄存器来实现的。

Count寄存器是一个不停计数的32位寄存器,计数频率一般与CPU时钟频率相同,当计数达到32位无符号数的上限时,会从0开始重新计数。Count 寄存器可读、可写。


Compare寄存器是一个32位的寄存器,与Count寄存器一起完成定时中断功能。 当Count寄存器中的计数值与Compare寄存器中的值一样时, 会产生定时中断。这个中断会一直保持,直到有数据被写入Compare寄存器。Compare 寄存器可读、可写。 

外部中断是否能够被处理器响应是由Status寄存器与Cause寄存器共同决定的,如果Status寄存器的IM字段(中断源选择)与Cause寄存器的IP字段(外部中断挂是否发生)的相应位都为1,而且Status寄存器的IE字段(全局使能中断)也为1时,处理器才响应相应中断。

二 协处理器的实现

之前说过对协处理器指令实现操作本质就是去读写协处理器,所以接口类似于一个单端口的存储器,包括读写使能,读写地址,输出寄存器和外部中断的输入。 

先对寄存器做初始化,主要是对工作状态寄存器进行基本赋值:

读写操作按照读写地址进行赋值,寄存器地址按照之前的表按地址号进行定义。

写操作:

对计数器和比较寄存器进行读写之前先实现他们的基本操作定义输出信号,计数器需要一直计数,cause保留外部中断请求,其值与外部中断输入一致,定时中断请求的输出:

需要注意当写入比较寄存器时,定时中断结束。以及有些寄存器并不是可写的

读操作:

 三 协处理器访问指令说明

 这两个指令一个写一个读:

这2条指令的格式与之前已实现的指令都不同,主要特点是:指令码都为6'b010000,MIPS32 指令集架构定义为COP0类,需要借助于第21~ 25bit的值才能确定具体是哪一条指令。 此外,指令的第3~10bit为0,第0~2bit是sel域,这个域的作用取决于具体的MIPS32架构处理器,对OpenMIPS处理器而言,sel 域没有作用,不用考虑。下面分别说明mtc0、mfc0 两条指令的用法、作用。
●当指令码是6'b010000,且第21~25bit的值为5'"b00100 时,是mtc0指令。
指令用法为:mtc0 rt, rd。
指令作用为: CPR[0, rd] <- GPR[rt],将地址为rt的通用寄存器的值赋给协处理器CP0中地址为rd的寄存器。
●当指令码是 6'b010000,且第21~ 25bit的值为500000时,是mfc0指令。
指令用法为: mfc0 rt, rd。
指令作用为: GPR[rt] <- CPR[0, rd],读出协处理器CPO中地址为rd的寄存器的值,并赋给地址为rt的通用寄存器。
 

四 具体实现

 

指令的读写在执行阶段进行定义,读操作需要提前去读CP0寄存器的值并传递回来,而写操作需要把使能以及写入值与地址传递到CP0.此外新引入的寄存器同样会发生数据相关问题,还是使用数据前推进行解决。

1.译码阶段

mtc0修改CP0寄存器的值,修改的值在rt里,修改的地址在rd中,所以不需要写通用寄存器,但是需要读rt中的值。

mfc0是读出协处理器CPO中地址为rd的寄存器的值,并赋给地址为rt的通用寄存器。需要写通用寄存器,两个地址都在指令中直接用,不需要读寄存器。

2.执行阶段

要实现mfc0需要两步,先去读CP0的值,可能不是最新的值所以判断一下数据相关(如果访存和回写阶段需要写回CP0并且写回地址和我们要读的地址一样),如果是把写入的值直接传过来,记为moveres。

然后再写入:

如果是mtc0 指令,那么给出对CP0中寄存器的写信息:设置写操作信号cp0_ reg_ we. o为WriteEnable、 写入地址为指令中第11~ 15bit的值、写入的值就是译码阶段传递过来的regl_i的值,参考译码阶段可知,该值正是地址为rt的通用寄存器的值。

后面把需要写入寄存器的值一直传递到CP0寄存器就行了。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1511287.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3/12/24交换排序、插入排序、选择排序、归并排序

目录 交换排序 冒泡排序 快速排序 插入排序 直接插入排序 选择排序 简单选择排序 堆排序 归并排序 各种排序的时间复杂度、空间复杂度、稳定性和复杂度 快排真题2016 选排真题2022 排序算法分为交换类排序、插入类排序、选择类排序、归并类排序。 交换排序 交换排…

【智能算法】哈里斯鹰算法(HHO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.代码实现4.参考文献 1.背景 2019年&#xff0c;Heidari 等人受到哈里斯鹰捕食行为启发&#xff0c;提出了哈里斯鹰算法(Harris Hawk Optimization, HHO)。 2.算法原理 2.1算法思想 根据哈里斯鹰特性&#xff0c;HHO分为探索-…

新智元 | Stable Diffusion 3技术报告流出,Sora构架再立大功!生图圈开源暴打Midjourney和DALL·E 3?

本文来源公众号“新智元”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;Stable Diffusion 3技术报告流出&#xff0c;Sora构架再立大功&#xff01;生图圈开源暴打Midjourney和DALLE 3&#xff1f; 【新智元导读】Stability AI放…

chrome浏览器插件content.js和background.js还有popup都是什么,怎么通讯

popup 在用户点击扩展程序图标时&#xff08;下图中的下载图标&#xff09;&#xff0c;都可以设置弹出一个popup页面。而这个页面中自然是可以包含运行的js脚本的&#xff08;比如就叫popup.js&#xff09;。它会在每次点击插件图标——popup页面弹出时&#xff0c;重新载入。…

如何阅读“计算机界三大神书”之一 ——SICP

《计算机程序的构造和解释》&#xff08;Structure and Interpretation of Computer Programs&#xff0c;简记为SICP&#xff09;是MIT的基础课教材&#xff0c;出版后引起计算机教育界的广泛关注&#xff0c;对推动全世界大学计算机科学技术教育的发展和成熟产生了很大影响。…

plantUML使用指南之序列图

文章目录 前言一、序列图1.1 语法规则1.1.1 参与者1.1.2 生命线1.1.3 消息1.1.4 自动编号1.1.5 注释1.1.6 其它1.1.7 例子 1.2 如何画好 参考 前言 在软件开发、系统设计和架构文档编写过程中&#xff0c;图形化建模工具扮演着重要的角色。而 PlantUML 作为一种强大且简洁的开…

springboot265基于Spring Boot的库存管理系统

基于Spring Boot库存管理系统 Inventory Meanagement System based on Spring Boot 摘 要 当下&#xff0c;如果还依然使用纸质文档来记录并且管理相关信息&#xff0c;可能会出现很多问题&#xff0c;比如原始文件的丢失&#xff0c;因为采用纸质文档&#xff0c;很容易受潮…

《vtk9 book》 官方web版 第3章 - 计算机图形基础 (3 / 5)

3.8 演员几何 我们已经看到了光照属性如何控制演员的外观&#xff0c;以及相机如何结合变换矩阵将演员投影到图像平面上。剩下的是定义演员的几何形状&#xff0c;以及如何将其定位在世界坐标系中。 建模 计算机图形学研究中的一个重要主题是建模或表示物体的几何形状。…

二分查找【详解】

本期介绍&#x1f356; 主要介绍&#xff1a;二分查找的简单思路&#xff0c;为什么必须在有序的前提下才能使用二分查找&#xff0c;该怎么用C程序来实现二分查找&#xff0c;二分查找的局限性&#x1f440;。 文章目录 1. 题目2. 思路3. 前提条件4. 编写程序 1. 题目 在一个有…

Android Studio开发项目——记账簿应用

项目资源&#xff1a; 百度网盘链接&#xff1a;https://pan.baidu.com/s/1zN9lrIypi1t_QpuoBcdBNQ?pwdxj5h 提取码&#xff1a;xj5h 项目设计内容 1.基本功能描述 电子记账本是一种在线财务管理工具&#xff0c;用于帮助用户记录和管理他们的收入与支出。以下是电…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的水果新鲜程度检测系统(深度学习模型+UI界面代码+训练数据集)

摘要&#xff1a;开发水果新鲜程度检测系统对于提高农业产量和食品加工效率具有重大意义。本篇博客详细介绍了如何利用深度学习构建一个水果新鲜程度检测系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并结合了YOLOv7、YOLOv6、YOLOv5的对比…

ChatGPT 结合实际地图实现问答式地图检索功能基于Function calling

ChatGPT 结合实际地图实现问答式地图检索功能基于Function calling ChatGPT结合实际业务&#xff0c;主要是研发多函数调用&#xff08;Function Calling&#xff09;功能模块&#xff0c;将自定义函数通过ChatGPT 问答结果&#xff0c;实现对应函数执行&#xff0c;再次将结果…

打卡学习kubernetes——了解kubernetes组成及架构

目录 1 什么是kubernetes 2 kubernetes组件 3 kubernetes架构 1 什么是kubernetes kubernetes是一个旨在自动部署、扩展和运行应用容器的开源平台。目标是构建一个生态系统&#xff0c;提供组件和工具以减轻在公共和私有云中运行应用程序的负担。 kubernetes是&#xff1a…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的跌倒检测系统详解(深度学习模型+UI界面代码+训练数据集)

摘要&#xff1a;本研究介绍了一个基于深度学习和YOLOv8算法的跌倒检测系统&#xff0c;并对比分析了包括YOLOv7、YOLOv6、YOLOv5在内的早期版本性能。该系统可在多种媒介如图像、视频文件、实时视频流中准确识别跌倒事件。文内详解了YOLOv8的工作机制&#xff0c;并提供了相应…

一套plm系统大约多少钱?彩虹PLM系统

一套PLM&#xff08;产品生命周期管理&#xff09;系统的价格因多个因素而异&#xff0c;包括企业规模、需求复杂性、系统功能、技术支持和厂商选择等。一般来说&#xff0c;面向小型和微型企业的PLM产品&#xff0c;其价位在5万元~15万元左右&#xff1b;面向中型企业的中端PL…

STM32---通用定时器(二)相关实验

写在前面&#xff1a;前面我们学习了基本定时器、通用定时器的相关理论部分&#xff0c;了解到通用定时器的结构框图&#xff0c;总共包含六大模块&#xff1a;时钟源、控制器、时基单元、输入捕获、公共部分以及输出捕获。对相关模块的使用也做详细的讲解。本节我们主要是对上…

力扣刷题日记——L724. 寻找数组的中心下标

1. 前言 今天是力扣刷题日记的第二天&#xff0c;今天依旧是一道简单题啊&#xff0c;慢慢来&#xff0c;先看看题目是什么吧。 2. 题目描述 给你一个整数数组 nums &#xff0c;请计算数组的 中心下标。 数组 中心下标 是数组的一个下标&#xff0c;其左侧所有元素相加的和…

数据结构入门(3)顺序表和链表

1.线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直…

汤唯短发造型:保留经典和适合自己的风格,也许才是最重要的

汤唯短发造型&#xff1a;保留经典和适合自己的风格&#xff0c;也许才是最重要的 汤唯短发造型登上Vogue四月刊封面&#xff0c;引发网友热议。#李秘书讲写作#说说是怎么回事&#xff1f; 这次Vogue四月刊的封面大片&#xff0c;汤唯以一头短发亮相&#xff0c;身穿五颜六色的…

Python笔记:函数

Python函数定义规则&#xff1a; 函数代码块以def关键词开头&#xff0c;后接函数标识符名称和圆括号()。任何传入参数和自变量必须放在圆括号中间&#xff0c;圆括号之间可以用于定义参数。return [表达式] 结束函数&#xff0c;选择性地返回一个值给调用方&#xff0c;不带表…