您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > MIPS流水线CPU
..本科实验报告课程名称:计算机组成与设计实验姓名:学院:信息与电子工程学院专业:电子科学与技术学号:314010指导教师:屈民军、唐奕2016年1月7日2一、实验目的1.了解提高CPU性能的方法。2.掌握流水线MIPS微处理器的工作原理。3.理解数据冒险、控制冒险的概念以及流水线冲突的解决方法。4.掌握流水线MIPS微处理器的测试方法。二、实验任务设计一个32位流水线MIPS微处理器,具体要求如下:1.至少运行下列MIPS32指令。(1)算术运算指令:ADD、ADDU、SUB、SUBU、ADDI、ADDIU。(2)逻辑运算指令:AND、OR、NOR、XOR、ANDI、ORI、XORI、SLT、SLTU、SLTI、SLTIU。(3)移位指令:SLL、SLLV、SRL、SRLV、SRA。(4)条件分支指令:BEQ、BNE、BGEZ、BGTZ、BLEZ、BLTZ。(5)无条件跳转指令:J、JR。(6)数据传送指令:LW、SW。(7)空指令:NOP。2.采用5级流水线技术,对数据冒险实现转发或阻塞功能。3.在XUPVirtex-ⅡPro开发系统中实现MIPS微处理器,要求CPU的运行速度大于25MHz。三、实验原理1.总体设计流水线是数字系统中一种提高系统稳定性和工作速度的方法,广泛应用于高档CPU的架构中。根据MIPS处理器的特点,将整体的处理过程分为取指令(IF)、指令译码(ID)、执行(EX)、存储器访问(MEM)和寄存器会写(WB)五级,对应多周期的五个处理阶段。一个指令的执行需要5个时钟周期,每个时钟周期的上升沿来临时,此指令所代表的一系列数据和控制信息将转移到下一级处理。由于在流水线中,数据和控制信息将在时钟周期的上升沿转移到下一级,所以规定流水线转移变量命名遵守如下格式:名称_流水线级名称例如:在ID级指令译码电路(Decode)产生的寄存器写允许信号RegWrite在ID级、EX级、MEM级和WB级上的命名分别为RegWrite_id、RegWrite_ex、RegWrite_mem和RegWrite_wb。在顶层文件中,类似的变量名称有近百个,这样的命名方式起到了很好的识别作用。1)流水线中的控制信号(1)IF级:取指令级。从ROM中读取指令,并在下一个时钟沿到来时把指令送到ID级的指令缓冲器中。该级控制信号决定下一个指令指针的PCSource信号、阻塞流水线的PC_IFwrite信号、清空流水线的IF_flush信号。(2)ID级:指令译码器。对IF级来的指令进行译码,并产生相应的控制信号。整个CPU的控制信号基本都是在这级上产生。该级自身不需任何控制信号。3流水线冒险检测也在该级进行,冒险检测电路需要上一条指令的MemRead,即在检测到冒险条件成立时,冒险检测电路产生stall信号清空ID/EX寄存器,插入一个流水线气泡。(3)EX级:执行级。该级进行算术或逻辑操作。此外LW、SW指令所用的RAM访问地址也是在本级上实现。控制信号有ALUCode、ALUSrcA、ALUScrB和RegDst,根据这些信号确定ALU操作、选择两个ALU操作数A、B,并确定目标寄存器。另外,数据转发也在该级完成。数据转发控制电路产生ForwardA和ForwardB两组控制信号。(4)MEM级:存储器访问级。只有在执行LW、SW指令时才对存储器进行读写,对其他指令只起到一个周期的作用。该级只需存储器写操作允许信号MemWrite。(5)WB级:写回级。该级把指令执行的结果回写到寄存器文件中。该级设置信号MemtoReg和寄存器写操作允许信号RegWrite,其中MemtoReg决定写入寄存器的数据来自于MEM级上的缓冲值或来自于MEM级上的存储器。2)数据相关与数据转发如果上一条指令的结果还没有写入到寄存器中,而下一条指令的源操作数又恰恰是此寄存器的数据,那么,它获得的将是原来的数据,而不是更新后的数据。这样的相关问题称数据相关。在设计中,采用数据转发和插入流水线气泡的方法解决此类相关问题。(1)三阶数据相关与转发转发条件为:(操作数A、B同时满足)①WB级指令是写操作,即RegWrite_wb=1;②WB级指令写回的目标寄存器不是$0,即RegWriteAddr_wb≠0;③WB级指令写回的目标寄存器与在ID级指令的源寄存器是同一寄存器,即RegWriteAddr_wb=RsAddr_id或RegWriteAddr_wb=RtAddr_id。(2)二阶数据相关与转发(MEM冒险)转发条件:①WB级指令是写操作,即RegWrite_wb=1;②WB级指令写回的目标寄存器不是$0,即RegWriteAddr_wb≠0;③WB级指令写回的目标寄存器与在EX级指令的源寄存器是同一寄存器,即RegWriteAddr_wb=RsAddr_ex或RegWriteAddr_wb=RtAddr_ex;④EX冒险不成立,即RegWriteAddr_mem≠RsAddr_ex或RegWriteAddr_mem=RtAddr_ex。(3)一阶数据相关与转发(EX冒险)转发条件ForwardA、ForwardB作为数据选择器的地址信号,转发条件不成立时,ALU操作数从ID/EX流水线寄存器中读取;转发条件成立时,ALU操作数取自数据旁路。转发条件:①MEM级指令是写操作,即RegWrite_mem=1;②MEM级指令写回的目标寄存器不是$0,即RegWriteAddr_mem≠0;③MEM级指令写回的目标寄存器与在EX级指令的源寄存器是同一寄存器,即RegWriteAddr_mem=RsAddr_ex或RegWriteAddr_mem=RtAddr_ex。3)数据冒险与数据转发4这类冒险不同于数据相关冒险,需要单独一个“冒险检测单元(HazardDetector)”,它在ID级完成。冒险成立的条件为:①上一条指令是lw指令,即MemRead_ex=1;②在EX级的lw指令与在ID级的指令读写的是同一个寄存器,即RegWriteAddr_ex=RsAddr_id或RegWriteAddr_ex=RtAddr_id。冒险的解决:为解决数据冒险,我们引入流水线阻塞。当HazardDetector检测到冒险条件成立时,在lw指令和下一条指令之间插入阻塞,即流水线气泡(bubble),使后一条指令延迟一个时钟周期执行,这样就将该冒险转化为二阶数据相关,可用转发解决。如图所示流水线气泡的引入需要注意的是,如果处于ID级的指令被阻塞,那么处于IF级的指令也必须阻塞,否则,处于ID级的指令就会丢失。防止这两条指令继续执行的方法是:保持PC寄存器和IF/ID流水线寄存器不变,同时插入一个流水线气泡。具体实现方法如下:在ID级检测到冒险条件时,HazardDetector输出两个信号:Stall与PC_IFWrite。Stall信号将ID/EX流水线寄存器中的EX、MEM和WB级控制信号全部清零。这些信号传递到流水线后面的各级,由于控制信号均为零,所以不会对任何寄存器和存储器进行写操作,高电平有效。PC_IFWrite信号禁止PC寄存器和IF/ID流水线寄存器接收新数据,低电平有效。2.3)分支冒险还有一类冒险是包含分支的流水线冒险流水线每个时钟周期都得取指令才能维持运行,但分支指令必须等到MEM级才能确定是否执行分支。这种为了确定预取正确的指令而导致的延迟叫做控制冒险或分支冒险。5一种比较普遍的提高分支阻塞速度的方法是假设分支不发生,并继续执行顺序的指令流。如果分支发生的话,就丢弃已经预取并译码的指令,指令的执行沿着分支目标继续。由于分支指令直到MEM级才能确定下一条指令的PC,这就意味着为了丢弃指令必须将流水线中的IF、ID和EX级的指令都清除掉(flush)。这种优化方法的代价较大,效率较低。如果我们能在流水线中提前分支指令的执行过程,那么就能减少需要清除的指令数。这是一种提高分支效率的方法,降低了执行分支的代价。因此我们采用提前分支指令的方法解决分支冒险。提前分支指令需要提前完成两个操作:①计算分支的目的地址:②判断分支指令的跳转条件:在提前完成以上两个操作之外,我们还需丢弃IF级的指令。具体做法是:加入一个控制信号IF_flush,做为IF/ID流水线寄存器的清零信号。当分支冒险成立,即Z=1,则IF_flush=1,否则IF_flush=0,故IF_flush=Z。考虑到本系统还要实现的无条件跳转指令:J和JR,在执行这两个指令时也必须要对IF/ID流水线寄存器进行清空,因此,IF_flush的表达式应表示为:IF_flush=Z||J||JR。2.MIPS指令格式1)R型指令格式本实验要实现的R型指令有:①算术逻辑运算指令:ADD、ADDU、SUB、SUBU、AND、OR、NOR、XOR、SLT、SLTU②移位指令:SLLV、SRLV、SRAV、SLL、SRL、SRA③寄存器跳转指令:JR2)I型指令格式本实验要实现的I型指令有:①存储器访问指令:LW、SW②立即数算术逻辑运算指令:ADDI、ADDIU、ANDI、ORI、XORI、SLTI、SLTIU③分支指令:BEQ、BNE、BGEZ、BGTZ、BLEZ、BLTZ3)J型指令格式6本实验要实现的I型指令有:无条件跳转指令:J3.ID的设计指令译码模块的主要作用是从机器码中解析出指令,并根据解析结果输出各种控制信号。ID模块主要有指令译码(Decode)、寄存器堆(Registers)、冒险监测、分支检测和加法器等组成。ID模块的接口信息如下表所示:引脚名称方向说明clkInput系统时钟Instruction_id[31:0]指令机器码NextPC_id[31:0]指令指针RegWrite_wb寄存器写允许信号,高电平有效RegWriteAddr_wb[4:0]寄存器的写地址RegWriteData_wb[31:0]写入寄存器的数据MemRead_ex冒险检测的输入RegWriteAddr_ex[4:0]MemtoReg_idOutput决定回写的数据来源(0:ALU1:存储器)RegWrite_id寄存器写允许信号,高电平有效MemWrite_id存储器写允许信号,高电平有效MemRead_id存储器读允许信号,高电平有效ALUCode_id[4:0]决定ALU采用何种运算ALUSrcA_id决定ALU的A操作数的来源(0:rs1:Sa)ALUSrcB_id决定ALU的B操作数的来源(0:rt1:Imm)RegDst_id决定Register回写是采用的地址(rt/rd)StallID/EX寄存器清空信号,高电平插入一个流水线气泡Z分支指令的条件判断结果J跳转指令JR寄存器跳转指令PC_IFWrite阻塞流水线的信号,低电平有效BranchAddr[31:0]条件分支地址JumpAddr[31:0]跳转地址Imm_id[31:0]符号扩展成32位的立即数Sa_id[31:0]0扩展成32位的移位立即数RsData_id[31:0]Rs寄存器数据RtData_id[31:0]Rt寄存器数据RdAddr_id[4:0]Rd寄存器地址RsAddr_id[4:0]Rs寄存器地址RtAddr_id[4:0]Rt寄存器地址7(1)指令译码(Decode)子模块的设计Decode控制器的主要作用是根据指令确定各个控制信号的值,是一个组合电路。我们将指令分成八类:R_type1:ADD、ADDU、SUB、SUBU、AND、OR、NOR、XOR、SLT、SLTU、SLLV、SRLV、SRAVR型指令R_type2:SLL、SRL、SRAJR_type:JRJ_type:JJ型指令I_type:ADDI、ADDIU、ANDI、ORI、XORI、SLTI、SLTIUBranch:BEQ、BNE、BGEZ、BGTZ、BLEZ、BLTZI型指令LW:LWSW:SWDecode输出的九组控制信号:①RegWrite决定是否对寄存器(Registers)进行写操作。当RegWrite高电平有效时,将数据写入指定的寄
本文标题:MIPS流水线CPU
链接地址:https://www.777doc.com/doc-4605420 .html