MIPS流水线CPUWord格式.docx

上传人:b****6 文档编号:22022851 上传时间:2023-02-02 格式:DOCX 页数:33 大小:915.76KB
下载 相关 举报
MIPS流水线CPUWord格式.docx_第1页
第1页 / 共33页
MIPS流水线CPUWord格式.docx_第2页
第2页 / 共33页
MIPS流水线CPUWord格式.docx_第3页
第3页 / 共33页
MIPS流水线CPUWord格式.docx_第4页
第4页 / 共33页
MIPS流水线CPUWord格式.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

MIPS流水线CPUWord格式.docx

《MIPS流水线CPUWord格式.docx》由会员分享,可在线阅读,更多相关《MIPS流水线CPUWord格式.docx(33页珍藏版)》请在冰豆网上搜索。

MIPS流水线CPUWord格式.docx

例如:

在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的控制信号基本都是在这级上产生。

该级自身不需任何控制信号。

流水线冒险检测也在该级进行,冒险检测电路需要上一条指令的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级指令写回的目标寄存器与在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)数据冒险与数据转发

这类冒险不同于数据相关冒险,需要单独一个“冒险检测单元(HazardDetector)”,它在ID级完成。

冒险成立的条件为:

1上一条指令是lw指令,即MemRead_ex=1;

2在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级才能确定是否执行分支。

这种为了确定预取正确的指令而导致的延迟叫做控制冒险或分支冒险。

一种比较普遍的提高分支阻塞速度的方法是假设分支不发生,并继续执行顺序的指令流。

如果分支发生的话,就丢弃已经预取并译码的指令,指令的执行沿着分支目标继续。

由于分支指令直到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

③寄存器跳转指令:

JR

2)I型指令格式

本实验要实现的I型指令有:

①存储器访问指令:

LW、SW

②立即数算术逻辑运算指令:

ADDI、ADDIU、ANDI、ORI、XORI、SLTI、SLTIU

③分支指令:

BEQ、BNE、BGEZ、BGTZ、BLEZ、BLTZ

3)J型指令格式

无条件跳转指令:

J

3.ID的设计

指令译码模块的主要作用是从机器码中解析出指令,并根据解析结果输出各种控制信号。

ID模块主要有指令译码(Decode)、寄存器堆(Registers)、冒险监测、分支检测和加法器等组成。

ID模块的接口信息如下表所示:

引脚名称

方向

说明

clk

Input

系统时钟

Instruction_id[31:

0]

指令机器码

