电子科技大学计算机系统结构综合实验实验报告_第1页
电子科技大学计算机系统结构综合实验实验报告_第2页
电子科技大学计算机系统结构综合实验实验报告_第3页
电子科技大学计算机系统结构综合实验实验报告_第4页
电子科技大学计算机系统结构综合实验实验报告_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验报告课程名称:计算机系统结构综合实验学院:计算机科学与工程学院专业:计算机科学与技术学生姓名:Wolf Alice学号:16指导教师:米源评分:日期:2019 年6 月 6日电 子 科 技 大 学实 验 报 告学生姓名:Wolf Alice 学号:16 指导教师:米源实验地点:主楼A2-412 实验时间: 2019.5.24 一、实验室名称:主楼A2-412二、实验项目名称:CPU流水线结构分析三、实验学时:4四、实验原理:(一)流水线处理机及其设计流水线(pipeline)是一种能够使多条指令重叠执行的处理机的实现技术,它已成为现代处理机设计中最为关键的技术。流水线处理机把一条指令的执行

2、分成几个步骤,或称级(stages),每一级在一个时钟周期内完成。在每个时钟周期,处理机启动执行一条指令。如果处理机的流水线有m级,则同时可重叠执行的指令总条数将为m,每条指令处在不同的执行阶段。如果分级分得好的话,那么每一级都没有时间上的浪费,这是最理想的情况。流水线处理机的最大特点:每一个时钟周期取出一条指令来执行。所有的指令按取出的先后次序通过数据路径。依照指令类型的不同,每种指令在执行过程中可能会用到数据路径的不同的部分。1. 流水线寄存器的引入在单周期处理机中,如果一条指令还没有执行完毕,PC的内容不会改变。这就使得在一条指令的整个执行过程中,IM始终输出当前指令。流水线处理机每个时

3、钟周期都要取出一条指令。因此,当流水线处理机已从存储器取出一条指令并把它送到ID级去译码时,下一条指令也正在从指令存储器中取出。如果先取出的指令没被保存,则它后面正在被取出的指令会对它造成影响。也就是说,必须要使用寄存器来保存从存储器取出的指令。推而广之,我们必须要在流水线的各级之间安排一组寄存器,用以保存当前时钟周期各流水级操作的结果,以便为下个周期使用,我们称这些寄存器为流水线寄存器。在第一级与第二级之间,我们使用了一个被称为IR(instruction register)的指令寄存器。对于字长为32位的处理机来讲,PC一般有30位,它存放的是32位指令的字地址。IR有32位,用来存放一条

4、指令。第二和第三级之间需要较多的寄存器:* 从寄存器堆中读出的两个32位数据A和B必须要保存。* 经符号扩展后的32位立即数I也要保存。图中的ISE(immediate sign-extend)代表指令中立即数的符号扩展。* 一个d寄存器(5位),它被用来保存目的寄存器号;因为指令的操作结果要在WB级写入寄存器堆,目的寄存器号也要在那时使用,因此必须要同步跟随过去。第三级和第四级之间除了d之外,还有Z,R和S: Z用于存放ALU的一位ZERO标志。当ALU指令的运算结果为全0时,ZERO输出1,否则输出0。在执行条件转移指令时,Z用来决定是否真正转移。 S专为store指令而设,用来存放要被写

5、入存储器中的数据。 R保存32位ALU运算结果。 第四级和第五级之间的寄存器如下: D存放load指令从存储器中读出的数据; C只是保存前一级的R,即ALU指令的结果。 这一级d寄存器的输出用于指定目的寄存器,D或C的数据要被写入由d所指定的目的寄存器中。我们可以把寄存器堆看作是最后一级流水线寄存器。2. 流水线处理机的5部分和数据路径我们把执行指令的过程分为5部分,使其能够按流水线方式执行指令。每一级所使用的名字及其要完成的动作如下:(1) IF(instruction fetch)取指令; 使用PC的内容访问指令存储器,取出指令,并在该级结束时,把指令打人IR寄存器。 下一条指令的地址也在

