cpu设计和实现(协处理器cp0)

news/2024/4/20 2:32:29/文章来源:https://blog.csdn.net/feixiaoxing/article/details/128108394

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        除了通用计算器负责控制和计算之外,cpu如果需要正常有序地运行,还需要一定地协处理器来帮助完成对应地工作。在mips下面,这样地协处理器称之为cp0。协处理器的工作一般包括这几个方面,

        1)处理中断和异常;

        2)处理mmu和tlb;

        3)处理cache;

        4)处理其他cpu的相关属性。

        之前我们在谈到乘法和除法的时候,涉及到hi和lo这两个寄存器。其实,cp0的处理方法和他们是差不多的。如果是mf读操作,那么这个动作是在exe阶段完成的;如果是写操作,那么这个动作也是在wb阶段完成的。

1、准备cp0_reg.v

`include "defines.v"module cp0_reg(input	wire										clk,input wire										rst,input wire                    we_i,input wire[4:0]               waddr_i,input wire[4:0]               raddr_i,input wire[`RegBus]           data_i,//	input wire[31:0]              excepttype_i,input wire[5:0]               int_i,
//	input wire[`RegBus]           current_inst_addr_i,
//	input wire                    is_in_delayslot_i,output reg[`RegBus]           data_o,output reg[`RegBus]           count_o,output reg[`RegBus]           compare_o,output reg[`RegBus]           status_o,output reg[`RegBus]           cause_o,output reg[`RegBus]           epc_o,output reg[`RegBus]           config_o,output reg[`RegBus]           prid_o,output reg                   timer_int_o    );always @ (posedge clk) beginif(rst == `RstEnable) begincount_o <= `ZeroWord;compare_o <= `ZeroWord;//status寄存器的CU为0001,表示协处理器CP0存在status_o <= 32'b00010000000000000000000000000000;cause_o <= `ZeroWord;epc_o <= `ZeroWord;//config寄存器的BE为1,表示Big-Endian;MT为00,表示没有MMUconfig_o <= 32'b00000000000000001000000000000000;//制作者是L,对应的是0x48,类型是0x1,基本类型,版本号是1.0prid_o <= 32'b00000000010011000000000100000010;timer_int_o <= `InterruptNotAssert;end else begincount_o <= count_o + 1 ;cause_o[15:10] <= int_i;if(compare_o != `ZeroWord && count_o == compare_o) begintimer_int_o <= `InterruptAssert;endif(we_i == `WriteEnable) begincase (waddr_i) `CP0_REG_COUNT:		begincount_o <= data_i;end`CP0_REG_COMPARE:	begincompare_o <= data_i;//count_o <= `ZeroWord;timer_int_o <= `InterruptNotAssert;end`CP0_REG_STATUS:	beginstatus_o <= data_i;end`CP0_REG_EPC:	beginepc_o <= data_i;end`CP0_REG_CAUSE:	begin//cause寄存器只有IP[1:0]、IV、WP字段是可写的cause_o[9:8] <= data_i[9:8];cause_o[23] <= data_i[23];cause_o[22] <= data_i[22];end					endcase  //case addr_iendend    //ifend      //alwaysalways @ (*) beginif(rst == `RstEnable) begindata_o <= `ZeroWord;end else begincase (raddr_i) `CP0_REG_COUNT:		begindata_o <= count_o ;end`CP0_REG_COMPARE:	begindata_o <= compare_o ;end`CP0_REG_STATUS:	begindata_o <= status_o ;end`CP0_REG_CAUSE:	begindata_o <= cause_o ;end`CP0_REG_EPC:	begindata_o <= epc_o ;end`CP0_REG_PrId:	begindata_o <= prid_o ;end`CP0_REG_CONFIG:	begindata_o <= config_o ;end	default: 	beginend			endcase  //case addr_i			end    //ifend      //alwaysendmodule

2、id添加译码

     if(inst_i[31:21] == 11'b01000000000 && inst_i[10:0] == 11'b00000000000) beginaluop_o <= `EXE_MFC0_OP;alusel_o <= `EXE_RES_MOVE;wd_o <= inst_i[20:16];wreg_o <= `WriteEnable;instvalid <= `InstValid;	   reg1_read_o <= 1'b0;reg2_read_o <= 1'b0;		end else if(inst_i[31:21] == 11'b01000000100 && inst_i[10:0] == 11'b00000000000) beginaluop_o <= `EXE_MTC0_OP;alusel_o <= `EXE_RES_NOP;wreg_o <= `WriteDisable;instvalid <= `InstValid;	   reg1_read_o <= 1'b1;reg1_addr_o <= inst_i[20:16];reg2_read_o <= 1'b0;					end

3、ex阶段

