热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

自己动手写CPU之第五阶段(2)OpenMIPS对数据相关问题的解决

将陆续上传本人写的新书《自己动手写CPU》(尚未出版),今天是第16篇,我尽量每周四篇5.2OpenMIPS对数据相关问题的解决措施OpenMIPS处理器采用数据前推的方法来解决流水线数据相关问题。通过补充完善图4-4原始的数据流图,添加部分信号使得可以完成数

将陆续上传本人写的新书《自己动手写CPU》(尚未出版),今天是第16篇,我尽量每周四篇 5.2OpenMIPS 对数据相关问题的解决措施 OpenMIPS 处理器采用数据前推的方法来解决流水线数据相关问题。通过补充完善图 4-4 原始的数据流图,添加部分信号使得可以完成数

将陆续上传本人写的新书《自己动手写CPU》(尚未出版),今天是第16篇,我尽量每周四篇


5.2 OpenMIPS对数据相关问题的解决措施

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


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

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

2)将处于流水线访存阶段的指令的运算结果,包括:是否要写目的寄存器wreg_o、要写的目的寄存器地址wd_o、要写入目的寄存器的数据wdata_o等信息送到译码阶段。


为此,译码阶段的ID模块要增加如表5-1所示的接口。


译码阶段的ID模块会依据送入的信息,进行综合判断,解决数据相关,给出最后要参与运算的操作数。ID模块的代码要做如下修改,其中主要修改部分使用加粗、斜体表示。修改后的代码位于本书光盘的Code\Chapter5_1目录下的id.v文件。

