cpu设计和实现(数据预取)

news2024/12/22 9:51:16

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

        前面说过了一条指令经过cpu处理的时候需要经历几个阶段。通过实验,我们发现,哪怕是再简单的ori指令也要经历取指、译码、执行、访存和写回这五个阶段。这从之前的波形图上面可以看的很明显。

1、关于使用iverilog仿真

        很多朋友也会使用《自己动手写cpu》这本书上的代码来仿真。这是完全可以的。目前来说,代码不太好找,我找了一个,上传到GitHub上面,有需要的朋友可以到这里来下载,https://github.com/feixiaoxing/design_mips_cpu/blob/master/Examples-in-book-write-your-own-cpu-master.zip。测试的时候,有几个地方需要注意下,

1)defines.v中指令的长度需要修改,比如修改成64,不然iverilog编译不过,之前作者可能使用的是modelsim软件,对于InstMemNum这一点可能不太那么讲究。

`define InstMemNum 64

2)在openmips_min_sopc_tb.v文件中添加生成波形文件的内容,不然无法显示波形,

initial
begin
    $dumpfile("hello.vcd");
    $dumpvars(0, openmips_min_sopc_tb);
end

3)如果需要debug某一个module文件中的register内容,建议用wire拖出来一下即可

// wire[0:31] regs0_wire;
// wire[0:31] regs1_wire;
// wire[0:31] regs2_wire;
// wire[0:31] regs3_wire;
// wire[0:31] regs4_wire;
// assign regs0_wire = regs[0];
// assign regs1_wire = regs[1];
// assign regs2_wire = regs[2];
// assign regs3_wire = regs[3];
// assign regs4_wire = regs[4];

        平时测试的时候可以放开,后续编译烧入的时候可以重新注释上。

4)另外测试的过程中,可能把需要查看的信号先保存成gtkw文件。这样修改后,直接用gtkwave查看gtkw文件,所有的信号都可以快速看到。不需要再一条一条拖出来查看了,否则效率太低了。

5)对于不同模块之间的代码差异,建议直接用beyond compare查看代码差异,这样理解的更快一点。

2、继续分析流水线

        流水线相比较单周期cpu有很多的优点,但是它的缺点也是很明显的。这些缺点就需要我们一个一个去处理和解决。数据依赖就是其中的一种,假设我们的指令是这样的,

ori $1, $0, 0x1100
ori $1, $1, 0x0020
ori $1, $1, 0x4400
ori $1, $1, 0x0044

        这是一个比较极端的例子,但是却是合理的,我们可以按照现在流水线的做法。$1寄存器的读取只能从regfile中来,但是实际cpu在处理的时候,这个寄存器的来源还有可能来自于写回、访存和执行。如果一味地认为寄存器只能来自于regfile,这其实是要出问题的,因为我们拿到的寄存器内容很有可能不是最新的内容。所以,在id译码的时候,要对原来的数据做一些调整,

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

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	

        因为写回的部分在regfile.v已经处理过了,所以这里reg1_o和reg2_o只多增加了两个部分内容。即,如果register发现在执行阶段有更新,那么优先从执行阶段获取数值;如果发现在访存阶段有更新,那么从访存阶段来获取数值。注意,这里处理的逻辑顺序,其实代表了数据优先级的获取顺序。

        实验验证的方法也非常简单,我们可以看下ex_reg1每次的数值是不是最新的数值即可,

        通过观察波形图,可以比较明显地发现,数据都是最新的数值。比如第一次是0x0,第二次是0x0010,这代表数值虽然还没有写回到寄存器,但是提前获取到了。第三次是0x1120,代表ex_reg1又被更新到了最新的数值,依次类推。这就是数据预取方法。在后续的多个场合,我们会看到这个方法的使用之处。 

        另外,有需要进行代码调试的朋友,也可以在这个地址直接获取测试代码,https://github.com/feixiaoxing/design_mips_cpu/tree/master/rtl/day04。有了这个代码,加上iverilog+gtkwave就可以在windows平台仿真测试了。

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

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

相关文章

MyBatis是什么?使用方式?

目录 前言&#xff1a; 一、概念讲述 1.什么是MyBatis&#xff1f; 2.官网网址 二、使用方式 1.pom.xml里面添加依赖包 2.新建统一配置文件&#xff08;俗称数据库连接文件&#xff09; 3.新建立映射文件 &#xff08;俗称数据库表对应xml&#xff09; 4.建立数据库表…

ArcMap中之提取影像数据边界

1、前言 手里有一些经过裁剪的不规则多边形影像数据&#xff08;如图例所示&#xff09;&#xff0c;希望能批量获取该类影像的边界信息&#xff0c;即影像对应的面信息&#xff0c;边界线信息。这里我们提供一种利用镶嵌数据集Footprint图层的方法来获取&#xff0c;面&#…

基于Python机器学习及深度学习在空间模拟与时间预测应用

了解机器学习的发展历史、计算原理、基本定义&#xff0c;熟悉机器学习方法的分类&#xff0c;常用机器学习方法&#xff0c;以及模型的评估与选择&#xff1b;熟悉数据预处理的流程&#xff0c;掌握python程序包的使用&#xff1b;理解机器学习在生态水文中的应用&#xff0c;…

超实用的图片处理技巧,一分钟轻松完成图片编辑

图片想必大家都很熟悉&#xff0c;无论是我们平时在聊天的时候使用的表情包或者是在工作中插入的插图都属于图片&#xff0c;在使用图片的时候大家会遇到各种各样的问题&#xff0c;比如上传的图片格式不对、使用的图片尺寸太大等等&#xff0c;都会导致图片无法正常使用&#…

[附源码]java毕业设计医院就诊流程管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

c++旅行商问题 (暴力解)

目录一、旅行商问题简介旅行商问题问题概述问题由来二、枚举所有方案1、思路2、代码3、复杂度分析三、深度优先搜索1、思路2、代码3、复杂度分析一、旅行商问题简介 旅行商问题 TSP&#xff0c;即旅行商问题&#xff0c;又称TSP问题&#xff08;Traveling Salesman Problem&am…

白盒测试与黑盒测试

白盒测试技术 白盒测试技术也称结构性测试&#xff0c;是一种设计测试用例的方法&#xff0c;一般用于分析程序的内部结构&#xff0c;使用该方法测试程序时测试者可以看到被测试程序&#xff0c;并分析其内部结构。 按照被测试测试时是否需要执行测试程序可以分为静态和动态…

RK3399平台开发系列讲解(中断篇)中断控制器驱动初始化

🚀返回专栏总目录 文章目录 一、设备树源文件1.1、gic控制器节点1.2、timer节点二、中断控制器匹配表三、中断控制器初始化3.1、函数of_irq_init3.2、函数gicv3_of_init3.3、函数gic_init_bases沉淀、分享、成长,让自己和他人都能有所收获!😄 一、设备树源文件 ARM64架构…

web前端网页制作课作业:甜甜圈蛋糕店(HTML+CSS+JavaScript)

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

用DIV+CSS技术设计的水果介绍网站(web前端网页制作课作业)

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

NodeJs实战-Express构建照片存储网站(2)-上传、展示文件

Express构建照片存储网站2-上传、展示文件静态资源显示图片photo页面展示文件夹下的图片上传文件增加上传页面的路由增加提交接口的路由网站效果图项目地址上一节使用的静态数据存储的图片的数据&#xff0c;本节增加如下功能 1–上传文件 2–展示文件 静态资源显示图片 app.…

企业微信自建应用手动授权,获取用户详细信息

开始开发 最后更新&#xff1a;2022/10/11 企业微信提供了OAuth的授权登录方式&#xff0c;可以让从企业微信终端打开的网页获取成员的身份信息&#xff0c;从而免去登录的环节。 企业应用中的URL链接&#xff08;包括自定义菜单或者消息中的链接&#xff09;&#xff0c;均可…

宇视高空抛物相机配置指导

宇视高空抛物相机配置指导 登录摄像机网页界面&#xff0c;进入[配置>智能监控>智能功能]页面启用<高空抛物>功能&#xff0c;并进入高空抛物配置界面&#xff1b; 添加/删除检测规则&#xff0c;根据实际高空抛物场景和规则下发要求绘制检测区域&#xff1b; (…

必看!!!客户端requests与服务端request收发请求

当使用代码进行接口访问的时候&#xff0c;请求的发送与请求的接受使用的参数应该怎么如何传输能够请求到正确的响应呢? 一、使用GET请求发送&#xff0c;客户端与服务端的参数传输与接受。 1、服务端&#xff0c;首先使用web框架写一个简单的接口&#xff0c;接收两个参数&…

FineReport常用配置和方法

目录 1、隐藏参数面板的小箭头&#xff1a; 1、隐藏参数面板的小箭头&#xff1a; 查看小箭头的class&#xff0c;css设置如下属性&#xff1a; 隐藏按钮&#xff1a; // 旧版 $(.parameter-container-collapseimg-up).hide(); // 新版 $(.report-main-parameter-container-…

浙大MBA考研经验分享:名校梦不可负~

上大学的时候考研失败&#xff0c;对于没能进入浙大求学一直是我心里的遗憾&#xff01;但是毕业以来至今工作三年&#xff0c;职场上的经历让我意识到持续学习提升的重要性。一边工作一边备考&#xff0c;对于基础普通的我来说&#xff0c;一年备战能够以211分的成绩成功上岸浙…

Collection体系集合

一、Collection体系结构 Collection体系结构的根接口&#xff0c;代表一组对象&#xff0c;称为“集合”。 List接口的特点&#xff1a;有序、有下标、元素可重复。 Set 接口的特点&#xff1a;无序、无下标、元素不能重复。 二、Collection父接口 特点&#xff1a;代表一组…

分布式计算模型Mapreduce实践与原理剖析(一)

第一章 MapReduce核心理论 1.1 什么是MapReduce MapReduce 是一个分布式运算程序的编程框架&#xff0c;是用户开发“基于 Hadoop 的数据应用” 的核心框架 。 MapReduce 核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序&#xff0c;并行运…

[短的文章] Spring Boot 日志创建使用、日志级别、@Slf4j、日志持久化——Spring Boot 系列

前言&#xff1a; 想必日志大家伙在项目开发调试过程中常会使用&#xff0c;这篇文章我们来一起探讨一下 Spring Boot 项目中日志的定义与使用&#xff0c;主要针对以下几个方面重点叙述 日志级别 日志框架进行日志定义 日志持久化 1 日志简述 1.1 为什么使用日志 日志大家在…

机器学习-逻辑回归

机器学习-基础知识 机器学习-线性回归 机器学习-逻辑回归 机器学习-聚类算法 机器学习-决策树算法 机器学习-集成算法 机器学习-SVM算法 文章目录逻辑回归1. 线性逻辑回归1.1. 理论基础1.2. 逻辑回归模拟步骤1.2.1. 数据集1.2.2. 模拟逻辑回归类模块1.2.3. 测试模块1.2.4. 数据…