的指令被阻塞那么处于IF级的指令也必须阻塞否则处于ID级的指令就会丢失。防止这两条指令继续执行的方法是保持PC寄存器和IFID流水线寄存器不变同时插入一个流水线气泡。
具体实现方法如下
在ID级检测到冒险条件时HazardDetector输出两个信号Stall与PC_IFWrite。
Stall信号将IDEX流水线寄存器中的EX、MEM和WB级控制信号全部清零。这些信号传递到流水线后面的各级由于控制信号均为零所以不会对任何寄存器和存储器进行写操作高电平有效。
PC_IFWrite信号禁止PC寄存器和IFID流水线寄存器接收新数据低电平有效。
23分支冒险
还有一类冒险是包含分支的流水线冒险
流水线每个时钟周期都得取指令才能维持运行但分支指令必须等到MEM级才能确定是否执行分支。这种为了确定预取正确的指令而导致的延迟叫做控制冒险或分支冒险。
f一种比较普遍的提高分支阻塞速度的方法是假设分支不发生并继续执行顺序的指令流。如果分支发生的话就丢弃已经预取并译码的指令指令的执行沿着分支目标继续。由于分支指令直到MEM级才能确定下一条指令的PC这就意味着为了丢弃指令必须将流水线中的IF、ID和EX级的指令都清除掉flush。这种优化方法的代价较大效率较低。
如果我们能在流水线中提前分支指令的执行过程那么就能减少需要清除的指令数。这是一种提高分支效率的方法降低了执行分支的代价。
因此我们采用提前分支指令的方法解决分支冒险。
提前分支指令需要提前完成两个操作
①计算分支的目的地址
②判断分支指令的跳转条件
在提前完成以上两个操作之外我们还需丢弃IF级的指令。具体做法是加入一个控制信号IF_flush做为IFID流水线寄存器的清零信号。当分支冒险成立即Z1则
IF_flush1否则IF_flush0故IF_flushZ。
考虑到本系统还要实现的无条件跳转指令J和JR在执行这两个指令时也必须要对IFID流水线寄存器进行清空因此IF_flush的表达式应表示为
IF_flushZJJR。
2MIPS指令格式
1R型指令格式
本实验要实现的R型指令有
①算术逻辑运算指令ADD、ADDU、SUB、SUBU、AND、OR、NOR、XOR、SLT、
SLTU
②移位指令SLLV、SRLV、SRAV、SLL、SRL、SRA
③寄存器跳转指令JR
2I型指令格式
本实验要实现的I型指令有
①存储器访问指令LW、SW
②立即数算术逻辑运算指令ADDI、ADDIU、ANDI、ORI、XORI、SLTI、SLTIU
③分支指令BEQ、BNE、BGEZ、BGTZ、BLEZ、BLTZ
3J型指令格式
f本实验要实现的I型指令有
无条件跳转指令J
3ID的设计
指令译码模块的主要作用是从机器码中解析出指令并根据解析结果输出各种控制信号。ID模块主要有指令译码Decode、寄存器堆Registers、冒险监测r