module id(

	......

	//处于执行阶段的指令的运算结果
	input wire			   ex_wreg_i,
	input wire[`RegBus]		   ex_wdata_i,
	input wire[`RegAddrBus]       ex_wd_i,
	
	//处于访存阶段的指令的运算结果
	input wire		          mem_wreg_i,
	input wire[`RegBus]           mem_wdata_i,
	input wire[`RegAddrBus]       mem_wd_i,
	
...... 	      
	
	//送到执行阶段的源操作数1、源操作数2
	output reg[`RegBus]           reg1_o,
	output reg[`RegBus]           reg2_o,
	......
);

       ......

       //给reg1_o赋值的过程增加了两种情况:
       //1、如果Regfile模块读端口1要读取的寄存器就是执行阶段要写的目的寄存器,
       //   那么直接把执行阶段的结果ex_wdata_i作为reg1_o的值;
       //2、如果Regfile模块读端口1要读取的寄存器就是访存阶段要写的目的寄存器,
       //   那么直接把访存阶段的结果mem_wdata_i作为reg1_o的值;
    	always @ (*) begin
	  if(rst == `RstEnable) begin
		reg1_o <= `ZeroWord;		
	  end else if((reg1_read_o == 1&#39;b1) && (ex_wreg_i == 1&#39;b1) 
			   && (ex_wd_i == reg1_addr_o)) begin
		reg1_o <= ex_wdata_i; 
	  end else if((reg1_read_o == 1&#39;b1) && (mem_wreg_i == 1&#39;b1) 
		          && (mem_wd_i == reg1_addr_o)) begin
		reg1_o <= mem_wdata_i; 			
	  end else if(reg1_read_o == 1&#39;b1) begin
	  	reg1_o <= reg1_data_i;
	  end else if(reg1_read_o == 1&#39;b0) begin
	  	reg1_o <= imm;
	  end else begin
	    reg1_o <= `ZeroWord;
	  end
	end

       //给reg2_o赋值的过程增加了两种情况:
       //1、如果Regfile模块读端口2要读取的寄存器就是执行阶段要写的目的寄存器,
       //   那么直接把执行阶段的结果ex_wdata_i作为reg2_o的值;
       //2、如果Regfile模块读端口2要读取的寄存器就是访存阶段要写的目的寄存器,
       //   那么直接把访存阶段的结果mem_wdata_i作为reg2_o的值;
	always @ (*) begin
	  if(rst == `RstEnable) begin
		reg2_o <= `ZeroWord;
	   end else if((reg2_read_o == 1&#39;b1) && (ex_wreg_i == 1&#39;b1) 
			    && (ex_wd_i == reg2_addr_o)) begin
		reg2_o <= ex_wdata_i; 
	   end else if((reg2_read_o == 1&#39;b1) && (mem_wreg_i == 1&#39;b1) 
			    && (mem_wd_i == reg2_addr_o)) begin
		reg2_o <= mem_wdata_i;			
	   end else if(reg2_read_o == 1&#39;b1) begin
	  	reg2_o <= reg2_data_i;
	   end else if(reg2_read_o == 1&#39;b0) begin
	  	reg2_o <= imm;
	   end else begin
	       reg2_o <= `ZeroWord;
	  end
	end

endmodule

除了修改译码阶段ID模块的代码,还要修改顶层模块OpenMIPS对应的代码,在其中增加图5-8所示的连接关系。具体修改过程不在书中列出,读者可以参考本书附带光盘的Code\Chapter5_1目录下的openmips.v文件。(代码会在稍后上传)

5.3 测试数据相关问题解决效果

测试程序如下,其中存在5.1节讨论的RAW相关的三种情况,源文件是本书附带光盘Code\Chapter5_1\AsmTest目录下的inst_rom.S文件。

.org 0x0
.global _start
.set noat
_start:
   ori $1,$0,0x1100        # $1 = $0 | 0x1100 = 0x1100
   ori $1,$1,0x0020        # $1 = $1 | 0x0020 = 0x1120
   ori $1,$1,0x4400        # $1 = $1 | 0x4400 = 0x5520
   ori $1,$1,0x0044        # $1 = $1 | 0x0044 = 0x5564

指令的注释给出了预期执行效果。将上述inst_rom.S文件,与第4章实现的Bin2Mem.exeMakefileram.ld这三个文件拷贝到Ubuntu虚拟机中的同一个目录下,打开终端,使用cd命令进入该目录,然后输入make all,即可得到能够用于ModelSim仿真的inst_rom.data文件。

ModelSim中新建一个工程,添加本书附带光盘Code\Chapter5_1目录下的所有.v文件,然后可以编译。再复制上面得到的inst_rom.data文件到ModelSim工程的目录下,就可以进行仿真了。ModelSim中新建工程、仿真的详细步骤可以参考第2章。

运行仿真,观察寄存器$1&#20540;的变化,如图5-9所示,$1的变化符合预期,所以修改后的OpenMIPS正确解决了数据相关问题。



下一步将实现逻辑、移位、空指令,敬请关注!
推荐阅读
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 如何基于ggplot2构建相关系数矩阵热图以及一个友情故事
    本文介绍了如何在rstudio中安装ggplot2,并使用ggplot2构建相关系数矩阵热图。同时,通过一个友情故事,讲述了真爱难觅的故事背后的数据量化和皮尔逊相关系数的概念。故事中的小伙伴们在本科时参加各种考试,其中有些沉迷网络游戏,有些热爱体育,通过他们的故事,展示了不同兴趣和特长对学习和成绩的影响。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • Ubuntu安装常用软件详细步骤
    目录1.GoogleChrome浏览器2.搜狗拼音输入法3.Pycharm4.Clion5.其他软件1.GoogleChrome浏览器通过直接下载安装GoogleChro ... [详细]
  • ubuntu用sqoop将数据从hive导入mysql时,命令: ... [详细]
  • 本文介绍了在Docker容器技术中限制容器对CPU的使用的方法,包括使用-c参数设置容器的内存限额,以及通过设置工作线程数量来充分利用CPU资源。同时,还介绍了容器权重分配的情况,以及如何通过top命令查看容器在CPU资源紧张情况下的使用情况。 ... [详细]
  • 本文讨论了在Linux系统中,使用chown命令将django项目目录下的static目录的拥有者从root改为eureka的问题。作者尝试了多种命令,包括chown和sudo chown等,但都没有成功修改拥有者。文章提供了相关目录的权限信息,并补充了项目所在磁盘和操作系统的信息。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 在ubuntu服务器上安装vscode,但是目前使用的方法都无法成功。第一次安装经历:安装完anaconda后有自动安装vscode的选项,输入yes后,没有出现错误,但是在终端输 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
  • STM32与FPGA的对比及学习建议
    本文对比了野火STM32F103指南针板和Xilinx的PYNQ-Z2板(ZYNQ-7020),介绍了野火STM32F103指南针板的学习资料和讲解视频的详细程度,建议初学者学习野火的资料。同时,介绍了STM32开发所用的Keil程序和C指针的重要性。对于ZYNQ-7020的开发,提到了其自带的Linux、Ubuntu18.4系统以及使用SD卡烧入镜像的方法。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • 本文介绍了如何在使用emacs时去掉ubuntu的alt键默认功能,并提供了相应的操作步骤和注意事项。 ... [详细]
  • 本文介绍了在Ubuntu下制作deb安装包及离线安装包的方法,通过备份/var/cache/apt/archives文件夹中的安装包,并建立包列表及依赖信息文件,添加本地源,更新源列表,可以在没有网络的情况下更新系统。同时提供了命令示例和资源下载链接。 ... [详细]
author-avatar
独角戏小说
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有