6、这一级计算出,并把它打人PC寄存器。 (2) ID(instruction decode)指令译码并读寄存器操作数;指令译码级主要有两件事情要做: 从寄存器堆中读寄存器操作数和对指令中的立即数部分进行符号扩展。 此外:目的寄存器号要保存在流水线寄存器d中,以便在WB级指定把结果写入哪一个寄存器中。(3) EXE(execution)执行;* ALU运算类指令将在本级计算结果,并把它打人R寄存器。同时,ALU的ZERO输出也被打入Z寄存器。ALU的两个操作数,一个来自于寄存器rs1,它在前一级已被打人流水线寄存器A中了;另一个或是寄存器rs2操作数(B中内容),或是立即数(I中内容)。(4) M

7、EM(memory access)存储器访问;存储器访问级专为loadstore指令而设。 loadstore均使用流水线寄存器R的输出作为访问存储器的地址。store指令把S的内容写入存储器。load指令读存储器,并把读出的数据打入流水线寄存器D。 ALU指令在本级直接把R内容打入C。(5) WB(write back)写回。写回级把指令结果写回到寄存器堆。目的寄存器号由从ID级一直传递过来d指定。写入的来源有两个:* 一个是流水线寄存器D中的内容(load指令读出内容),即存储器数据;* 一个是ALU的计算结果指令执行时从左移向右通过数据通路。但有两处从右向左的例外: WB级,它把运算结果

8、写回中间靠左位置的寄存器堆中; IF级,它把经过计算的下一条指令的地址写入程序计数器PC中。下一条指令地址的计算方法有两种:一种是当前PC加4;另一种是当前PC加字地址偏移量,偏移量在指令中定义出。(二)流水线模型机的指令系统和指令格式 ALU操作类型的指令 存储器访问指令 条件转移指令 无条件转移指令 ALU指令除了把运算结果写入寄存器堆之外,也把ZERO标志写入Z寄存器。 条件转移指令使用Z标志决定是否转移,其它指令不影响Z寄存器。1、对于add/and/or/xor rd,rs,rt指令 /rdrs op rt其中rs和rt是两个源操作数的寄存器号,rd是目的寄存器号。2、对于sll/s

9、rl rd,rt,shift 指令 /rdrt 移动 shift位3、对于addi rt,rs,imm 指令 /rtrs+imm(符号拓展)rt是目的寄存器号,立即数要做符号拓展到32位。4、对于andi/ori/xori rt,rs,imm 指令 /rtrs op imm(零拓展)因为是逻辑指令,所以是零拓展。5、对于load rt,offset(rs) 指令 /rt memoryrs+offsetload是一条取存储器字的指令。寄存器rs的内容与符号拓展的offset想加,得到存储器地址。从存储器取来的数据存入rt寄存器。6、对于store rt,offset(rs) 指令 / memor

10、yrs+offset rtstore是一条存字指令。存储器地址的计算方法与load相同。7、对于beq rs,rt,label指令 /if(rs=rt) PClabelbeq是一条条件转移指令。当寄存器rs内容与rt相等时,转移到label。如果程序计数器PC是beq的指令地址,则label=PC+4+offset2=72=1.将上述结果从第三个时钟周期开始和EXE_Alu的值核对,结果一致,说明CPU的EX级是正确的。第五行MEM_Alu是访问内存阶段的地址,由于这一阶段若访问内存,则其地址是根据ALU的运算结果得到的,所以除了在时间上落后EXE_Alu的值一个周期外,该行的值应该和上一行一

11、致。仿真结果和预期的结果相同。第六行WB_Alu是需要回写到寄存器的结果,若指令是load指令,则结果应该是从存储器取出的值;否则其应该是ALU的运算结果。观察仿真的结果,第二条指令是load指令,load的地址是7,而7号存储器被初始化为了7,对应的时间是1200ns-1400ns。对于其他指令,WB_Alu的值应该和上一行相同。仿真的结果与预期一致,证明指令成功执行。十、实验结论:代码成功实现了一个流水线CPU。十一、总结及心得体会:通过这次实验,我对Verilog编程有了更深入的实践和了解,也更加熟悉流水线CPU的内部结构与组成,也激发了我对计算机系统结构这门课的强烈兴趣。十二、对本实验

