电子科大-系统结构实验-解决数据冒险
- 格式:doc
- 大小:1.04 MB
- 文档页数:13
电子科技大学实验报告学生姓名:郫县LBJ 学号:指导教师:温柔可爱的刘杰彦实验地点:主楼A2-413 实验时间:2017年4月22日上午一、实验室名称:计算机学院主楼机房二、实验项目名称:进程与资源管理实验分工:郫县LBJ 进程管理设计郫县小胖子资源管理设计郫县威斯布鲁克进程调度与时钟中断设计三、实验学时:2四、实验原理:此处的实验原理在指导书上非常丰富,因此不照搬过来,主要写出所要使用到知识点,具体实现过程中的原理分析见报告第八部分“实验步骤”处。
(一)总体设计系统总体架构如图1所示,最右边部分为进程与资源管理器,属于操作系统内核的功能。
要求能够设计与实现一个简单的进程与资源管理器,具有如下功能:完成进程创建、撤销和进程调度;完成多单元 (multi_unit)资源的管理;完成资源的申请和释放;完成错误检测和定时器中断功能。
图1 系统总体结构(二) Test shell设计应具有的功能:1、从终端或者测试文件读取命令;2、将用户需求转换成调度内核函数(即调度进程和资源管理器);3、在终端或输出文件中显示结果:如当前运行的进程、错误信息等。
(三)进程管理设计1、进程状态与操作2、进程控制块结构PCB3、主要函数:创建进程、撤销进程(四)资源管理设计1、主要数据结构RCB2、请求资源3、释放资源(五)进程调度与时钟中断设计关键:使用基于优先级的抢占式调度策略,在同一优先级内使用时间片轮转算法。
参考课上ppt:五、实验目的:设计和实现进程与资源管理,并完成Test shell的编写,以建立系统的进程管理、调度、资源管理和分配的知识体系,从而加深对操作系统进程调度和资源管理功能的宏观理解和微观实现技术的掌握。
六、实验内容:设计与实现一个简单的进程与资源管理器,要求具有如下功能:完成进程创建、撤销和进程调度;完成多单元 (multi_unit)资源的管理;完成资源的申请和释放;完成错误检测和定时器中断功能。
电子科技大学计算机科学与工程学院单周期CPU的设计与实现实验指导书[计算机组成原理实验]张建2013-12-13目录前言 (1)1.1 实验内容 (2)1.2实验要求 (2)2. 实验环境 (3)2.1 硬件平台 (3)2.2 软件平台 (3)2.3 实验主要仪器设备连接框图 (4)3. 实验原理 (5)3.1 概述 (5)3.2 单周期CPU的总体电路 (5)3.3 MIPS指令格式 (6)3.4 数据路径设计 (7)3.4.1 下一条指令地址的选择 (7)3.4.2 ALU的输入端 (8)3.4.3寄存器堆的输入端 (8)4. 基本功能部件的设计与实现 (10)4.1 32位2选1选择器的设计与实现 (10)4.2 32位4选1选择器的设计与实现 (18)4.3 5位2选1选择器的设计与实现 (19)4.4 带有异步清零的32位D触发器的设计与实现 (19)4.5 移位器的设计 (20)4.6 32位加/减法器的设计与实现 (20)5.运算器(ALU)的设计与实现 (21)6.寄存器堆(Register File)的设计与实现 (24)7.控制器(Control Unit)的设计与实现 (27)8. CPU的封装 (30)9. 测试 (32)9.1 指令存储器及测试程序 (32)9.2 数据存储器及测试数据 (33)9.3 仿真测试 (33)9.4 下载到开发板验证 (35)附件: (39)BTN_Anti_Jitter模块 (39)Hex7seg_decode模块 (39)前言《计算机组成原理》是计算机科学专业的一门重要专业基础课。
在该课程中的理论学习中系统地阐述了计算机各组成部件的工作原理、逻辑实现和设计方法及将各部件连接成整机的方法,计算机硬件与底层软件的接口,培养了学生对计算机硬件系统的分析、开发与设计的基本技能能力。
本实验开设的目的是让学生通过设计一个单周期的CPU,加深对计算机各组成部件功能的理解和掌握,更好地理解计算机的基本工作原理,培养和锻炼学生掌握计算机硬件设计的基本方法和技能。
附件1操作系统上机实验进程调度实验时间:16 机时实验验收时间:17~18周实验成绩:占总成绩的20%一、实验目的和要求1.目的进程是操作系统最重要的概念之一,进程调度又是操作系统核心的主要内容。
本实习要求学生独立地用高级语言编写和调试一个进程调度程序,模拟各种调度算法。
调度算法可任意选择或自行设计,例如,简单轮转法和优先数法等。
本实验可加深对于进程调度和各种调度算法的理解。
2.要求(1)设计一个有n(n≥8)个进程并行的进程调度程序。
每个进程由一个进程控制块(PCB)表示。
进程控制块通常应包含下述信息:进程名(或序号)、进程优先数、进程需要运行的时间、占用CPU的时间以及进程的状态等(要求包括4种基本状态:运行、就绪、阻塞、完成),PCB块的内容应根据调度算法的不同特点而增删。
(2)调度程序应包含3种或3种以上不同的调度算法,运行时可任意选一种,以利于各种算法的分析比较。
其中至少有一种为综合调度算法,并要求是自己设计的算法。
(3)系统应能直观、准确地动态显示(用动态的表或图)各进程状态和参数的变化情况,便于观察诸进程调度的动态显示过程。
(4)要求完成一个完整的软件系统,用户界面友好,操作简便,可采用菜单选择或图形用户界面(GUI)实现。
说明:在windows 环境下开发,也可用其它工具或软件实现进程调度过程的模拟。
要求画出至少一个综合调度算法的实现流程图。
二、调度算法1.算法本程序可选用来先服务(FCFS)算法、最短CPU运行期优先(SCBF)算法、最高优先权(HPF)算法、时间片轮转(RR)算法及多级反馈队列算法等对多个进程进行调度。
同时注意对自己设计的综合调度算法要认真分析其特点。
每个进程处于运行、就绪、等待、完成四种状态,并假定起始状态都是就绪状态。
为了便于处理,程序中进程的运行时间以时间片为单位计算。
各进程的优先数或轮转时间片数、以及进程需要运行的时间片数,均由伪随机数发生器产生。
进程控制块结构如下图所示:2.算法举例以两种典型算法为例说明实现的算法:⑴优先数法(动态优先数)系统中各进程的初始优先级与进程类型(前台或后台,交互或批处理,计算或I/O)有关。
计算机专业核心硬件课程实验指导书电子科技大学计算机学院实验平台介绍一.硬件部分:1.核心适配板:主控芯片是XILINX公司的SPRTAN XC3S500E(50万逻辑门电路),它具有可编程接口(JTAG),通过并口与PC机相连,该芯片可以反复擦写。
2.实验箱上输入/输出接口:⑴按键开关:键按下为抵电平,弹起为高电平,实验箱上的序号是AN1,AN2。
用它可以形成脉冲信号。
(2个)⑵拨动开关:开关向上为高电平,向下为低电平,实验箱上的序号是K1~K12。
(12个)⑶发光二极管:分成红、绿、黄三种颜色。
高电平点亮,低电平熄灭。
实验箱上的序号是L1~L24。
(24个)(4)8段LED数码管:低电平点亮相应的段。
实验箱上的序号是LED1~LED4。
(4个)3. 用户接口部分二.软件部分:本实验系统的开发软件采用Xilinx公司的ISE集成开发环境。
其软件开发流程:1.创建工程*双击桌面“Xilinx ISE 7.1”;*选择“File” New Project”,屏上显示(图1);●填写“工程项目名”和文件存放路径。
*点击“下一步”,屏上显示(图2);●选择所使用芯片的类型、封装等信息;●选择综合工具(Synthesis Tool)(图1)(图2)2.设计输入*在(图3)对话框,输入文件名,同时选左框中的”Verilog Module”*输入Verilog HDL 的源程序代码(图3)3.约束(引脚绑定)*在“Process View”框中,点击“User Constraints”前的‘+’,双击“Assign Package Pins”*在“Design Browser”框中,选“I/O Pins”*在“Design Object List…”框中‘Loc’栏添入芯片的引脚序号,注意在引脚序号前加上字母p;4.综合在“Process View”框中,点击“Synthesize-XST”;5.实现在“Process View”框中,点击“Implement Design”;6.下载在“Process View”框中,点击“Configure Device(Impact)”;●选“Boundary-Scan Mode”●选“Automatically connect to cable….”(注意此时必须将实验目标板通过并口与PC相连,同时打开实验箱的电源!),屏上显示下图。
实验报告课程名称:计算机系统结构实验学院:计算机科学与工程学院专业:计算机科学与技术指导教师:好老师学生姓名:爱学习的小学生 6666666666666 实验成绩:日期:2017年5月5日电子科技大学实验报告一、实验项目名称:流水线代码分析二、实验室名称:主楼A2-412实验时间:2017年5月5日三、实验目的1. 熟悉代码中的模块名和接口信号,并理解其作用;2. 通过补全流水线的模块图,进一步熟悉代码中各模块的连接细节,加强对流水线CPU工作原理的掌握。
四、实验原理(一)V erilog HDL知识回顾(1)5种抽象的级别:系统级、算法级、RTL级、门级、开关级(2)功能:1. 可描述顺序执行或并行执行的程序结构;2. 用延迟表达式或事件表达式来明确地控制过程的启动时间;3. 通过命名的事件来触发其他过程里的激活行为或停止行为。
4.提供了条件(如if_else,case等)循环程序结构;5.提供了可带参数并且非零延续时间的任务(task)程序结构;6.提供了可定义新的操作符的函数(function)结构;7.提供了用于建立表达式的算术运算符、逻辑运算符、位运算符。
8.提供了一套完整的组合型原语(Primitive);(二)V erilog HDL的基本语法(三)流水线CPU原理图(四)I SE的使用(五)流水线CPU工作原理五、实验内容1. 列出代码中的模块名和接口信号,并写出他们的作用;2. 补全流水线的模块图:a)在现有图的基础上,在对应模块的输入输出接口处补全端口的名字;b)在现有图的基础上,补全未画出的模块和信号连线。
3. 对补全的流水线模块图作必要的文字说明,解释其工作原理。
六、实验器材(设备、元器件)ISE Design Suite 14.7集成开发环境,编程语言:Verilog HDL硬件描述语言七、实验步骤1.看懂老师给的CPU源代码;2.仔细对比各模块的形参,与最顶层模块中的实参,列出代码中的模块名和接口信号,并写出他们的作用;3.根据代码补充完善“流水线结构补充图”:a)在现有图的基础上,在对应模块的输入输出接口处补全端口的名字;b)在现有图的基础上,补全未画出的模块和信号连线。
2022年电子科技大学(沙河校区)软件工程专业《计算机系统结构》科目期末试卷A(有答案)一、选择题1、在计算机系统设计中,比较好的方法是( )A.从上向下设计B.从下向上设计C.从两头向中间设计D.从中间开始向上、向下设计2、在计算机系统设计中,比较好的方法是()。
A.从上向下设计B.从下向上设计C.从两头向中间设计D.从中间开始向上、向下设计3、系列机软件应做到( )。
A.向前兼容,并向上兼容B.向后兼容,力争向上兼容C.向前兼容,并向下兼容D.向后兼容,力争向下兼容4、不同系列的机器之间,实现软件移植的途径不包括()。
A.用统一的高级语言B.用统一的汇编语言C.模拟D.仿真5、静态流水线是指( )A.只有一种功能的流水线B.功能不能改变的流水线C.同时只能完成一种功能的多功能流水线D.可同时执行多种功能的流水线6、以下说法中,不正确的是()。
软硬件功能是等效的,提高硬件功能的比例会A.提高解题速度B.提高硬件利用率C.提高硬件成本D.减少所需存储器用量7、设16个处理器编号分别为0,1,2,...,15用Cube,互联函数时,第10号处理机与第()号处理机相联。
A.11B.8C.14D.28、对机器语言程序员透明的是( )。
A.中断字B.主存地址寄存器C.通用寄存器D.条件码9、对汇编语言程序员透明的是()A.I/O方式中的DMA访问B.浮点数据表示C.访问方式保护D.程序性中断10、对系统程序员不透明的应当是( )。
A.Cache存贮器XB.系列机各档不同的数据通路宽度C.指令缓冲寄存器D.虚拟存贮器二、填空题11、评价虚拟存贮器所用替换算法的好坏,主要是看主存________率的高低,其次看算法是否易于实现,以及所需的辅助软硬件的多少。
12、消息寻径方式可以分为两大类:________和________13、寻径的基本原则是:________或________14、交叉访问存储器通常有两种交叉编址方式:________和________15、Cache存贮器对应用程序员是________的。
实验报告课程名称:计算机系统结构实验学院:计算机科学与工程学院专业:计算机科学与技术指导教师:好老师学生姓名:爱学习的大哥哥实验成绩:日期:2017年5月26日电子科技大学计算机学院实验中心电子科技大学实验报告一、实验项目名称:解决控制冒险二、实验室名称:主楼A2-412实验时间:2017年5月26日三、实验目的在给出的流水线代码基础上,增加ID级关闭写使能信号,以解决不正确分支指令的影响。
通过完成这次实验,加深对控制冒险现象的产生和消除控制冒险的原理的理解,提高编程和测试的能力。
四、实验原理(一)转移相关问题转移指令改变程序顺序执行的特性。
由于是流水线操作,在转移发生之前,若干条转移指令的后续指令已被取到流水线处理机中。
这就是所谓的转移相关问题(branch hazard),有时也称之为控制相关问题(control hazard)。
回顾我们前面介绍的处理转移相关问题的4种技术:以上任何一种方法都会使硬件固定,编译时会根据硬件机制和转移行为对代码进行调度,以获取最佳性能。
(二)消除无条件转移指令的后一条指令影响每条指令在ID时判断在当前在EXE阶段的操作码暂存器的值是否是无条件转移指令:如果是,那么不使能当前在ID阶段的那条指令的WZ、WMEM和WREG的信号,这样这条指令的执行就对程序的逻辑没有影响。
(三)条件转移指令条件转移指令的实现思想与无条件转移指令有所类似,但不完全相同。
首先对于条件转移指令本身来说,需要判断Z标志是否能用。
若Z标志还没有准备好,则要暂停流水线一个时钟周期。
这一点和判断数据相关极为相似。
但由于转移指令只可能改变PC而不改变其它状态,因此用不着封锁WZ,WMEM,WREG(对转移指令来讲,这些信号原本就为0)。
因为如果处在译码级的是条件转移指令,而且处在EXE级的是ALU类型的指令(就要写Z标志到流水线寄存器Z了),则要等到ALU指令写完Z后,再判断转移与否,为此要暂停一个周期(或者如前所述,插入一条nop指令)。
电子科技大学计算机系统结构2013- 2014年期末考试题目回忆版本题型:选择十分每个一分简答30分综合题目60分选择题:系列机是向后兼容的。
评价:四个选项向前向后向上向下尼玛有区别吗?提高组相联的联合度主要是为了解决冲突失效的问题。
RISC体系结构是寄存器-寄存器型的体系。
一个存储系统为每个处理机提供相同的访问时间,是集中共享存储器的特点,这样的结构也称为均匀存储器访问UMA结构(尼玛竟然是第七章的内容)MISD实际代表何种计算机,目前不知道,就是不存在了。
多核芯片组成的处理机系统结构属于MIMD。
(尼玛这个知识点竟然考了两遍)S:add r1 r2,r3S+1: sub r1 r2,r4属于写后写相关。
前瞻执行的最后一步是确认(第四章内容)还有就记不得了。
简答题:机器语言物理机和虚拟机的概念。
(尼玛第一章的内容)TLB快表的作用,TLB快表的内容(两个)。
(第五章)BTB表格的两个内容。
(第四章)RISC的两个重要特点。
(第二章,尼玛我真的不知道那么多特点哪两个重要的)试分析采用哪种设计方案实现求浮点数除法FPMUL对系统性能提高更大。
假定FPMUL 操作占整个测试程序执行时间的12%。
一种设计方案是增加专门的FPMUL硬件,可以将FPMUL操作的速度加快到16倍;另一种设计方案是提高所有FP运算指令的执行速度,使得FP指令的执行速度加快为原来的1.6倍,设FP运算指令在总执行时间中占50%。
(6分)(这个题目就是期中考试题目改了一下)写出三级Cache的平均访问时间的公式。
(题目当然不是这样的,但是这个原理懂了之后,那个小小的计算题就不是问题了,就是给了两级Cache的相关参数,求L1的失效时间,知道公式往里面带入就行了)大题:一题是:如图所示,题目给出了这个图,下面是9分的填空和5分的简答。
简答题:在wb级的时候这一级的作用和各个信号的值作用。
题目中给出的指令是load指令,我这个图是随便在ppt上找的。
电子科技大学计算机学院标准实验报告(实验)课程名称数字逻辑综合实验xxx20160xxxxxxxxx电子科技大学教务处制表电子科技大学实验报告 1学生姓名:xxx 学号:指导教师:吉家成米源王华一、实验项目名称:中小规模组合逻辑设计二、实验目的:1.掌握非门、或门、与非门、异或门、数据选择器的逻辑功能。
2.掌握常有逻辑门电路的引脚排列及其使用方法。
3.采用中小规模逻辑门进行组合逻辑设计,掌握组合逻辑的设计方法。
三、实验内容:1.逻辑输入采用实验箱的K1-K11,逻辑输出接L1-L10。
测试实验箱上的HD74LS04P(非门)、SN74LS32N(或门)、SN74LS00N(与非门)、SN74HC86N(异或门)、SN74HC153(数据选择器、多路复用器)的逻辑功能。
2.采用小规模逻辑器件设计一位数据比较器:设一位数据比较器的输入为A、B,比较A>B,A=B,A<B,输出三个比较结果,输出采用低电平有效。
3.分别用小规模和中规模逻辑器件设计3输入多数表决器:设输入为A、B、C,当三个输入有两个或两个以上同意时,输出结果为同意,输入、输出的同意均为高电平有效。
四、实验原理:1.一块74LS04芯片上有6个非门。
非门的逻辑功能如表1所示,74LS04(非门、反相器)的逻辑符号和引脚排列如下图所示。
图1 74LS04的逻辑符号和引脚排列2.74LS32(或门)的逻辑符号、引脚排列如下图所示。
图2 74LS32的逻辑符号和引脚排列输入输出YA BL L LL H HH L HH H H3.74LS00输入输出YA BL L HL H HH L HH H L图3 74LS00逻辑符号和引脚排列4.一块74HC86芯片上有4个异或门。
异或门的逻辑功能如表4所示,74HC86(异或门)的逻辑符号、引脚排列如图4所示。
表4异或门的逻辑功能输入输出YA BL L LL H HH L HH H L图4 74HC86逻辑符号和引脚排列5.74HC153芯片上有两个4选1数据选择器。
电子科技大学计算机工程学院标准实验报告(实验)课程名称电子科技大学教务处制表电子科技大学实验报告实验一学生姓名:穆萨·图拉克学号:2012060090033 指导教师:实验地点:主楼A2-412 实验时间:19:00~一、实验室名称:二、实验项目名称:汇编源程序的上机调试操作基础训练三、实验学时:四、实验原理:(包括知识点,电路图,流程图)DEBUG 的基本调试命令;汇编数据传送和算术运算指令MASM宏汇编开发环境使用调试方法五、实验目的:1. 掌握DEBUG 的基本命令及其功能2. 学习数据传送和算术运算指令的用法3. 熟悉在PC机上编辑、汇编、连接、调试和运行汇编语言程序的过程六、实验内容:(介绍自己所选的实验内容)1. DEBUG命令的使用2. 程序的调试与运行3. 编写程序计算以下表达式:Z=(5X+2Y-7)/2设X、Y的值放在字变量V ARX、V ARY中,结果存放在字节单元V ARZ中。
七、实验器材(设备、元器件):WinXP PC机,MASM,50 ,VisulASM软件平台。
八、实验步骤:(编辑调试的过程)1.编辑源程序,建立一个以后缀为.ASM的文件.2.汇编源程序,检查程序有否错误,有错时回到编辑状态,修改程序中错误行。
无错时继续第3步。
3.连接目标程序,产生可执行程序。
4.用DEBUG程序调试可执行程序,记录数据段的内容。
九、实验数据及结果分析:(实验运行结果介绍或者截图,对不同的结果进行分析)程序说明:功能:本程序完成Z=(5X+2Y-7)/2这个等式的计算结果求取。
其中X 与Y是已知量,Z是待求量。
结构:首先定义数据段,两个DB变量VARX与VARY(已经初始化),以及结果存放在VARZ,初始化为?。
然后定义堆栈段,然后书写代码段,代码段使用顺序程序设计本程序,重点使用MOV和IMUL以及XOR,IDIV完成程序设计。
详细内容见程序注释。
程序清单:DATA SEGMENTVARX DB10VARY DB10VARZ DB?DATA ENDSSTACK SEGMENT PARA STACKSTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKMAIN:MOV AX,DATAMOV DS,AXMOV AL,VARXMOV AH,VARYSAL AL,1SAL AL,1ADD AL,VARXSAL AH,1ADD AL,AHSUB AL,7SAR AL,1MOV VARZ,ALMOV AH,4CHINT21HCODE ENDSEND MAIN程序框图:结束调试说明:将汇编语言(.asm文件)通过masm命令转换为目标程序(.obj 文件),通过link命令转换为目标程序可执行程序(.exe文件); 这次试验还要用-p参数以及d参数显示结果为:十、实验结论:(联系理论知识进行说明)通过本次实验,我们学习了解掌握了DEBUG 的基本命令及其功能,学习了数据传送和算术运算指令的用法,熟悉了在PC机上编辑、汇编、连接、调试和运行汇编语言程序的过程。
实验报告课程名称:计算机系统结构实验学院:计算机科学与工程学院专业:计算机科学与技术指导教师:好老师学生姓名:爱学习的小学生 20实验成绩:日期:2017年5月19日电子科技大学计算机学院实验中心电子科技大学实验报告一、实验项目名称:解决数据冒险二、实验室名称:主楼A2-412 实验时间:2017年5月19日三、实验目的在给出的流水线代码基础上,增加内部前推数据通路、暂停流水线数据通路和关闭写使能信号的数据通路,解决普通的数据冒险和load数据冒险,通过完成本次实验,更好地理解和掌握解决数据冒险的原理,学以致用,增强编写程序的能力。
四、实验原理(一)数据冒险的定义由于流水线上指令重叠执行,改变了原来串行执行的读/写操作数顺序,使得后面依赖前面指令结果的指令得不到准备好的数据,这样的现象叫做数据冒险(数据相关)。
回顾数据冒险的程序例子I1: add r1,r2,r3I2: sub r4,r1,r5I3: and r6,r7,r1I4: or r8,r1,r9I5: addi r10,r1,100I1下面有3条指令不能从寄存器r1读出正确的数据。
(二)数据冒险的解决方案1、暂停流水线如上图所示,暂停流水线到最初的指令执行完毕,可以解决数据冒险,但是会涉及到两个问题,即“如何检测出数据冒险”和“如何暂停流水线”。
如何检测数据冒险a.比较器;I1指令写目的寄存器rd,I2和I3的源操作数是寄存器rs1或rs2中的数据,I2、I3的rs1或rs2与I1的目的寄存器号rd相等时才有可能发生数据冒险。
b.操作码参与检测;由于指令格式中源寄存器号rs2与立即数部分重叠,而立即数是不会出现冒险的,因此,指令操作码必须要参与检测(区分是寄存器操作数还是立即数)。
c.WREG信号也应参与检测(实际上,WREG也是从操作码中得出的);如何暂停流水线暂停条件判断电路STALL的输入包括OPCODE,ID_rsl,ID_rs2,EXE_rd,EXE_WREG,MEM_rd和MEM_WREG。
输出为DEPEN。
封锁本条指令所产生的影响的方法是把DEPEN分别和译码器的输出Decoder_WZ,Decoder_WMEM和Decoder_WREG相与,再送到ID级和EXE级之间的流水线寄存器的输入端。
因为只有这些写信号才改变处理机或存储器的状态,因而我们不必去封锁其它诸如ALUOP或多路器的选择信号。
封锁其后续指令的方法是禁止向IR及PC写入新的数据,即把DEPEN接到IR和PC的写使能端WIR和WPC。
当这两个信号为0时,禁止向IR和PC写人数据。
2、内部前推技术数据相关本质:一条指令执行时要用到上面指令的计算结果,但这个结果尚未被写入寄存器堆。
而实质上,此时结果已经由ALU计算出来了,在流水线寄存器R和C中。
由此,我们可以在ALU的两个数据输入端各加一个多路器,使R和C中的数据能被直接送到ALU的输入端,这就是所谓的内部前推。
以下是检测数据相关的完整信号:EXE_A_DEPEN=(ID_rs1= =EXE_rd)(EXE_WREG= =1)(ID_rs1IsReg)EXE_B_DEPEN=(ID_rs2= =EXE_rd)(EXE_WREG= =1)(ID_rs2IsReg)+(ID_rd= =EXE_rd)(EXE_WREG= =1)(store)MEM_A_DEPEN=(ID_rs1= =MEM_rd)(MEM_WREG= =1)(ID_rs1IsReg)MEM_B_DEPEN=(ID_rs2= =MEM_rd)(MEM_WREG= =1)(ID_rs2IsReg)+(ID_rd= =MEM_rd)(MEM_WREG= =1)(store)ID_rs1IsReg=and+andi+or+ori+add+addi+sub+subi+load+storeID_rs2IsReg=and+or+add+sub(EXE_WREG= =1)表示EXE级的指令确实要更新寄存器,没被取消(ID_rs1IsReg)条件是为了确认是寄存器,而不是立即数EXE_rd表示EXE级的流水线目标寄存器rdDEPEN=A_DEPEN + B_DEPENA_DEPEN=EXE_A_DEPEN + MEM_A_DEPENB_DEPEN=EXE_B_DEPEN + MEM_B_DEPEN(三)load指令的处理——暂停与内部前推相结合ALU指令在EXE级结束后,结果就出现在流水线寄存器R中,后续指令可以通过内部前推电路来直接使用它。
但有一种情况是例外:load r1, 200(r2);add r3, r1, r4;load指令在EXE级结束后,还在忙着访问存储器。
在MEM级结束后,结果才出现在流水线寄存器D中,见下图。
这时,即使使用内部前推技术也无法消除load指令与它的下一条相关指令之间的第一个“气泡”。
我们的是由硬件负责检测与load指令的相关性。
为了保证操作结果的正确性,我们采用暂停流水线一个周期的方法。
第二个“气泡”用内部前推技术加以消除。
我们给出下面的用于实现load流水线暂停的控制信号的表达式。
这个信号是在ID级产生,并且使用与暂停ALU流水线类似的方法:LOADDEPEN=EXE_A_DEPEN+EXE_B_DEPENEXE_A_DEPEN=(ID_rs1= =EXE_rd)(EXE_SLD= =1)(ID_rs1IsReg)EXE_B_DEPEN=(ID_rs2= =EXE_rd)(EXE_SLD= =1)(ID_rs2IsReg)+(ID_rd= =EXE_rd)(EXE_SLD= =1)(store)ID_rs1IsReg=and+andi+or+ori+add+addi+sub+subi+load+storeID_rs2IsReg=and+or+add+sub其中, EXE_SLD= =1表示WB级的多路选择器选择中间寄存器D的值EXE_SLD,表示EXE级是load指令。
或者也可以把译出的load指令打入流水线寄存器,使用它而不是EXE_SLD。
五、实验内容在给出的流水线代码基础上,增加内部前推数据通路、暂停流水线数据通路和关闭写使能信号的数据通路以解决普通的数据冒险和load数据冒险。
六、实验器材(设备、元器件)ISE Design Suite 集成开发环境,编程语言:Verilog HDL硬件描述语言七、实验步骤(一)创建工程DataHazardAndForwarding(二)将原工程文件导入(三)在pipelinedcpu中添加下列变量:wire[1:0] idadepend,idbdepend;//id 级a、b dependwire[1:0] exeadepend,exebdepend;// exe级 a、b dependwire wpc;//写pc为了解决数据冒险,需要将depend的值保存下来,所以需要两个a、bdepend值wpc用于暂停流水线,从而实现load冒险时暂停指令留出以及写寄存器和写mem (四)为了实现数据通路,需要在下列模块的参数列表上增加一些参数增加后的代码如下pipepc prog_cnt (npc,clock,resetn,pc,wpc);//程序计数器PC//**********pipeir inst_reg (pc4,ins,clock,resetn,dpc4,inst,wpc);//IF级与ID级之间的寄存器,即指令寄存器IR//******pipeid id_stage (dpc4,inst,//指令译码ID级wrn,wdi,wwreg,clock,resetn,bpc,jpc,pcsource,dwreg,dm2reg,dwmem,daluc,daluimm,da,db,dimm,drn,dshift,djal,z,ern,mrn,ewreg,mwreg,idadepend,idbdepend,em2reg,wpc);pipedereg de_reg (dwreg,dm2reg,dwmem,daluc,daluimm,da,db,dimm,drn,dshift,djal,dpc4,clock,resetn,ewreg,em2reg,ewmem,ealuc,ealuimm,ea,eb,eimm,ern0,eshift,ejal,epc4,idadepend,idbdepend,exeadepend,exebdepend,pcsource);//ID级与EXE级之间的寄存器pipeexe exe_stage (ealuc,ealuimm,ea,eb,eimm,eshift,ern0,epc4,//指令执行EXE级ejal,ern,ealu,z,malu,wmo,exeadepend,exebdepend);(五)在id_stage的cu中添加判断冒险的代码,并计算出a_depend和b_depend的值,cu的完整代码如下module pipeidcu(rsrtequ,func,op,wreg,m2reg,wmem,aluc,regrt,aluimm,sext,pcsource,shift,jal,/*数据前推加入的参数*/exe_rd,mem_rd,exe_wreg,mem_wreg,idadepend,idbdepend,rs,rt,rd,exe_m2reg,wpc);input[4:0] exe_rd,mem_rd,rs,rt,rd;input exe_wreg,mem_wreg,exe_m2reg;output[1:0] idadepend,idbdepend;output wpc;//wreg 是否写寄存器//dm2reg为1时将存储器数据写入寄存器,否则将ALU结果写入寄存器//dwmem为1时写存储器,否则不写////daluimm为1时ALUb输入端使用立即数//dshift为1时ALUa输入端使用移位位数//djal为1时执行jal指令,否则不是input rsrtequ;input[5:0] func,op;output wreg,m2reg,wmem,regrt,aluimm,sext,shift,jal;output[4:0] aluc;output[1:0] pcsource;wire i_add,i_sub,i_mul,i_and,i_or,i_xor,i_sll,i_srl,i_sra,i_jr;//对指令进行译码wire i_addi,i_muli,i_andi,i_ori,i_xori,i_lw,i_sw,i_beq,i_bne,i_lui,i_j,i_jal;and(i_add,~op[5],~op[4],~op[3],~op[2],~op[1],~op[0],~func[2],~func[1],func[0]);and(i_sub,~op[5],~op[4],~op[3],~op[2],~op[1],~op[0],~func[2],func[1],~func[0]);and(i_mul,~op[5],~op[4],~op[3],~op[2],~op[1],~op[0],~func[2],func[1],func[0]);and(i_and,~op[5],~op[4],~op[3],~op[2],~op[1],op[0],~func[2],~func[1],func[0]);and(i_or,~op[5],~op[4],~op[3],~op[2],~op[1],op[0],~func[2],func[1],~func[0]);and(i_xor,~op[5],~op[4],~op[3],~op[2],~op[1],op[0],func[2],~func[1],~func[0]);and(i_sra,~op[5],~op[4],~op[3],~op[2],op[1],~op[0],~func[2],~func[1],func[0]);and(i_srl,~op[5],~op[4],~op[3],~op[2],op[1],~op[0],~func[2],func[1],~func[0]);and(i_sll,~op[5],~op[4],~op[3],~op[2],op[1],~op[0],~func[2],func[1],func[0]);and(i_jr,~op[5],~op[4],~op[3],~op[2],op[1],~op[0],func[2],~func[1],~func[0]);and(i_addi,~op[5],~op[4],~op[3],op[2],~op[1],op[0]);and(i_muli,~op[5],~op[4],~op[3],op[2],op[1],op[0]);and(i_andi,~op[5],~op[4],op[3],~op[2],~op[1],op[0]);and(i_ori,~op[5],~op[4],op[3],~op[2],op[1],~op[0]);and(i_xori,~op[5],~op[4],op[3],op[2],~op[1],~op[0]);and(i_lw,~op[5],~op[4],op[3],op[2],~op[1],op[0]);and(i_sw,~op[5],~op[4],op[3],op[2],op[1],~op[0]);and(i_beq,~op[5],~op[4],op[3],op[2],op[1],op[0]);and(i_bne,~op[5],op[4],~op[3],~op[2],~op[1],~op[0]);and(i_lui,~op[5],op[4],~op[3],~op[2],~op[1],op[0]);and(i_j,~op[5],op[4],~op[3],~op[2],op[1],~op[0]);and(i_jal,~op[5],op[4],~op[3],~op[2],op[1],op[0]);wire i_rs=i_add|i_sub|i_mul|i_and|i_or|i_xor|i_jr|i_addi|i_muli|i_andi|i_ori|i_xori|i_lw|i_sw|i_beq|i_bne;wire i_rt=i_add|i_sub|i_mul|i_and|i_or|i_xor|i_sra|i_srl|i_sll|i_sw|i_beq|i_bne;////////////////////////////////////////////控制信号的生成/////////////////////////////////////////////////////////assign wreg=(i_add|i_sub|i_mul|i_and|i_or|i_xor|i_sll|//wreg为1时写寄存器堆中某一寄存器,否则不写i_srl|i_sra|i_addi|i_muli|i_andi|i_ori|i_xori|i_lw|i_lui|i_jal)& wpc ;assign regrt=i_addi|i_muli|i_andi|i_ori|i_xori|i_lw|i_lui;//regrt为1时目的寄存器是rt,否则为rdassign jal=i_jal;//为1时执行jal指令,否则不是assign m2reg=i_lw;//为1时将存储器数据写入寄存器,否则将ALU结果写入寄存器assign shift=i_sll|i_srl|i_sra;//为1时ALUa输入端使用移位位数assign aluimm=i_addi|i_muli|i_andi|i_ori|i_xori|i_lw|i_lui|i_sw;//为1时ALUb输入端使用立即数assign sext=i_addi|i_muli|i_lw|i_sw|i_beq|i_bne;//为1时符号拓展,否则零拓展assign aluc[4]=i_sra;//ALU的控制码assign aluc[3]=i_sub|i_or|i_ori|i_xor|i_xori| i_srl|i_sra|i_beq|i_bne;//ALU的控制码assign aluc[2]=i_sll|i_srl|i_sra|i_lui;//ALU的控制码assign aluc[1]=i_and|i_andi|i_or|i_ori|i_xor|i_xori|i_beq|i_bne;//ALU的控制码assign aluc[0]=i_mul|i_muli|i_xor|i_xori|i_sll|i_srl|i_sra|i_beq|i_bne;//ALU的控制码assign wmem=i_sw & wpc ;//为1时写存储器,否则不写//判断rs1是否为寄存器操作数assign rs1IsReg=i_and | i_andi | i_or | i_ori | i_add | i_addi | i_sub | i_lw | i_sw | i_sll | i_srl | i_sra;////判断rs2是否为寄存器操作数assign rs2IsReg=i_and | i_or | i_add | i_sub | i_sll | i_sra | i_srl;//计算exe级和mem级adependassign exe_a_depen=((rs==exe_rd)&(exe_wreg==1)&(rs1IsReg));assign mem_a_depen=((rs==mem_rd)&(mem_wreg==1)&(rs1IsReg));//计算exe级和mem级bdependAssign exe_b_depen=((rt==exe_rd)&(exe_wreg==1)&(rs2IsReg))|((rd==exe_rd)&(exe_wreg==1)&(i_sw));assign mem_b_depen=((rt==mem_rd)&(mem_wreg==1)&(rs2IsReg))|((rd==mem_rd)&(mem_wreg==1)&(i_sw));//计算adepend和bdependassign idadepend[0]= mem_a_depen;assign idadepend[1]=mem_a_depen | exe_a_depen ;assign idbdepend[0]=mem_b_depen | aluimm ;assign idbdepend[1]=mem_b_depen | exe_b_depen;//判断load指令冒险,如果是wpc=0,stall一个时钟周期assign wpc =~(((rs==exe_rd)&exe_m2reg &rs1IsReg )|((rt==exe_rd)&exe_m2reg &rs2IsReg) |((rd==exe_rd )&exe_wreg &i_sw)|((rd==mem_rd)&mem_wreg &i_sw));assign pcsource[1]=i_jr|i_j|i_jal;//选择下一条指令的地址,00选PC+4,01选转移地址,10选寄存器内地址,11选跳转地址assign pcsource[0]=i_beq&rsrtequ|i_bne&~rsrtequ|i_j|i_jal;endmodule(六)接着修改多路选择器,将以前的两路转化成四路module mux4x32(a0,a1,a2,a3,s,y);input[31:0] a0,a1,a2,a3;input[1:0] s;output[31:0] y;assign y=(s==2'b00)a0:(s==2'b01)a1:(s==2'b10)a2:a3;//四选一endmodule八、实验数据及结果分析(一)画出修改后的流水线图;(二)写出增加的多路选择器的选择信号逻辑函数增加的多路选择器信号逻辑函数如下://加上数据前推之后变成四选一的多路器mux4x32 alu_ina (ea,sa,malu,wmo,exe_a_depend,alua);mux4x32 alu_inb (eb,eimm,malu,wmo,exe_b_depend,alub);多路选择器的定义如下:module mux4x32(a0,a1,a2,a3,s,y);input[31:0] a0,a1,a2,a3;input[1:0] s;output[31:0] y;assign y=(s==2'b00)a0:(s==2'b01)a1:(s==2'b10)a2:a3;//四选一endmodule(三)流水线仿真结果,对仿真结果进行必要说明为了验证是否程序正确的完成了forwarding和数据冒险,下面将进行两组测试,并对测试结果进行详细分析解释测试一(非load指令数据冒险测试)首先不管是不是load指令,数据冒险都会用到数据前推,实验提供的代码中测试文件里面的例子就是一个很典型的数据冒险,下面直接用这组例子进行测试,代码如下//测试数据前推assign rom[6'h00]=32'h;//lui r1,0 0assign rom[6'h01]=32'h;//ori r4,r1,80 80assign rom[6'h02]=32'h00202124;//sub r8,r9,r4 fffassign rom[6'h03]=32'h;//addi r5,r0,4 4assign rom[6'h04]=32'h;//store r2,0x0(r4) 80assign rom[6'h05]=32'h;//load r9,0x0(r4) 80可以看到第二条指令和第三条指令关于r4冲突,如果没有解决数据冒险,sub指令时r8会写入0(r9=r4=0),解决数据冒险过后,应该等于-80。