一.MIPS五级流水CPU设计需要完成的工作
MIPS 是80年代的一款精简指令集的五级流水CPU,本文通过实现MIPS五级流水CPU设计中部分指令实现流水CPU的设计,本设计需要在FPGA开发板上实现MIPS流水CPU。需要完成以下工作:
1.理解由IF、ID、EX、MEM、WB构成的MIPS五段流水线架构;
2.构架MIPS五段流水线的数据通路,并确定控制部件控制信号逻辑;
3.确定流水线中数据冲突和控制冲突的解决策略;
4.采用VerilogHDL编码,设计实现MIPS流水线CPU;
5.扩展GPIO,可以实现与开关、数码管、LED灯等基本输入输出设备的连接;
6.集成各子模块,完成顶层模块设计。实现电路的功能仿真并下板,完成电路物理功能验证。
五级流水CPU框架设计图
二.设计流程及其需要解决的问题
1.设计实现MIPS流水CPU整体框架:
将MIPS流水CPU整体的处理过程分为取指令阶段(IF)、指令译码阶段(ID)、指令执行阶段(EX)、存储器访问阶段(MEM)和寄存器回写阶段(WB)五级处理过程,并确定各控制部件的控制信号逻辑。做好调试工作,检验各部件功能是否能正常运行,总结解决问题的经验。
2.实现的指令系统包括21条MIPS整数指令:
R型指令 9 条:add、sub、and、or、xor、sll、srl、sra、jr。
I型指令10条:nop、addi、andi、ori、xori、lw、sw、beq、bne、lui。
J型指令 2 条:j、jal。
3.重点解决流水线中数据相关,控制相关问题。
流水线中经常有一些被称为“相关”的情况发生,它使得指令序列中下一条指令无法按照设计的时钟周期执行,这些“相关”会降低流水线的性能,流水线中的相关分为三类:结构相关、数据相关、控制相关。
(1)数据相关
a.数据相关:
指的是在流水线中执行的几条指令中,一条指令依赖于前面指令的执行结果,若上一条指令的执行结果未正确到达数据存储器RAM或者写回到数据寄存器,就会出现数据冲突,即脏数据,影响整体功能的实现。
b.解决的问题:
RAW,即写后读,假设指令j是在指令i后面执行的指令,RAW表示指令i将数据写入寄存器后,指令j才能从这个寄存器中读取数据。如果指令j在指令i写入寄存器前尝试读出该寄存器的内容,将得不到正确的数据。
由于WAR(读后写)以及WAW(写后写)在本次设计的过程中并不涉及,所以不多赘述。
c.解决方法:
RAW有三种情况:
相邻指令间存在数据相关,即流水线译码、执行阶段存在数据相关;相隔一条指令的指令间存在数据相关,即流水线译码、访存阶段存在数据相关;相隔两条指令的指令间存在数据相关,即流水线译码、回写阶段存在数据相关。
方案:
数据前推,将计算结果从其产生处直接送到其他指令需要处或所有需要的功能单元处,增加数据反馈回路,避免流水线暂停。
(2)load相关
a.load相关:
加载存储指令在实现过程中涉及load相关。load相关指的是,加载指令的下一条指令所要读取的寄存器与load指令访存之后要写回的寄存器相同,从而产生相关。加载存储的两条指令中,只有LW指令存在load相关。
b.解决的问题:
在MIPS五级流水线CPU的设计,load相关产生的原因为当LW指令在执行阶段时,LW相邻的下一条指令已经进入流水CPU的译码阶段且LW指令的下一条指令所要读取的寄存器与LW指令访存之后要写回的寄存器相同,此时lW指令还未进入访存阶段,也就得不到正确的访存数据,即LW指令的下一条指令执行结果产生错误。
c.解决方法:
在MIPS五级流水线CPU的设计,load相关产生的原因为当LW指令在执行阶段时,LW相邻的下一条指令已经进入流水CPU的译码阶段且LW指令的下一条指令所要读取的寄存器与LW指令访存之后要写回的寄存器相同,此时lW指令还未进入访存阶段,也就得不到正确的访存数据,即LW指令的下一条指令执行结果产生错误。
(3)控制相关
a.控制相关:
指的是流水线中的分支指令或者其他需要改写PC的指令造成的相关。
b.解决的问题:
控制相关是指流水线中的转移指令或者其他需要改写PC的指令造成的相关,这些指令改写了PC的值,所以导致后面已经进入流水线的几条指令无效,如:如果转移指令在流水线的执行阶段进行转移条件判断,在发生转移时,会导致当前处于取指、译码阶段的指令无效,需要重新取指。
c.解决方法:
为了减少损失,规定转移指令后面的指令位置为“延迟槽”,延迟槽中的指令被称为“延迟指令”。延迟指令总是被执行,与转移发生与否没有关系,即延迟槽技术。