自己动手写CPU之第五阶段(2)——OpenMIPS对数据相关问题的解决措施
将陆续上传本人写的新书《自己动手写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等信息送到译码阶段。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVpc2hhbmd3ZW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
为此。译码阶段的ID模块要添加如表5-1所看到的的接口。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVpc2hhbmd3ZW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
译码阶段的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模块读port1要读取的寄存器就是运行阶段要写的目的寄存器。
// 那么直接把运行阶段的结果ex_wdata_i作为reg1_o的值;
//2、假设Regfile模块读port1要读取的寄存器就是訪存阶段要写的目的寄存器,
// 那么直接把訪存阶段的结果mem_wdata_i作为reg1_o的值;
always @ (*) begin
if(rst == `RstEnable) begin
reg1_o <= `ZeroWord;
end else if((reg1_read_o == 1'b1) && (ex_wreg_i == 1'b1)
&& (ex_wd_i == reg1_addr_o)) begin
reg1_o <= ex_wdata_i;
end else if((reg1_read_o == 1'b1) && (mem_wreg_i == 1'b1)
&& (mem_wd_i == reg1_addr_o)) begin
reg1_o <= mem_wdata_i;
end else if(reg1_read_o == 1'b1) begin
reg1_o <= reg1_data_i;
end else if(reg1_read_o == 1'b0) begin
reg1_o <= imm;
end else begin
reg1_o <= `ZeroWord;
end
end //给reg2_o赋值的过程添加了两种情况:
//1、假设Regfile模块读port2要读取的寄存器就是运行阶段要写的目的寄存器,
// 那么直接把运行阶段的结果ex_wdata_i作为reg2_o的值;
//2、假设Regfile模块读port2要读取的寄存器就是訪存阶段要写的目的寄存器,
// 那么直接把訪存阶段的结果mem_wdata_i作为reg2_o的值;
always @ (*) begin
if(rst == `RstEnable) begin
reg2_o <= `ZeroWord;
end else if((reg2_read_o == 1'b1) && (ex_wreg_i == 1'b1)
&& (ex_wd_i == reg2_addr_o)) begin
reg2_o <= ex_wdata_i;
end else if((reg2_read_o == 1'b1) && (mem_wreg_i == 1'b1)
&& (mem_wd_i == reg2_addr_o)) begin
reg2_o <= mem_wdata_i;
end else if(reg2_read_o == 1'b1) begin
reg2_o <= reg2_data_i;
end else if(reg2_read_o == 1'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.exe、Makefile、ram.ld这三个文件复制到Ubuntu虚拟机中的同一个文件夹下,打开终端,使用cd命令进入该文件夹,然后输入make all,就可以得到可以用于ModelSim仿真的inst_rom.data文件。
在ModelSim中新建一个project。加入本书附带光盘Code\Chapter5_1文件夹下的全部.v文件。然后能够编译。再复制上面得到的inst_rom.data文件到ModelSimproject的文件夹下,就能够进行仿真了。ModelSim中新建project、仿真的具体步骤能够參考第2章。
执行仿真,观察寄存器$1值的变化,如图5-9所看到的。$1的变化符合预期,所以改动后的OpenMIPS正确攻克了数据相关问题。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVpc2hhbmd3ZW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
下一步将实现逻辑、移位、空指令,敬请关注!
自己动手写CPU之第五阶段(2)——OpenMIPS对数据相关问题的解决措施的更多相关文章
- 自己动手写CPU之第五阶段(1)——流水线数据相关问题
将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第15篇,我尽量每周四篇 上一章建立了原始的OpenMIPS五级流水线结构,可是仅仅实现了一条ori指令,从本章開始,将逐步完 ...
- 自己动手写CPU之第五阶段(3)——MIPS指令集中的逻辑、移位与空指令
将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第17篇.我尽量每周四篇 5.4 逻辑.移位操作与空指令说明 MIPS32指令集架构中定义的逻辑操作指令有8条:and.and ...
- 自己动手写CPU之第六阶段(2)——移动操作指令实现思路
将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第21篇,我尽量每周四篇 6.2 移动操作指令实现思路 6.2.1 实现思路 这6条移动操作指令能够分为两类:一类是不涉及特殊 ...
- 自己动手写CPU之第七阶段(7)——乘累加指令的实现
将陆续上传本人写的新书<自己动手写CPU>.今天是第30篇.我尽量每周四篇 亚马逊的销售地址例如以下.欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8 ...
- 自己动手写CPU之第四阶段(3)——MIPS编译环境的建立
将陆续上传本人写的新书<自己动手写CPU>(尚未出版).今天是第13篇.我尽量每周四篇 4.4 MIPS编译环境的建立 OpenMIPS处理器在设计的时候就计划与MIPS32指令集架构兼容 ...
- 自己动手写CPU之第七阶段(2)——简单算术操作指令实现过程
将陆续上传本人写的新书<自己动手写CPU>.今天是第25篇.我尽量每周四篇 亚马逊的预售地址例如以下,欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8 ...
- 自己动手写CPU之第七阶段(5)——流水线暂停机制的设计与实现
将陆续上传本人写的新书<自己动手写CPU>,今天是第28篇.我尽量每周四篇 China-pub的预售地址例如以下(有文件夹.内容简单介绍.前言): http://product.china ...
- 自己动手写CPU之第八阶段(4)——转移指令实现过程2
将陆续上传本人写的新书<自己动手写CPU>,今天是第36篇,我尽量每周四篇 开展晒书评送书活动,在亚马逊.京东.当当三大图书站点上,发表<自己动手写CPU>书评的前十名读者,均 ...
- 自己动手写CPU之第七阶段(6)——乘累加指令实现思路
将陆续上传本人写的新书<自己动手写CPU>.今天是第29篇.我尽量每周四篇 亚马逊的销售地址例如以下,欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8 ...
随机推荐
- Problem F: 零起点学算法101——统计字母数字等个数
#include<stdio.h> #include<string.h> int main(){ ]; while(gets(str)!=NULL){ ,b=,c=,d=; ; ...
- 20172333 2017-2018-2 《Java程序设计》第4周学习总结
20172333 2017-2018-2 <Java程序设计>第4周学习总结 教材学习内容 1.类结构的定义与概念 2.利用实例数据建立对象状态的概念 3.描述可见性修饰符作用在方法和数据 ...
- css排版之-标准文档流
标准流指的是在不使用其他的与排列和定位相关的特殊CSS规则时,各种元素的排列规则.HTML文档中的元素可以分为两大类:行内元素和块级元素. 1.行内元素不占据单独的空间,依附于块级元素,行 ...
- Java高级架构师(一)第37节:反向代理和动静分离的实现
http协议->server->location 输入http:locahost:80/ 进入百度的界面. 做负载转发测试.路径已经转发,可能一些协议已经屏蔽了,导致内容出不来. 关于负载 ...
- CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂 中二版
"问题:众所周知772002很喜欢马尾,所以他决定画几幅马尾送给他的女朋友. 772002会画m种马尾,772002还有n张纸,n张纸分别编号1到n,每张纸上只能画一种马尾. 然而77200 ...
- Web安全测试指南--权限管理
垂直权限提升: 编号 Web_Author_01 用例名称 垂直权限提升测试 用例描述 测试用户是否具有使用超越其角色范围之外的权限. 严重级别 高 前置条件 1. 目标系统拥有不同等级的角色和权限 ...
- 1前端案例-tag标签+随机位置
tag标签随机位置+js数组随机+js添加一段html代码段 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN ...
- 也来讲REST、SOAP
在GIS网络开发过程中不可避免的的会涉及到REST(Representational State Transfer)的服务.自从Roy Fielding博士在2000年他的博士论文中提出REST风格的 ...
- \r和\n的区别
/n 是换行/r 是回车 这是两码事,换行是指移动到下一行,回车是指移动到行首,我们通常所说的“回车”其实是这两个动作的结合.
- [转]SQL 2005 开启OpenRowset/OpenDatasource的办法
本文转自:http://www.cnblogs.com/chenghm2003/archive/2008/09/12/1289793.html 1.开始 —> 所有程序 —> Micro ...