cpu设计和实现(pc跳转和延迟槽)

news2024/11/26 22:49:11

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

        cpu按部就班地去取指执行是理想情况。很多时候,cpu的pc寄存器会跳来跳去的。跳转的情况很多,一般可以分成三种。第一,绝对跳转;第二,条件跳转;第三,异常跳转。绝对跳转,很容易理解,就是不得不做的跳转,比如在主函数里面调用子函数这种就属于绝对跳转。当然,函数调用的时候还需要把返回的地址保存一下。条件跳转,这种也很常见,就是对数据进行判断后,根据结果来分析下是否需要跳转。而异常跳转,就是发生异常情况不得不做的跳转,比如指令错误,数据除0,访存地址不对齐等等。这些都算是异常跳转。

        今天我们分析的是绝对跳转和条件跳转。根据cpu五级流水线的理论,跳转的地址判断需要在ex阶段才能给出来。但是这个时候pc已经连续给出了两个地址了。也就是说,如果关于跳转的地址计算只能在ex阶段给出,那么cpu还必须要执行跳转指令后面的两条指令。否则的话,cpu就要采取flush流水线的方法来进行解决,这对整个cpu的性能来说,其实是很伤的。

        那mips是怎么做的呢?目前来说,针对跳转问题,mips采取了两个方法。第一,引入延迟槽的概念,也就是说跳转指令后面的指令也会被强制执行;第二,就是把地址的判断和输入提前到译码阶段来进行。当然,既然跳转指令后面的延迟槽指令也会被强制执行,这部分要么用nop代替,要么就要编译器帮忙,引入一些有用的指令了。

1、绝对跳转

				`EXE_J:			begin
		  		wreg_o <= `WriteDisable;		aluop_o <= `EXE_J_OP;
		  		alusel_o <= `EXE_RES_JUMP_BRANCH; reg1_read_o <= 1'b0;	reg2_read_o <= 1'b0;
		  		link_addr_o <= `ZeroWord;
			    branch_target_address_o <= {pc_plus_4[31:28], inst_i[25:0], 2'b00};
			    branch_flag_o <= `Branch;
			    next_inst_in_delayslot_o <= `InDelaySlot;		  	
			    instvalid <= `InstValid;	
				end

        这是译码阶段的verilog代码。从代码可以看出,这个时候其实已经把给pc的jump地址准备好了,也就是branch_target_address_o。同时,branch_flag_o也置为真。

2、条件跳转

				`EXE_BEQ:			begin
		  		wreg_o <= `WriteDisable;		aluop_o <= `EXE_BEQ_OP;
		  		alusel_o <= `EXE_RES_JUMP_BRANCH; reg1_read_o <= 1'b1;	reg2_read_o <= 1'b1;
		  		instvalid <= `InstValid;	
		  		if(reg1_o == reg2_o) begin
			    	branch_target_address_o <= pc_plus_4 + imm_sll2_signedext;
			    	branch_flag_o <= `Branch;
			    	next_inst_in_delayslot_o <= `InDelaySlot;		  	
			    end
				end

        这是条件跳转,和绝对跳转不同的是,这里多了一个reg1_o和reg2_o的判断。也就是只有两个数据相等的时候,才会进行跳转处理。这个时候,细心的同学还会发现,除了设置branch_target_address_o和branch_flag_o之外,还有一个next_inst_in_delayslot_o的输出?这个数值是做什么用的。其实,这个数值是给异常处理用的。因为异常处理的时候,如果发现此时处理的指令是延迟槽的指令,那么就是做pc-4的处理,其中原因大家可以好好思考一下。

3、修改pc_reg.v代码

	always @ (posedge clk) begin
		if (ce == `ChipDisable) begin
			pc <= 32'h00000000;
		end else if(stall[0] == `NoStop) begin
		  	if(branch_flag_i == `Branch) begin
					pc <= branch_target_address_i;
				end else begin
		  		pc <= pc + 4'h4;
		  	end
		end
	end

        有了译码阶段给出的branch_target_address_i和branch_flag_i,这个时候pc就可以按照我们之前的设计跳转到合适的地方了。