12、过程及方法、手段的改进建议:可以根据流水线CPU的特点和结构,自己尝试编写更多的指令,使指令系统更丰富。 报告评分: 指导教师签字:电 子 科 技 大 学实 验 报 告学生姓名:Wolf Alice 学号:16 指导教师:米源实验地点:主楼A2-412 实验时间: 2019.6.7 一、实验室名称:主楼A2-412二、实验项目名称:数据冒险问题三、实验学时:4四、实验原理:(一)数据冒险数据冒险是指由于流水线上指令重叠执行,改变了原来串行执行的读/写操作数顺序,使得后面依赖前面指令结果的指令得不到准备好的数据。例如下面的指令序列:I1: add r1,r2,r3I2: sub r4,r1,r5

13、I3: and r6,r7,r1I4: or r8,r1,r9I5: addi r10,r1,100画出这些指令的执行时空图,结果如下:可以看到,第一条指令对r1的值进行了修改,而I2,I3,I4读取的值是没有修改的r1,即第一条指令还没有来得及回写数据,使得后续指令出错。(二)数据冒险的解决方法1. 提前回写让写寄存器堆的操作提前半个周期,即由时钟的下降沿打入;读在后半周期。设一个时钟周期是10ns,寄存器堆的访问只需要5ns。这样,在上图的例子当中,I4读取的值将是I1回写之后的值,数据冲突的指令少了一条,如图所示:2.编译器插入NOP在冲突的指令之后插入nop,即空指令,等待指令回写,这