NextPC_id[31:

指令指针

RegWrite_wb

寄存器写允许信号,高电平有效

RegWriteAddr_wb[4:

寄存器的写地址

RegWriteData_wb[31:

0]

写入寄存器的数据

MemRead_ex

冒险检测的输入

RegWriteAddr_ex[4:

MemtoReg_id

Output

决定回写的数据来源(0:

ALU1:

存储器)

RegWrite_id

MemWrite_id

存储器写允许信号,高电平有效

MemRead_id

存储器读允许信号,高电平有效

ALUCode_id[4:

决定ALU采用何种运算

ALUSrcA_id

决定ALU的A操作数的来源(0:

rs1:

Sa)

ALUSrcB_id

决定ALU的B操作数的来源(0:

rt1:

Imm)

RegDst_id

决定Register回写是采用的地址(rt/rd)

Stall

ID/EX寄存器清空信号,高电平插入一个流水线气泡

Z

分支指令的条件判断结果

跳转指令

寄存器跳转指令

PC_IFWrite

阻塞流水线的信号,低电平有效

BranchAddr[31:

条件分支地址

JumpAddr[31:

跳转地址

Imm_id[31:

符号扩展成32位的立即数

Sa_id[31:

0扩展成32位的移位立即数

RsData_id[31:

Rs寄存器数据

RtData_id[31:

Rt寄存器数据

RdAddr_id[4:

Rd寄存器地址

RsAddr_id[4:

Rs寄存器地址

RtAddr_id[4:

Rt寄存器地址

(1)指令译码(Decode)子模块的设计

Decode控制器的主要作用是根据指令确定各个控制信号的值,是一个组合电路。

我们将指令分成八类:

R_type1:

ADD、ADDU、SUB、SUBU、AND、OR、

NOR、XOR、SLT、SLTU、SLLV、SRLV、SRAVR型指令

R_type2:

SLL、SRL、SRA

JR_type:

J_type:

JJ型指令

I_type:

Branch:

BEQ、BNE、BGEZ、BGTZ、BLEZ、BLTZI型指令

LW:

LW

SW:

SW

Decode输出的九组控制信号:

1RegWrite

决定是否对寄存器(Registers)进行写操作。

当RegWrite高电平有效时,将数据写入指定的寄存器中。

需要写回寄存器的指令有:

LW、R_type1、R_type2和I_type,则

RegWrite_id=LW||R_type1||R_type2||I_type

2RegDst

决定目标寄存器是rt还是rd。

当RegDst=0时,rt为目标寄存器;

当RegDst=1时,rd为目标寄存器。

需要写回寄存器的指令类型有:

LW、R_type1、R_type2和I_type。

其中,R_type1和R_type2的目标寄存器是rd,而LW和I_type的目标寄存器是rt。

所以:

RegDst_id=R_type1||R_type2

3MemWrite

决定是否对数据存储器进行写操作。

当MemWrite有效时,将数据写入数据存储器指定的位置。

需要对写存储器的指令只有SW,所以:

MemWrite_id=SW

4MemRead

决定是否对数据存储器进行读操作。

当MemRead有效时,读取数据存储器指定位置的数据。

需要对读存储器的指令只有LW,所以:

MemRead_id=LW

5MemtoReg

决定写入寄存器(registers)的数据来自ALU还是数据存储器。

›当MemtoReg=0时,数据来自ALU;

当MemtoReg=1时,数据来自数据存储器。

其中,只有LW写回寄存器的数据取自存储器,所以:

MemtoReg_id=LW

6ALUSrcA

决定ALU第一操作数来源。

当ALUSrcA=0时,ALU第一操作数A(详见转发电路设计);

当ALUSrcA=1时,ALU第一操作数来源于0扩展的用于移位指令的5位sa。

八种指令类型中J_tpye、JR_tpye及Branch类型指令没有使用ALU;

其他使用ALU的指令类型中LW、SW、R_type1和I_type均采用的rs作为ALU第一操作数,只有R_type2的第一操作数采用的是0扩展的sa,所以:

ALUSrcA_id=R_type2

7ALUSrcB

决定ALU第二操作数来源。

当ALUSrcB=0时,ALU第二操作数B。

当ALUSrcB=1时,ALU第二操作数来源于符号扩展的16位Imm。

八种指令类型中J_tpye、JR_tpye及Branch类型指令没有使用ALU。

其他使用ALU的指令类型中R_type1和R_type2采用rt作为ALU第二操作数,而LW、SW、I_type的第二操作数采用的是符号扩展的立即数Imm段,所以:

ALUSrcB_id=LW||SW||I_type

8PCSource

决定写入PC寄存器的来源。

PCSource由JR_tpye、J_tpye及Z决定:

即:

PCSource={JR,J,Z}

›PCSource=000时,写入值为下一条指令的地址PC+4;

›PCSource=001时,写入值为Branch指令的分支地址;

›PCSource=010时,写入值为J指令的跳转地址;

›PCSource=100时,写入值为JR指令的跳转地址。

9ALUCode

决定ALU的功能,由指令中的op段、rt段和funct段决定。

功能表如下:

op

funct

rt

运算

ALUCode

BEQ_op

×

Z=(A==B)

5'

d10

BNE_op

Z=~(A==B)

d11

BGEZ_op

d1

Z=(A≥0)

d12

BGTZ_op

d0

Z=(A>

0)

d13

BLEZ_op

Z=(A≤0)

d14

BLTZ_op

Z=(A<

d15

R_type_op

ADD_funct

ADDU_funct

AND_funct

XOR_funct

异或

d2

OR_funct

d3

NOR_funct

或非

d4

SUB_funct

d5

SUBU_funct

SLT_funct

A<

B?

1:

d19

SLTU_funct

0(无符号数)

d20

SLL_funct

B<

<

A

d16

SLLV_funct

SRL_funct

B>

>

d17

SRLV_funct

SRA_funct

d18

SRAV_funct

ADDI_op

5’d0

ADDIU_op

ANDI_op

5’d6

XORI_op

5’d7

ORI_op

5’d8

SLTI_op

5’d19

SLTIU_op

5’d20

SW_op

加(计算地址)

LW_op

(2)分支检测(BranchTest)电路的设计

Zero检测电路主要用于判断Branch指令的分支条件是否成立,其中BEQ、BNE两个操作数为RsData与RtData,而BGEZ、BGTZ、BLEZ和BLTZ指令则为RsData与常数0比较,所以输出信号Z的表达式为:

RsData[31]||~(|RsData[31:

0]);

ALUCode=alu_blez

RsData[31];

ALUCode=alu_bltz

~RsData[31]&

&

(|RsData[31:

ALUCode=alu_bgtz

Z=~RsData[31];

ALUCode=alu_bgez

|(RsData[31:

0]^RtData[31:

ALUCode=alu_bne

(RsData[31:

0]~^RtData[31:

0]);

ALUCode=alu_beq

0;

ALUCode=OTHER

(3)寄存器堆(Registers)的设计(此部分已由老师给出)

寄存器堆由32个32位寄存器组成,这些寄存器通过寄存器号进行读写存取。

因为读取寄存器不会更改其内容,故只需提供寄存号即可读出该寄存器内容。

读取端口采用数据选择器即可实现读取功能。

应注意“0”号寄存器为常数0.

对于往寄存器里写数据,需要目标寄存器号(WriteRegister)、待写入数据(WriteData)、写允许信号(RegWrite)三个变量。

图3.13中5位二进制译码器完成地址译码,其输出控制目标寄存器的写使能信号EN,决定将数据WriteData写入哪个寄存器。

在流水线CPU设计中,寄存器堆设计还应解决三阶数据相关的数据转发问题。

当满足三阶数据相关条件时,寄存器具有ReadafterWrite的特性。

为实现该功能,在寄存器堆的基础上加一转发电路。

图中转发检测电路的输出表达式为

RsSel=RegWrite_wb&

(~(RegWriteAddr_wb==0))&

(RegWriteAddr_wb==RsAddr_id)

RtSel=RegWrite_wb&

(RegWriteAddr_wb==RtAddr_id)

(4)冒险检测功能(HazardDeterctor)的设计

由前面分析可知,冒险成立的条件为:

①上一条指令是LW指令,即MemRead_ex=1;

②在EX级的LW指令与在ID级的指令读写的是同一个寄存器,即RegWriteAddr_ex=RsAddr_id或RegWriteAddr_ex=RtAddr_id

解决冒险的方法为:

①插入一个流水线气泡Stall清空ID/EX寄存器并且阻塞流水线ID级、IF级流水线,有:

Stall=((RegWriteAddr_ex==RsAddr_id)||

(RegWriteAddr_ex==RtAddr_id))&

②保持PC寄存器和IF/ID流水线寄存器不变,有:

PC_IFWrite=~Stall

(5)其它单元电路的设计

①Branch指令分支地址的计算电路:

BranchAddr=NextPC_id+(sign-extend(Imm_id)<

2)

②JR指令跳转地址的计算电路:

JRAddr=RsData_id

③J指令跳转地址的计算电路:

Jaddr={NextPC_id[31:

28],IR_id[25:

0],2’b00}

④符号扩展的方法—针对有符号数

›如果最高位(即符号位)是0,则要扩展的高位用0补齐;

如果最高位是1,则用1补齐。

›例:

8位的+1,表示为二进制为00000001,扩展成16位的话,符号扩展为0000000000000001;

8位的-1,表示成二进制为11111111,扩展成16位的话,符号扩展为1111111111111111。

⑤0扩展的方法—针对无符号数

›要扩展的高位用0补齐。

16位二进制0xFFFF(无符号数65535),0扩展成32位为0x0000FFFF(无符号数65535)。

4.执行模块EX的设计

执行模块主要有ALU子模块、转发电路Forwarding以及若干数据选择器组成。

这行模块的接口信息如下表所示:

RegDst_ex

决定Register回写时采用的地址(rt/rd)

ALUCode_ex[4:

ALUSrcA_ex

决定ALU的A操作数的来源(rs/Sa)

ALUSrcB_ex

决定ALU的B操作数的来源(rt/Imm)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1