4、准备汇编测试代码

   .org 0x0
   .set noat
   .set noreorder
   .set nomacro
   .global _start
_start:
   ori  $1,$0,0x0001   # $1 = 0x1                
   j    0x20
   ori  $1,$0,0x0002   # $1 = 0x2
   ori  $1,$0,0x1111
   ori  $1,$0,0x1100

   .org 0x20
   ori  $1,$0,0x0003   # $1 = 0x3               
   jal  0x40
   div  $zero,$31,$1   # $31 = 0x2c, $1 = 0x3
                       # HI = 0x2, LO = 0xe 
   ori  $1,$0,0x0005   # r1 = 0x5
   ori  $1,$0,0x0006   # r1 = 0x6
   j    0x60
   nop

   .org 0x40
               
   jalr $2,$31           
   or   $1,$2,$0        # $1 = 0x48
   ori  $1,$0,0x0009    # $1 = 0x9
   ori  $1,$0,0x000a    # $1 = 0xa
   j 0x80
   nop

   .org 0x60
   ori  $1,$0,0x0007    # $1 = 0x7                
   jr   $2           
   ori  $1,$0,0x0008    # $1 = 0x8
   ori  $1,$0,0x1111
   ori  $1,$0,0x1100

   .org 0x80
   nop
    
_loop:
   j _loop
   nop

5、翻译成指令文件

34010001
08000008
34010002
34011111
34011100
00000000
00000000
00000000
34010003
0c000010
03e1001a
34010005
34010006
08000018
00000000
00000000
03e01009
00400825
34010009
3401000a
08000020
00000000
00000000
00000000
34010007
00400008
34010008
34011111
34011100
00000000
00000000
00000000
00000000
08000021
00000000

7、开始波形仿真和测试

         利用iverilog、vvp、gtkwave工具进行编译、运行和显示之后,就可以判断一下跳转的功能有没有实现了。整个波形当中最关键的指标非pc寄存器莫属。当然,我们分析的时候还是一步一步来。

        首先查看rst结束,接着就是ce置位,然后就是pc寄存器数值的更替。通过观察,我们发现pc的地址依次是0x0、0x4、0x8、0x20这样的。这个时候可以看一下测试的汇编代码。第一条汇编代码是ori  $1,$0,0x0001 ,第二条指令是j    0x20,第三条指令是ori  $1,$0,0x0002。而此时,0x20出的代码是,

 .org 0x20
   ori  $1,$0,0x0003

        这说明两点。第一,pc跳转到0x20是完全正确的,获取的指令也是正确的。第二,在pc发生跳转的时候,当前指令的下一条指令,也就是延迟槽的指令也是被执行的。从上面的图形看,0x4是j 0x20,按照道理来说,下一条指令pc应该修改成了0x20。但是,我们发现pc在递增到0x8之后,才会真正修改为0x20,这说明延迟槽起了作用。

        在实际应用中,延迟槽发挥了很大的作用,但是也给我们后续处理带来了一些麻烦,比如在发生异常中断的时候就要对延迟槽做特别的处理,而且要非常小心才行。

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

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

相关文章

CRM软件哪个好?国内外6大顶级CRM软件盘点

CRM软件哪个好&#xff1f;国内外8大顶级CRM软件盘点 市场上存在上千种CRM管理系统&#xff0c;他们各有特色&#xff0c;难免让企业在选型时遇到诸多困难&#xff0c;有人说这款好用&#xff0c;有人说哪款好用... 所以本文将整理国内外那些顶级的CRM软件。 一、国内外6款CR…

分省/市/县最低工资标准-12-2021年1949-2020全国/省/市/县GDP数据