14、样将不会冲突。例如,在上面的例子当中,可以在I1之后插入两个nop,插入之后的指令如下:I1: add r1,r2,r3 nop nopI2: sub r4,r1,r5I3: and r6,r7,r1I4: or r8,r1,r9I5: addi r10,r1,100这时,I1和I2,I3不再有数据冲突了。3.硬件停顿(互锁)增加额外硬件检测出数据相关的情况,在流水线ID级观察指令的寄存器字段,检测是否有“先读后写” 冲突,如果有就暂停;没有就继续流水线操作。一条指令进入流水线ID级,检测与前面指令可能有数据相关的基本条件是:(ID_rs1 = EXE_ rd )+(ID_rs1 = MEM_

15、 rd) +(ID_rs2 = EXE_rd )+ (ID_rs2 =MEM_rd)其他检查的条件如下: EXE级和MEM级指令的WREG信号需参与检测(以区分是写目的寄存器rd,还是store指令中的rd。store使用rd,但不写rd。) ID级指令的源寄存器号rs2与立即数部分重叠,而立即数不会出现相关的,因此,指令操作码必须要参与检测(区分是寄存器操作数还是立即数)。 ID级的指令不能是转移指令,转移指令不需要判数据相关。所以,总的数据冒险判断条件如下:DEPEN=(ID_rs1= =EXE_rd)(EXE_WREG= =1)(ID_rs1IsReg)+(ID_rs1= =MEM_rd

16、)(MEM_WREG= =1)(ID_rs1IsReg)+(ID_rs2= =EXE_rd)(EXE_WREG= =1)(ID_rs2IsReg)+ (ID_rd= =EXE_rd)(EXE_WREG= =1)(store) +(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 (排除立即数运算指令)其中,ID_rs1

17、IsReg条件是为了排除转移指令。为了缩写前面的式子,总的数据相关DEPEN由A_DEPEN 和 B_DEPEN两部分组成: A_DEPEN指ID级指令的rs1与前面指令rd数据相关; B_DEPEN指ID级指令的rs2与前面指令rd 数据相关。这样可以得到新的表达式:DEPENA_DEPEN + B_DEPENA_DEPENEXE_A_DEPEN + MEM_A_DEPENB_DEPENEXE_B_DEPEN + MEM_B_DEPENEXE_A_DEPEN=(ID_rs1= =EXE_rd)(EXE_WREG= =1)(ID_rs1IsReg)MEM_A_DEPEN=(ID_rs1= =M

18、EM_rd)(MEM_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_B_DEPEN=(ID_rs2= =MEM_rd)(MEM_WREG= =1)(ID_rs2IsReg) +(1D_rd= =MEM_rd)(MEM_WREG= =1)(store)ID_rs1IsReg=and+andi+or+ori+add+addi+sub+subi+load+storeID_rs2IsReg=and+or+ad

19、d+sub当检查到数据冒险时,可以插入stall到流水线来解决。实际操作可以让有相关的指令通过流水线,但是不允许任何结果写入机器状态的位(寄存器、存储器、Z),并禁止相关指令其后的指令进入流水线。具体而言,有以下三点:禁止新PC值打入PC; 禁止新指令打入IR;封锁当前正在译码的指令的写控制信号。加入停顿之后,指令序列的时空图如下:可以看到,此时已经消除了数据冒险。4.Forwarding 通路一条指令执行时要用到上面指令的计算结果,但这个结果尚未被写入寄存器堆。而实质上,此时结果已经由ALU计算出来了,在流水线寄存器R和C中。数据前推是指,在ALU的两个数据输入端各加一个多路选择器,使R和C

20、中的数据能被直接送到ALU的输入端。加入数据前推的CPU结构如下:之后,只要得到两个选择信号ADEPEN和BDEPEN的表达式就可以了。这一部分上面已经叙述过。5.处理load指令暂停与内部前推相结合load指令在EXE级结束后,还在忙着访问存储器。在MEM级结束后,结果才出现在流水线寄存器D中。这时,即使使用内部前推技术也无法消除load指令与它的下一条相关指令之间的第一个“气泡”。如下图,I2指令和I1指令仍然冲突。解决load相关的方法有2个:1.由编译器处理。当一条指令与它上面的load指令数据相关时,在它们中间插入两条nop指令,然后优化,用两条不相关的指令替换两条nop指令。替换一

21、条是一条,替换不掉就保留nop指令。2.由硬件负责检测与load指令的相关性。采用暂停流水线一个周期的方法消除第一个“气泡”。第二个“气泡”用内部前推技术加以消除。采用这一方法之后的指令序列如下:采用这种方法,需要产生冲突信号load_depen并将其送到IF和ID级,使流水线暂停一个周期。实际编写代码时,我将load指令运行两次,这样有效的使得流水线得到了暂停的效果,并且实现简单。五、实验内容:1. 给出为解决数据冒险问题所添加或修改的代码部分,说明其逻辑原理;2. 给出用于测试的指令序列,该序列的仿真结果,对仿真结果进行分析说明。六、实验目的:通过本次实验,更好地理解和掌握解决数据冒险的原

22、理,增强编写Verilog程序的能力。七、实验器材(设备、元器件)PC机实验环境:Windows 8.1八、实验步骤:1. 编写解决数据冒险问题所添加或修改的代码;2. 编写测试的指令序列并仿真。九、实验数据及结果分析:1. 给出为解决数据冒险问题所添加或修改的代码部分,说明其逻辑原理;(1) CPU对于CPU整体,应该增加一些信号,如a_depen来判断ALU a端是否数据冲突,b_depen来判断ALU b端是否数据冲突,load_depen判断当前load指令是否冲突,因为在ID阶段就可以得到这些信号,所以首先修改CPU整体,增加、修改这些代码:(2) PCR当load指令冲突时应暂停流水线,即PC不变,这部分修改的代码如下:(3) ID/EXE寄存器寄存器应该向EXE级传递算好的adepen和bdepen信号,修改如下:(4) ID级 ID级应该增加信号,修改一些模块的参数,修改如下:(5) 控制部件 控制部件是产生adepen,bdepen,load_depen的部件,需要详细计算它们,计算时按照ppt上的表格进行计算写入代码,修改如下:(6) EXE级 EXE级应该修改2路选择器为4路选择器,并修改选择信号,修改如下:修改之后的CPU结构图如下:2. 给出用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论