32位MIPS流水线CPU设计
一、 实验信息
略
二、 实验内容
(一) 设计原理及实验方案
1.总体设计思路:
通过将单周期处理器分解长成5个流水线阶段来构成流水线处理器。在每阶段流水线中同时执行5条指令。这五个流水线阶段分别为:取指令、译码、执行、存储器和写回。译码阶段,处理器从寄存器文件中读取源操作数并对指令译码以便产生控制信号。执行阶段,处理器使用ALU执行计算。在存储器阶段,处理器读或写数据存储器。写回阶段,如果需要,处理器将结果写回到寄存器文件。
流水线处理器提升了执行指令的效率,但是需要解决一个核心问题——冲突。
冲突指结构冒险、数据冒险等,前者指两个指令需要共用一个逻辑部件,后者指后一条指令需要使用的数据在需要使用时还没有被前面的指令计算出来或者存储。
结构冒险可以通过规范流水线指令格式和增多逻辑元件等方法解决。本实验中主要考虑数据冒险,设计中可以运用重定向、阻塞、刷新等方法化解冲突。这使数据路径中alu的srca,srcb的来源增多(转发、重定向),一个指令的执行阶段,数据可以来自于本次读取的数据,可以来自上一指令的alu计算结果或者上上条指令的结果。
同时需要使用寄存器存储alu的计算结果、从存储器中读数的结果和一些控制信号。如解决写后读的冲突,让寄存器写口保持在前半周期,寄存器读口保持在后半周期,即clk下降沿时写数据。另外需要考虑的一个冲突是beq指令的控制冲突(分支指令冲突),在取下一条指令时分支是否发生尚未确定(alu计算结果和判断是否为0的工作还没做),所以流水线处理器不知道取哪条指令。本次设计中增加了一个模块计算equalD表示两个操作数是否相等,如值为1表示符合beq的跳转条件。该比较器模块放到译码阶段,这样从寄存器文件中读操作数并比较,可以在译码阶段结束时确定下一个PC。
2.基础指令部分原理图:
3.扩展指令后controls赋值的真值表:(与单周期几乎相同)
4.扩展指令时的修改
增加了增加bnebranch和immselect,为此修改了mips文件中controller和datapath的output和input端口,并且在datapath中用bnebranch对pcen的值进行更新,另增加零扩展模块和选择不同signimmE和zeroimmE立即数扩展结果的mux2模块以及zeroimmD的寄存器。
5.IO部分与单周期CPU完全相同
略
(二)实验结果及分析
1. 关键代码分析
(1) 扩展代码后maindec(此处与单周期几乎相同)
(2) regfile模块,与单周期不同的是在时钟下降沿写数
(3) datapath中增加解决冲突的部分
hazard模块中运用阻塞(stall)和重定向解决冲突
(4) datapath中其他部分代码
beq控制冲突比较器
一系列寄存器,每一个阶段都储存计算结果方便下一个个阶段的使用。如从srcbD->srcbE->srcb2E->srcb3E,最后进行alu计算。Srca,srcb的选择信号forward来自于hazard模块的output
(5)增加io设计后的top部分
与单周期相同,增加DataMemoryDecoder模块,dmem在该模块下
(6)其他部分
如aludec等虽然在指令扩展前后代码发生变化,但是与单周期、多周期CPU几乎无差别,所以不再做分析。
2. 仿真结果
1) 基础部分
2) 扩展指令后
扩展andi,ori,bne指令后,进行仿真验证3个指令的功能,由仿真结果可知,三个指令的功能正常。
3) 增加IO设计后
仿真时钟自定为100MHZ,每隔约1.3ms选择数码管的信号count一次。仿真开始时,设置了10ns的清零操作和输出操作此后输入信号与输出信号一直保持为1,switch信号设置为4’h1234,可通过AN和A2G信号的仿真波形看出,各个数码管依次显示1234=046。仿真成功。
3. 实验开发板(实现12+34=46)
1.vivado界面
2.开发板
(三) 实验感想
完成流水线CPU的过程中,明显感觉到因为需要解决冲突而带来的代码内容改变,如更改寄存器群写入条件为clk下降沿解决RAW冲突、在译码阶段增加比较器解决分支类指令控制冲突、阻塞,重定向等方法解决其他数据冲突。此外,datapath中还增加了hazard模块和很多临时寄存器,随着指令执行阶段的变化储存结果并输出结果。代码方面,与单周期CPU的主要区别在于datapath方面,与多周期CPU则控制系统和数据路径都不同。
性能方面,相较于单周期和多周期,流水线CPU有更高的性能,理想时达到CPI=1,即每个时钟周期都执行1条指令。流水线和多周期相比于单周期均增加了临时寄存器的数量,多周期是因为一条指令分为几个执行状态,后一状态需要前一状态的部分计算结果,流水线则是因为不同的指令同时执行,可能产生数据冒险,所以需要进行重定向等操作。
流水线是CPU系列的最后一个实验,在从单周期到多周期到流水线的过程中,经过积累经验和横向对比,我对三个类型的CPU都有了更加深刻的理解。