一、最低工资数据 1、数据来源&#xff1a;各省\市\县政府公布资料 2、时间跨度&#xff1a;2012-2021年 3、区域范围&#xff1a;全国各省\市\县 4、指标说明&#xff1a; 部分数据如下&#xff1a; 二、各省市县人均GDP 1、数据来源&#xff1a;地方统计局 2、时间跨度…

客户CRM能给企业带来哪些用处?

一、民营企业增加更多的总收入 CRM控制系统透过软件系统数个沟通沟通交流平台&#xff0c;不断扩大了与客人的沟通沟通交流距&#xff0c;保有终端版CRM&#xff0c;产品销售项目组足不出户与客人沟通交流&#xff0c;给民营企业增添了极高的股权投资股权投资回报。 简道云CR…

centos7中sshd -t没内容输出日志也没内容但sshd服务重启一直失败解决方法、strace命令的使用以及使用场景说明

文章目录ssh服务启动报错问题sshd启动报错说明解决方法常规排除定位法解决修改ssh的selinux上下文扩展知识【strace命令】ssh服务启动报错问题 sshd启动报错说明 sshd服务如果起不来&#xff0c;查日志一般都会有相应信息记录&#xff0c;如果sshd -t中有输出&#xff0c;不会…

都要2023年了,Android开发是否还值得入场?

随着手机行业的飞速发展&#xff0c;现在国产手机也迎来了高速发展时期&#xff0c;越来越多的人使用国产手机&#xff0c;同时开发安卓APP的人也越来越多了&#xff0c;下面来看看安卓app开发市场前景如何&#xff1f; 1、 消费用户群体成熟。安卓智能手机的市场份额可以说是庞…

Linux进程通信:命名管道,System V共享内存

目录 1.命名管道 2.共享内存 3.共享内存和管道的生命周期 4.共享内存的优缺点 1.命名管道 命名管道和匿名管道的最大差别是&#xff1a;命名管道是创建在磁盘里的一个有名字的文件。这个文件不存实际的数据。但是不同进程可以通过文件路径找到相同的struct file&#xff08…

你好,法语!A2知识点总结(2)

2.各种词类 2.1代词 代词&#xff0c;形容词&#xff0c;副词&#xff0c;介词 重读人称代词 1&#xff09;构成 2&#xff09;作用 1-重读人称代词≧2 一般次序&#xff1a;“他/她/它、你、我” Ex: Elle, toi et moi, nous allons faire du shopping. 2-soi: 泛指 Ex: -…

网络管理中TRUNK的作用和使用

作者简介&#xff1a;一名99年软件运维应届毕业生&#xff0c;正在自学云计算课程。宣言&#xff1a;人生就是B&#xff08;birth&#xff09;和D&#xff08;death&#xff09;之间的C&#xff08;choise&#xff09;&#xff0c;做好每一个选择。创作不易&#xff0c;动动小手…

路径规划算法之几何建模

目录 1 几何建模简介 1.1 机器人建模 1.2 环境建模 2 多边形和多面体模型 2.1 凸集的定义 2.2 凸集的边界表示与实心表示 2.3 非凸多边形 2.4 逻辑谓词 2.5 多面体模型 2.6 阿拉伯数字半代数模型 2.7 非凸多边形的另一种编码 2.8 3D三角形 2.9 非均匀有理B样条曲线…

Qt Quick、QML01——QML内容结构介绍

目录标题一、从Window 窗口组件开始&#xff08;一&#xff09;属性flags 表&#xff1a;visibility 表&#xff08;二&#xff09;信号和处理器&#xff08;槽函数&#xff09;&#xff08;通用&#xff09;&#xff08;三&#xff09;调用函数&#xff08;通用&#xff09;&a…

MapReduce Partition 分区