1)增加数据读取操作

	   	`EXE_MFC0_OP:		begincp0_reg_read_addr_o <= inst_i[15:11];moveres <= cp0_reg_data_i;if( mem_cp0_reg_we == `WriteEnable &&mem_cp0_reg_write_addr == inst_i[15:11] ) beginmoveres <= mem_cp0_reg_data;end else if( wb_cp0_reg_we == `WriteEnable &&wb_cp0_reg_write_addr == inst_i[15:11] ) beginmoveres <= wb_cp0_reg_data;endend	 

        看到这里,大家应该对这个代码不陌生了。之前谈到过,所有的寄存器都是在wb之后,才会真正写到寄存器里面的。但是,mfc0的动作是在exe阶段进行的,那么这个时候势必会出现数据读取错误的情况的。所以,解决这个问题最好的办法就是数据预取。id中寄存器预取、ex阶段hi&lo以及mfc预取、mem阶段llbit预取,本质上都是一回事。

2)增加写操作

always @ (*) beginif(rst == `RstEnable) begincp0_reg_write_addr_o <= 5'b00000;cp0_reg_we_o <= `WriteDisable;cp0_reg_data_o <= `ZeroWord;end else if(aluop_i == `EXE_MTC0_OP) begincp0_reg_write_addr_o <= inst_i[15:11];cp0_reg_we_o <= `WriteEnable;cp0_reg_data_o <= reg1_i;end else begincp0_reg_write_addr_o <= 5'b00000;cp0_reg_we_o <= `WriteDisable;cp0_reg_data_o <= `ZeroWord;end				end	

        cp0寄存器的写操作是和通用寄存器分开来的。所以这部分代码需要单独用逻辑快来表达。

4、mem阶段

        mem阶段对cp0没有什么影响,主要工作就是把之前ex阶段的数据透传下去即可。

		  cp0_reg_we_o <= cp0_reg_we_i;cp0_reg_write_addr_o <= cp0_reg_write_addr_i;cp0_reg_data_o <= cp0_reg_data_i;	

5、准备汇编代码测试

   .org 0x0.set noat.set noreorder.set nomacro.global _start
_start:ori $1,$0,0xfmtc0 $1,$11,0x0  #写compare寄存器,开始计时lui $1,0x1000ori $1,$1,0x401mtc0 $1,$12,0x0  #将0x401写如status寄存器mfc0 $2,$12,0x0  #读status寄存器,$2=0x401_loop:j _loopnop

6、将对应的汇编代码翻译成二进制文件

3401000f
40815800
3c011000
34210401
40816000
40026000
08000006
00000000

7、利用iverilog和gtkwave进行波形分析

         除了通用的pc、inst这些寄存器、wire之外,还可以把cp0_reg0里面的寄存器拉出来看看。重点看看we_i什么时候为高、写入的waddr_i对不对、和之前给出来的汇编代码能不能对的上。最后就是死循环了,因为mips延迟槽的原因,循环肯定是两个pc地址交替进行的。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cisco ASA基础——安全算法与基本配置

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 本章重点 一.Cisco防火墙简介 1.什么是防火墙 2.防火墙的作用…

Express操作MongoDB

一、Express框架通过Mongoose模块操作MongoDB数据库 1、MongoDB数据库&#xff1a; ​ &#xff08;1&#xff09;存放数据的格式&#xff1a;key-value ​ &#xff08;2&#xff09;数据库(database) ——- 集合(collection) ——- 文档(document) ​ &#xff08;3&…

用字典统计序列中键和值的数量collections.Counter()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 用字典统计序列中键和值的数量 collections.Counter() 选择题 以下python代码结果错误的一项是? from collections import Counter myList[a,b,a] print(【显示】myList,myList) myDictCoun…

mapreduce搭建

一.虚拟机安装CentOS7并配置共享文件夹 二.CentOS 7 上hadoop伪分布式搭建全流程完整教程 三.本机使用python操作hdfs搭建及常见问题 四.mapreduce搭建 五.mapper-reducer编程搭建 mapreduce搭建一、配置1.创建mapred-site.xml文件2.编辑mapred-site.xml二、打开hadoop0.删除da…

小学生学Arduino---------点阵(一)静态图片显示

今天来看一下&#xff0c;点阵模块这一模块可以做出非常有意思的东西。 学习目标&#xff1a; 1、了解点阵原理 2、掌握图形绘制&#xff08;心形、三角形等&#xff09; 3、掌握图形显示器的功能 4、掌握led点阵屏幕的功能 5、搭建电路 6、编写程序 一、点阵的原理 LED点阵屏…

Leu-Trp-Leu-COOH,42293-99-2

编号: 122381中文名称: 三肽Leu-Trp-Leu英文名: Leu-Trp-LeuCAS号: 42293-99-2单字母: H2N-LWL-OH三字母: H2N-Leu-Trp-Leu-COOH氨基酸个数: 3分子式: C23H34N4O4平均分子量: 430.54精确分子量: 430.26等电点(PI): 6.11pH7.0时的净电荷数: -0.02平均亲水性: -2.3333333333333疏…

Qt QCustomPlot 点状网格线实现和曲线坐标点拾取

