《数电实验2报告lab28流水线CUP.doc》由会员分享,可在线阅读,更多相关《数电实验2报告lab28流水线CUP.doc(42页珍藏版)》请在三一办公上搜索。
1、专业: 电子科学与技术 姓名: 李增一 学号: 3090101793 日期: 2012.1.1 地点:_东一B415_实验报告课程名称:_ _数字系统设计实验2_ _ _指导老师:_唐奕等_成绩:_实验名称: _流水线MIPS微处理器设计_ _实验类型:_ 设计型_ _同组学生姓名: 一、实验目的和要求(必填)二、实验内容和原理(必填)三、主要仪器设备(必填)四、操作方法和实验步骤五、实验数据记录和处理六、实验结果与分析(必填)七、讨论、心得装 订 线一、实验目的和要求1、了解提高CPU性能的方法2、掌握流水线MIPS微处理器的工作原理3、离结数据冒险,控制冒险的概念以及流水线冲突的解决办法4
2、、掌握流水线MIPS微处理器的测试方法二、实验内容和原理实验内容:设计一个32位流水线MIPS微处理器,具体要求如下:1、 至少运行下列MIPS32指令:算术运算指令(ADD、ADDU、SUB、SUBU、ADDI、ADDIU)逻辑运算指令(AND、OR、NOR、XOR、ANDI、ORI、XORI、SLT、SLTU、SLTI、SLTIU)移位指令(SLL、SLLV、SRL、SRLV、SRA)条件分支指令(BEQ、BNE、BGEZ、BGTZ、BLEZ、BLTZ)无条件跳转指令(J、JR)数据传送指令(LW、SW)空指令(NOP)2、 采用5级流水线技术,对数据冒险实现转发或阻塞功能3、 在XUP
3、Virtex-Pro开发系统中实现MIPS微处理器,要求CPU的运行速度大于25MHz。实验原理:1总体设计:IF、ID、EX、MEM、WB,对应CPU的实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793五个处理阶段。如下图:宏观来讲如下:2、流水线冒险在流水线CPU中,多条指令同时执行,由于各种各样的原因,在下一个时钟周期中下一条指令不能执行,这种情况称为冒险。冒险分为三类:实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793(1) 结构冒险:硬件不支持多条指令在同一个时钟周期内执行。MIPS指令集专为流水线设计,因此在MIP
4、S CPU中不存在此类冒险。 (2)数据冒险:在一个操作必须等待另一操作完成后才能进行时,流水线必须停顿,这种情况称为数据冒险。数据冒险又分为两类: a.数据相关:流水线内部其中任何一条指令要用到任何其它指令的计算结果时,将导致数据冒险。通常可以用数据转发(数据定向)来解决此类冒险。解决方法:(1)三阶数据相关: 这两条指令在第5时钟周期内同时读写同一个寄存器。这类数据相关称之为三阶数据相关。 假设寄存器的写操作发生在时钟周期的上升沿,而读操作发生在时钟周期的下降沿,那么读操作将读取到最新写入的内容。在这种假设条件下将不会发生数据冒险。这就要求流水线中的寄存器具有“ 先写后读(Read Aft
5、er Write)”的特性。 这类“ 写操作发生在时钟周期的上升沿,读操作发生在时钟周期的下降沿” 的寄存器虽然在理论上是可实现的,但是不适合应用于同步系统,因为它不但影响系统的运行速度,而且影响系统的稳定性,是不可取的。 因此,我们采用“ 转发” 机制来解决三阶数据相关冒险。该部分转发电路我们放在寄存器堆的设计中完成。 数字系统设计实验 转发条件: WB级的指令需要 写回寄存器,即 RegWrite_wb=1 实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793在WB级的指令在写回时 目标寄存器不能是寄存 器$0,即 RegWriteAddr_wb0在WB级的
6、指令写回时的目标寄存 器与在ID级的指令的源寄存器是 同一寄存器,即 RegWriteAddr_wb=RsAddr_id 或RegWriteAddr_wb=RtAddr_id (2)二阶数据相关(MEM冒险): sub指令在第5时钟周期写回寄存器,而or指令也在第5时钟周期对sub指令的结果提出了请求,很显然or指令读取的数据是未被更新的错误内容。这类数据相关称之为二阶数据相关。 如前所述,or指令在第5时钟周期向sub指令结果发出请求时,sub指令的结果已经产生。所以,我们同样采用“ 转发” ,即通过MEM/WB流水线寄存器,将sub指令结果“ 转发” 给or指令,而不需要先写回寄存器堆。
7、转发条件: WB级的指令需要 写回寄存器,即 RegWrite_wb=1 在WB级的指令在写回时,目标寄存器不能是寄存 器$0,即 RegWriteAddr_wb0 在WB级的指令写回时的目标寄存器 与在EX级的指令的源寄存器是同一 寄存器,即 RegWriteAddr_wb=RsAddr_ex 或RegWriteAddr_wb=RtAddr_ex实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793EX冒险不成立,即 RegWriteAddr_mem RsAddr_ex 或RegWriteAddr_mem RtAddr_ex(3)一阶数据相关(EX冒险) 在这段
8、代码中,与sub指令相关的指令有三条,我 们先来讨论sub指令和and指令之间的相关问题。 sub指令在第5时钟周期写回寄存器,而and指令在第4时钟周期就对sub指令的结果提出了请求,很显然and指令读取的数据是未被更新的错误内容。这类数据相关称之为一阶数据相关。 仔细观察sub指令,可以发现,sub指令的结果其实在EX级结尾,即第3时钟周期末就产生了。而and指令在第4时钟周期向sub指令结果发出请求。请求时间晚于结果产生时间。所以,只要sub指令结果产生之后,就可以直接将它“ 转发” 给and指令,而不需要先写回寄存器堆,再由and指令将其读取出来。 数字系统设计实验 转发条件: 1 M
9、EM级的指令需 要写回寄存器,即 RegWrite_mem=1 2 在MEM级的指令在写回时,目标寄存器不能是寄存 器$0,即 RegWriteAddr_mem03 在MEM级的指令写回时的目标寄存 器与在EX级的指令的源寄存器是同 一寄存器,即 RegWriteAddr_mem=RsAddr_ex 或 RegWriteAddr_mem=RtAddr_ex b.数据冒险:此类冒险发生在当定向的目标阶段在时序上早于定向的源阶实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793段时,数据转发无效。常是引入流水线阻塞,即气泡(bubble)来解决。 当一条指令试图读取
10、一个寄存器,而它前一条指 令是lw指令,并且该lw指令写入的是同一个寄存器时,定向转发的方法就无法解决问题。这类冒险不同于数据相关冒险,需要单独一个“冒险检测单元(Hazard Detector)”。它在ID级完成。冒险成立的条件为: 上一条指令是lw指令,即MemRead_ex =1在EX级的lw指令与在ID级的指令读写的是同一个寄存器,即 RegWriteAddr_ex = RsAddr_id 或 RegWriteAddr_ex = RtAddr_id 冒险的解决:引入流水线阻塞。 当Hazard Detecto检测到冒险条件成立时,在lw指令和下一条指令之间插入阻塞,即流水线气泡(bub
11、ble), 使后一条指令延迟一个时钟周期执行,这样就将该冒险转 化为二阶数据相关,可用转发解决。 需要注意的是,如果处于ID级的指令被阻塞,那 么处于IF级的指令也必须阻塞,否则,处于ID级的指令就会丢失。防止这两条指令继续执行的方法是: 保持PC寄存器和IF/ID流水线寄存器不变,同时插入一个流水线气泡。 数字系统设计实验 保持PC寄存器和IF/ID流水线寄存器不变: 在ID级检测到冒险条件时, Hazard Detector输出一 个信号:PC_IFWrite,作为使能信号同时送给PC寄存器 和IF/ID流水线寄存器。冒险成立时,该信号为低电平, 禁止PC寄存器和IF/ID流水线寄存器接收
12、新实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793数据。 流水线气泡的插入: 在ID级检测到冒险条件时,Hazard Detector输出一个信号: stall,将ID/EX流水线 寄存器中的EX、MEM和WB级控制信号全部 清零。这些信号传递 到流水线后面的各 级,由于控制信号均 为零,所以不会对任 何寄存器和存储器进行写操作。(3)控制冒险:CPU需要根据分支指令的结果做出决策,而此时其它指令可能还在执行中,这时会出现控制冒险,也称分支冒险。解决此类冒险的常用方法为延迟分支。 流水线每个时钟周期都得取指令才能维持运行,但分支指令必须等到MEM级才能确定是
13、否执行分支。这种为了确定预取正确的指令而导致的延迟叫做控制冒险或分支冒险。 分支冒险的解决方法:提前分支指令一种比较普遍的提高分支阻塞速度的方法是假设分支不发生,并继续执行顺序的指令流。如果分支发生的话,就丢弃已经预取并译码的指令,指令的执行沿着分支目标继续。由于分支指令直到MEM级才能确定下一条指令的PC,这就意味着为了丢弃指令必须将流水线中的IF、ID和EX级的指令都清除掉(flush)。这种优化方法的代价较大,效率较低。 假如我们能在流水线中提前分支指令的执行过程,那么就能减少需要清除的指令数。这是一种提高分支效率的方法,降低了执行分支的代价。 提前分支指令需要提前完成两个操作: 实验名
14、称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 30901017931、算分支的目的地址 2、判断分支指令的跳转条件。提前计算分支的目的地址:由于已经有了PC值和IF/ID流水线寄存器中的指令值,所以可以很方便地将EX级的分支地址计算电路移到ID级。我们针对所有指令都执行分支地址的计算过程,但只有在需要它的时候才会用到。 提前判断分支指令的跳转条件:我们将用于判断分支指令成立的Zero信号检测电路(Z test )从ALU中独立出来,并将它从EX级提前至ID级。具体的设计将在ID级设计中介绍。 在提前完成以上两个操作之外,我们还需丢弃IF级的指令。具体做法是:加入一个控制信号IF_f
15、lush,做为IF/ID流水线寄存器的清零信号。当分支冒险成立,即Z=1,则IF_flush=1,否则IF_flush=0,故IF_flush = Z。 考虑到本系统还要实现的无条件跳转指令:J和JR,在执行这两个指令时也必须要对IF/ID流水线寄存器进行清空,因此, IF_flush的表达式应表示为: IF_flush = Z | J | JR由此可得,无冒险的流水线MIPS原理框图如下:实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793三、主要仪器设备装有Modelsim6.0与ISE软件的电脑四、实验过程和数据记录因为最开始做的就是ALU的设计故先从AL
16、U开始EX:ALU子模块的设计:ALU具体执行何种运算,由控制单元中的ALU控制器输出的ALUCode信号决定。ALU的功能表见下: 实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793加法器完成的功能,增加一个Binvert即可: sum=A+BBinvert+Binvert 当Binvert=0时,sum=A+B0+0=A+B即完成加法运算。 当Binvert=1时,sum=A+B1+1=A-B即完成减法运算。32位加法器代码如下:实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793其中adder4bit_conditiona
17、l加法器代码如下:比较电路中要注意有符号数和无符号数比较运算的区别 在有符号数比较SLT运算中,判断AB的方法有: 对有符号数A、B,满足下列两种情况之一即可判断AB: A为负数、B为0或正数:A31&(B31) A、B符号相同,A-B为负:(A31B31) & sum31 因此,SLTResult=(A31&(B31) |( (A31B31) & sum31) 在无符号比较运算中,同理可得: 实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793SLTResult=(A31)&B31) |( (A31B31) & sum31);ALU模块代码如下:实验名称: 流
18、水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793调用case语句来选择Result的输出实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793ALU仿真如下:将所得仿真波形与书本上要求对比,仿真正确。2、数据前推电路的设计 操作数A和B由数据选择器决定,数据选择器的地址信号即为ForwardA和ForwardB。数据选择器地址信号ForwardA、ForwardB的含义如下表所示:实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793且有综合前面给出的原理框图EX的代码如下:实验名称: 流水线MIPS微处理器设计
19、 姓名: 李增一 学号: 3090101793实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793直接用case语句来叙述选择器,以免调用MUX函数这么麻烦实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793IF: 1.指令存储器ROM 用Xilinx CORE Generator实现产生的ROM无法满足流水线CPU的指令要求,我们需用Verilog HDL 设计一个ROM阵列。考虑到FPGA的资源,指令存储器可设计为容量各为2632bit的ROM。老师已经提供了该ROM的代码,文件名为InstructionROM.v。2.指令指
20、针选择器 该8选1数据选择器的选择信号PCSource=JR,J,Z。实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 30901017933、PC寄存器 当发生数据冒险时,需要保持PC寄存器不变,因此PC寄存器是一个带使能端的D型寄存器,使能信号为PC_IFWrite。IF的代码如下:实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793IF的仿真波形如下:实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793通过分析上面的前中后三段仿真波形,与实验要求完全符合。前几个周期,此时Z=J=JR=0,经过一个reset后
21、PC被赋予了00000000的初值,因为跳转分支指令都等于0,所以下一条指令地址总是等于上一条指令+4,波形正确。中间几个波形 Z,J,JR=001时 PC=JrAddr 而不是上一周期的NextPC_if Z,J,JR=010时 PC=JumpAddr 而不是上一周期的NextPC_if Z,J,JR=100时 PC=BranchAddr 而不是上一周期的NextPC_if 说明 跳转和分支指令起了作用,且PC地址符合设计要求。末尾几个周期 此时PC_IFWite=0,则寄存器使能端为0,PC值保持不变,由图形可知几个信号都保持不变,说明PC_IFWite是起作用ID:1.Decode模块设
22、计 控制单元的主要任务是,根据指令存储器读出的指令,确定各个控制信号的值。它是一个组 合电路。实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 30901017939组控制信号: 1.RegWrite 决定是否对寄存器(registers)进行写操作。 RegWrite有效时,将数据写入指定的寄存器中。 需要写回寄存器的指令类型有:LW、R_type1、 R_type2和I_type,所以:RegWrite_id= LW | R_type1 | R_type2 | I_type 2、RegDst 决定目标寄存器是rt还是rd。 RegDst=0时,rt为目标寄存器。 RegDst
23、=1时,rd为目标寄存器。需要写回寄存器的指令类型有:LW、R_type1、R_type2和I_type。其中, R_type1和R_type2的目标寄存器是rd,而LW和I_type的目标寄存实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793器是rt。所以:RegDst_id= R_type1 | R_type2 3、MemWrite 决定是否对数据存储器进行写操作。 MemWrite有效时,将数据写入数据存储器指定的位置。 需要对写存储器的指令只有SW,所以:MemWrite_id= SW 4、MemRead 决定是否对数据存储器进行读操作。 MemRea
24、d有效时,读取数据存储器指定位置的数据。 需要对读存储器的指令只有LW,所以:MemRead_id= LW 5、MemtoReg 决定写入寄存器(registers)的数据来自ALU还是数据存储器。 MemtoReg=0时,数据来自ALU。 MemtoReg=1时,数据来自数据存储器。 需要写回寄存器的指令类型有:LW、R_type1、R_type2和I_type,其中,只有LW写回寄存器的数据取自存储器,所以:MemtoReg_id= LW6、ALUSrcA 决定ALU第一操作数来源。 ALUSrcA=0时,ALU第一操作数A。.ALUSrcA=1时,ALU第一操作数来源于0扩展的5位sa。
25、 J_tpye、JR_tpye及Branch类型指令没有使用ALU。使用ALU的指令类型中LW、SW、R_type1和I_type均采用的rs作为ALU第一操作数,只有实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793R_type2的第一操作数采用的是0扩展的sa段,所以: ALUSrcA_id= R_type2 7、ALUSrcB 决定ALU第二操作数来源。 ALUSrcB=0时, ALU第二操作数B。 ALUSrcB=1时, ALU第二操作数来源于符号扩展的16位Imm。 J_tpye、JR_tpye及Branch类型指令没有使用ALU。 使用ALU的指令
26、类型中R_type1和R_type2 采用rt作为ALU第二操作数,而LW、SW、I_type的第二操作数采用的是符号扩展的立即数Imm段,所以:ALUSrcB_id= LW | SW | I_type即IR15:0,用于I型指令。以上7组控制信号均为1位信号,而以下2组信号为多位信号。 8、PCSource(3位信号) 决定写入PC寄存器的来源。 PCSource由JR_tpye 、J_tpye及Z决定:即: PCSource=JR, J, Z 在IF级已经对PCsource的作用经过介绍。 9、ALUCode(5位信号) 决定ALU的操作。 由指令中的op段、rt段及funct段决定。AL
27、UCode的设计参照书本的功能表。decode的verilog的代码如下:定义输入输出实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793定义各线以运算代码实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793ALUCode定义各个运算5位2进制码直接用case语句选择出各个代码所对应的操作实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101
28、7932. Zero 检测电路的设计3、寄存器堆的设计 流水线型CPU中的寄存器堆要求具有“先写后读(Read After Write)”实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793特性. 老师已经给出寄存器堆的大部分程序, RsSel=RegWrite_wb&(RegWriteAddr_wb=0)&(RegWriteAddr_wb=RsAddr_id); RtSel=RegWrite_wb&(RegWriteAddr_wb=0)&(RegWriteAddr_wb=RtAddr_id);4、冒险检测电路的设计 冒险成立的条件为: 上一条指令是lw指令,即
29、MemRead_ex =1 在EX级的lw指令与在ID级的指令读写的是同一个寄存器,即 RegWriteAddr_ex = RsAddr_id或RegWriteAddr_ex = RtAddr_id 解决冒险的方法为: 插入一个流水线气泡: stall = MemRead_ex &( (RegWriteAddr_ex = RsAddr_id)|(RegWriteAddr_ex = RtAddr_id) 保持PC寄存器和IF/ID流水线寄存器不变:PC_IFWrite = stall5、其它单元电路的设计 1、Branch指令分支地址的计算电路: BranchAddr= NextPC_id+(s
30、ign-extend(Imm_id)2) 2、JR指令跳转地址的计算电路: JRAddr = RsData_id 3、J指令跳转地址的计算电路: 实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793JAddr = NextPC_id31:28,IR_id25:0,2b00结合原理框图,得到ID级代码如下:定义输入输出实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793Zero检测实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793RsSel与RtSel信号直接用case写出了选择器对RtData R
31、sDatad的选择MultiRegisters代码:DataRam:数据存储器利用Xilinx Core Generator实现。考虑到FPGA的资源,数据存储器可设计为 容量各为2632bit单端口RAM。流水线寄存器:流水线寄存器负责将流水线的各部分分开,共有IF/ID、ID/EX、EX/MEM、MEM/WB四组。 根据前面的介绍可知,四组流水线寄存器要求不完全相 同,因此设计也有不同考虑。实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 30901017931、EX/MEM、MEM/WB两组流水线寄存器只是普通D型寄存器。 2、当流水线发生数据冒险时,需清空ID/EX流水线
32、寄存器而插入一个气泡,因此ID/EX流水线寄存器是一个带同步清零功能的D型寄存器,清零信号为stall。 3、当流水线发生数据冒险时,需保持IF/ID流水线寄存器不变,因此IF/ID流水线寄存器具有使能信号输入,使能信号为PC_IFWrite;当流水线发生分支冒险时,需清空IF/ID流水线寄存器,清零信号为IF_flush。因此,IF/ID流水线寄存器是一个带使能功能、同步清零功能的D型寄存器。 各类触发器的Verilog代码如下:带同步清零端的D触发器:实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793带使能端和同步清零端的D触发器实验名称: 流水线MIPS
33、微处理器设计 姓名: 李增一 学号: 3090101793顶层文件涉及代码如下:实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793顶层文件仿真波形分析:通过仿真图形中各个点与书本要求表格对比,仿真完全正确。实验名称: 流水线MIPS微处理器设计 姓名: 李增一 学号: 3090101793 五、讨论和心得在实验过程中遇到了很多的错误和问题,其中大多数都是因为粗心以及定义不规范所引起的。例如端口的定义不一,或则是端口大小写又如一般的信号没有定义位数而引起的很多小的错误都会导致试验的仿真出现各种问题。有时候因为粗心大小写没对应或者字母忘写从而导致信号的不对应会让仿真图像出现蓝线。这时候应该分析蓝线的来由然后根据逆向思维一步步的推回去找出错误。这往往会十分困难。该实验培养了我们思维的逻辑性以及让我们从根本上了解了CPU的运行原理。对我们的数电研究与理解有十分重要的意义。