MapReduce Partition 分区 MapReduce输出结果个数研究 在默认情况下 不管Map阶段有多少个并发执行的task&#xff0c;到Reduce阶段&#xff0c;所有结果都将有一个task来进行处理&#xff0c;并且最终结果将输出到一个文件中&#xff0c;part-r-0000。 可以进行手动的设置re…

微信小程序图书商城毕业设计,图书商城购物小程序系统设计与实现,图书商城购物小程序商城毕设作品参考

功能清单 【后台管理员功能】 会员列表&#xff1a;查看所有注册会员信息&#xff0c;支持删除 录入资讯&#xff1a;录入资讯标题、内容等信息 管理资讯&#xff1a;查看已录入资讯列表&#xff0c;支持删除和修改 广告设置&#xff1a;上传图片和设置小程序首页轮播图广告地…

相机拍照不清晰怎么回事?不清晰地照片还能修复高清吗?

现在有很多的人都非常的喜欢拍照&#xff0c;主要就是因为喜欢记录&#xff0c;抓住我们身边的美&#xff0c;但是拍照的话就要使用相机&#xff0c;那么像相机电子产品我们在平常的时候是使用不到的&#xff0c;只有在有需求的时候可以使用的&#xff0c;而且也是有需求的人才…

Spring Security(6)

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e; Spring Security使用MySQL保存cookie记录虽然方便&#xff0c;但是目前更多的主流互联网应用都是用NoSQL来保存非业务数据的&#xff0c;Spring Security也应该可…

案例分享|生产环境MQ集群一个非常诡异的消费延迟排查

1、问题现象 某一天&#xff0c;项目组一个同事向我反馈&#xff0c;他们使用公司的数据同步产品将MySQL数据同步到MQ集群&#xff0c;然后使用消费者将数据再同步到ES&#xff0c;反馈数据同步延迟严重&#xff0c;但对应的消费组确没有积压&#xff0c;但最近最近几分钟的数…

LinkedIn领英开发客户方法大全(篇二)

profile完善步骤详细说明 详细步骤&#xff1a; 如下图箭头所示步骤&#xff0c;点击“view my profile”&#xff1a; 进入你的档案资料界面&#xff1a; 1&#xff09;点击红色圆圈所示处&#xff0c;即进入Edit intro界面: 即编辑个人简介&#xff0c;包括&#xff1a; …

企业如何通过推特群推创造商机

尤其是小企业要足够重视Twitter在营销推广上的重要性。因此&#xff0c;你有必要精心设计Twitter主页&#xff0c;并付诸投入和努力&#xff0c;这样就会看到消费者数量的增长&#xff0c;以及品牌忠诚度的提升。无疑&#xff0c;在Twitter上&#xff0c;很多企业可以发现商机&…

HTML基础-表单标签,button按钮,select下拉菜单

HTML基础-表单标签 目标和学习路径 1.表单标签 1.1 input系列标签的基本介绍 1.2 input系列标签-文本框 (拓展)value属性和name属性作用介 1.3 input系列标签-密码框 1.4 input系列标签-单选框 1.5 input系列标签-复选框 1.6 input系列标签-文件选择 2.button按钮标签 1.7 inpu…

JVS无忧·企业计划2.1.6更新说明

无忧企业计划是JVS企业数字化全家桶中重要组成部分&#xff0c;主要用于项目管理、任务管理、进度跟踪、过程管理等场景。 任务管理是企业内部事务协同的重要工具&#xff0c;与传统的OA有类似之处&#xff0c;同样是推动企业内部事务有效快速的执行&#xff0c;但之前存在不同…

直流无刷电机(BLDC)转速闭环调速系统及Matlab/Simulink仿真分析(二)

文章目录前言一、转速闭环直流调速系统二、Matlab/Simulink仿真2.1.仿真电路分析2.2.仿真结果分析总结前言 变压调速是直流调速系统的主要调速方法&#xff0c;因此系统的硬件至少包含&#xff1a;可调直流电源和直流电机两部分。可调直流电源多采用直流PWM变换器&#xff0c;…