Qt QCustomPlot 点状网格线实现和曲线坐标点拾取 文章目录Qt QCustomPlot 点状网格线实现和曲线坐标点拾取摘要我想实现的效果点阵的实现第一版本&#xff0c;使用QPen Style第二版本&#xff0c;通过设置背景第三版本&#xff0c;回到QPen Style取曲线上的点关键字&#xff1a…

VS Code + Vue 开发环境搭建

1、下载并安装 Visual Studio Code 2019 2、Visual Studio Code 2019安装成功后&#xff0c;打开VS Code 工具点击左侧【扩展】菜单&#xff0c;在搜索栏中输入 Chinese 查找中文语言汉化包插件下载安装&#xff0c;然后重启VS Code 3、点击左侧【扩展】菜单&#xff0c;在搜…

WebDAV之葫芦儿·派盘+静读天下

静读天下 支持webdav方式连接葫芦儿派盘。 如今,很多人都喜欢在手机上进行阅读,所以想要获得更好的阅读体验,一款实用的电子书就显得尤为重要了,因此,静读天下这款纯正的本地电子书阅读软件您值得拥有,而且还支持本地电子书备份到葫芦儿派盘。 静读天下是一款备受千万…

【问题思考总结】NAT的公有地址怎么转换为私有地址?【MAC地址和IP地址的转换】

问题起源 在做一道题的时候&#xff0c;涉及到了由内网到外网再到内网时的IP地址转换。在外网的时候&#xff0c;答案说的是不能够用私有IP地址作为源IP地址&#xff0c;然后疑问产生了&#xff1a;如果不能用私有IP地址作为目的地址&#xff0c;他又怎么能够找到那个主机呢&a…

在 Node.js 中操作 Redis

在 Node.js 中操作 Redis Node.js 中可以操作 Redis 的软件包推荐列表&#xff1a;https://redis.io/clients#nodejs。 推荐下面两个&#xff1a; node-redisioredis 这里主要以 ioredis 为例。 ioredis 是功能强大的 Redis 客户端&#xff0c;已被世界上最大的在线商务公司…

MySQL日志管理、备份与恢复

文章目录一、mysql常用日志1、概述①、错误日志②、二进制日志③、中继日志④、慢查询日志⑤、通用查询日志&#xff0c;用来记录MySQL的所有连接和语句&#xff0c;默认是关闭的2、数据库中查询日志状态①、查看二进制日志开启状态②、查看慢查询日志功能是否开启③、查看慢查…

GAN生成漫画脸

最近对对抗生成网络GAN比较感兴趣&#xff0c;相关知识点文章还在编辑中&#xff0c;以下这个是一个练手的小项目~ (在原模型上做了&#xff0c;为了减少计算量让其好训练一些。) 一、导入工具包 import tensorflow as tf from tensorflow.keras import layersimport numpy a…

业务:财务会计业务知识

一、引言 会计是以货币为主要计量单位&#xff0c;对企业、事业、机关、团体及其他经济组织的经济活动进行记录、计算、控制、分析、报告&#xff0c;以提供财务和管理信息的工作。会计的职能主要是反映和控制经济活动过程&#xff0c;保证会计信息的合法、真实、准确和完整&a…

校园论坛网站设计设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

网页JS自动化脚本(四)修改元素的尺寸颜色显隐状态

修改元素尺寸 在定位到了元素之后, 我们就可以对元素进行一些修改了,我们先来修改元素泊宽度以及高度 window.onloadfunction(){var theElementdocument.querySelector("img.undertips-link-lefticon");theElement.style.width"100px";theElement.style.…

命令模式

文章目录思考命令模式1.命令模式的本质2.何时选用命令模式3.优缺点4.实现耦合写法命令模式优化耦合写法命令模式实现撤销命令模式实现厨师做菜命令模式实现排队命令模式实现日志持久化思考命令模式 命令模式就是解耦强耦合代码&#xff0c;用户只关心功能的实现&#xff0c;开发…

win11该文件没有与之关联的应用怎么办

win11用户在使用电脑的时候遇到了“该文件没有与之关联的应用”的提示&#xff0c;这是怎么回事呢&#xff1f;应该怎么办呢&#xff1f;出现这个情况应该是注册表被误删了&#xff0c;大家需要新建一个文本文档&#xff0c;然后输入下文提供的指令&#xff0c;之后将其重命名为…

linux不显示当前路径的解决方法

1.输入vim ~/.bashrc进入用户的shell环境变量的配置文件(可以设置环境变量以及通过alias设置别名&#xff09; 2.按下“i”键进入编辑模式(底部显示INSERT&#xff09; 3.修改\w为$PWD&#xff1a; 修改为&#xff1a; 4.按“esc”键后输入":wq"保存并退出&#xff…

Databend 开源周报 #69

Databend 是一款强大的云数仓。专为弹性和高效设计&#xff0c;自由且开源。 即刻体验云服务&#xff1a;https://app.databend.com。 New Features multiple catalog 实现删除用户定义目录 (#8820) meta 新增用于删除 key 和使 key 过期的 cli 命令 (#8858) planner 支…