自己动手写CPU之第五阶段(2)OpenMIPS对数据相关问题的解决
将陆续上传本人写的新书《自己动手写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模块的代码要做如下修改,其中主要修改部分使用加粗、斜体表示。修改后的代码位于本书光盘的CodeChapter5_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'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模块读端口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'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所示的连接关系。具体修改过程不在书中列出,读者可以参考本书附带光盘的CodeChapter5_1目录下的openmips.v文件。(代码会在稍后上传)
5.3 测试数据相关问题解决效果
测试程序如下,其中存在5.1节讨论的RAW相关的三种情况,源文件是本书附带光盘CodeChapter5_1AsmTest目录下的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中新建一个工程,添加本书附带光盘Code\Chapter5_1目录下的所有.v文件,然后可以编译。再复制上面得到的inst_rom.data文件到ModelSim工程的目录下,就可以进行仿真了。ModelSim中新建工程、仿真的详细步骤可以参考第2章。
运行仿真,观察寄存器$1值的变化,如图5-9所示,$1的变化符合预期,所以修改后的OpenMIPS正确解决了数据相关问题。

下一步将实现逻辑、移位、空指令,敬请关注!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

0.这篇文章干了啥?提出了DepthFM:一个多功能且快速的最先进的生成式单目深度估计模型。除了传统的深度估计任务外,DepthFM还展示了在深度修复等下游任务中的最先进能力。DepthFM效率高,可以在少数推理步骤内合成深度图。下面一起来阅读一下这项工作~1.论文信息标题:DepthFM:FastMonocularDepthEstimationwithFlowMatching作者:MingGui,JohannesS.Fischer,UlrichPrestel,PingchuanMa,Dmytr

1、首先我们右击任务栏空白处,选择【任务管理器】选项,或者右击开始徽标,然后再选择【任务管理器】选项。2、在打开的任务管理器界面,我们点击最右端的【服务】选项卡。3、在打开的【服务】选项卡,点击下方的【打开服务】选项。4、在打开的【服务】窗口,右击【InternetConnectionSharing(ICS)】服务,然后选择【属性】选项。5、在打开的属性窗口,将【打开方式】修改为【禁用】,点击【应用】后点击【确定】。6、点击开始徽标,然后点击关机按钮,选择【重启】,完成电脑重启就行了。

本站7月28日消息,据外媒TechRader报道,富士通详细介绍了计划于2027年出货的FUJITSU-MONAKA(以下简称MONAKA)处理器。MONAKACPU基于“云原生3D众核”架构,采用Arm指令集,面向数据中心、边缘与电信领域,适用于AI计算,能实现大型机级别的RAS1。富士通表示,MONAKA将在能效和性能方面实现飞跃:得益于超低电压(ULV)工艺等技术,该CPU可实现2027年竞品2倍的能效,冷却无需水冷;此外该处理器的应用性能也可达对手2倍。在指令方面,MONAKA配备的矢量

英特尔ArrowLake预计将基于与LunarLake相同的处理器架构,这意味着英特尔全新的LionCove性能核心将与经济的Skymont效率核心相结合。而LunarLake仅作为ava推出

本站6月1日消息,消息源@CodeCommando今天发布推文,分享了AMD即将在Computex2024活动中的部分演示文档截图,推文内容为“AM4永不消亡”,配图展示了两款新的Ryzen5000XT系列处理器。根据截图内容显示以下两款产品:Ryzen95900XTRyzen95900XT定位相对高端,这是一款全新的16核AM4处理器,其时钟速度略低于AMD的Ryzen95950X。Ryzen75800XT它是AMD现有Ryzen75800X处理器的更快变体,这两款处理器的主频最高可达4.8G

谷歌力推的JAX在最近的基准测试中性能已经超过Pytorch和TensorFlow,7项指标排名第一。而且测试并不是在JAX性能表现最好的TPU上完成的。虽然现在在开发者中,Pytorch依然比Tensorflow更受欢迎。但未来,也许有更多的大模型会基于JAX平台进行训练和运行。模型最近,Keras团队为三个后端(TensorFlow、JAX、PyTorch)与原生PyTorch实现以及搭配TensorFlow的Keras2进行了基准测试。首先,他们为生成式和非生成式人工智能任务选择了一组主流

在iPhone上面临滞后,缓慢的移动数据连接?通常,手机上蜂窝互联网的强度取决于几个因素,例如区域、蜂窝网络类型、漫游类型等。您可以采取一些措施来获得更快、更可靠的蜂窝互联网连接。修复1–强制重启iPhone有时,强制重启设备只会重置许多内容,包括蜂窝网络连接。步骤1–只需按一次音量调高键并松开即可。接下来,按降低音量键并再次释放它。步骤2–该过程的下一部分是按住右侧的按钮。让iPhone完成重启。启用蜂窝数据并检查网络速度。再次检查修复2–更改数据模式虽然5G提供了更好的网络速度,但在信号较弱

哭死啊,全球狂炼大模型,一互联网的数据不够用,根本不够用。训练模型搞得跟《饥饿游戏》似的,全球AI研究者,都在苦恼怎么才能喂饱这群数据大胃王。尤其在多模态任务中,这一问题尤为突出。一筹莫展之际,来自人大系的初创团队,用自家的新模型,率先在国内把“模型生成数据自己喂自己”变成了现实。而且还是理解侧和生成侧双管齐下,两侧都能生成高质量、多模态的新数据,对模型本身进行数据反哺。模型是啥?中关村论坛上刚刚露面的多模态大模型Awaker1.0。团队是谁?智子引擎。由人大高瓴人工智能学院博士生高一钊创立,高
