MIPS流水线实验指导.docx

上传人:b****2 文档编号:758096 上传时间:2023-04-30 格式:DOCX 页数:35 大小:1.58MB
下载 相关 举报
MIPS流水线实验指导.docx_第1页
第1页 / 共35页
MIPS流水线实验指导.docx_第2页
第2页 / 共35页
MIPS流水线实验指导.docx_第3页
第3页 / 共35页
MIPS流水线实验指导.docx_第4页
第4页 / 共35页
MIPS流水线实验指导.docx_第5页
第5页 / 共35页
MIPS流水线实验指导.docx_第6页
第6页 / 共35页
MIPS流水线实验指导.docx_第7页
第7页 / 共35页
MIPS流水线实验指导.docx_第8页
第8页 / 共35页
MIPS流水线实验指导.docx_第9页
第9页 / 共35页
MIPS流水线实验指导.docx_第10页
第10页 / 共35页
MIPS流水线实验指导.docx_第11页
第11页 / 共35页
MIPS流水线实验指导.docx_第12页
第12页 / 共35页
MIPS流水线实验指导.docx_第13页
第13页 / 共35页
MIPS流水线实验指导.docx_第14页
第14页 / 共35页
MIPS流水线实验指导.docx_第15页
第15页 / 共35页
MIPS流水线实验指导.docx_第16页
第16页 / 共35页
MIPS流水线实验指导.docx_第17页
第17页 / 共35页
MIPS流水线实验指导.docx_第18页
第18页 / 共35页
MIPS流水线实验指导.docx_第19页
第19页 / 共35页
MIPS流水线实验指导.docx_第20页
第20页 / 共35页
亲,该文档总共35页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

MIPS流水线实验指导.docx

《MIPS流水线实验指导.docx》由会员分享,可在线阅读,更多相关《MIPS流水线实验指导.docx(35页珍藏版)》请在冰点文库上搜索。

MIPS流水线实验指导.docx

MIPS流水线实验指导

 

 

MIPS流水线实验指导书

目录

1.Overview3

1.1实验名称3

1.2实验目的3

1.3实验范围3

1.4实验预计时间3

1.5实验报告与验收办法3

2.单周期MIPS流水线4

2.1模块描述4

2.1.1总体结构4

2.1.2主控制单元模块CTR5

2.1.3ALU控制单元模块AluCtr8

2.1.4ALU10

2.1.5寄存器regFile12

2.1.6内存单元模块MEMORY15

2.1.7带符号扩展16

2.2顶层模块top17

2.2.1模块描述17

2.3流水线仿真19

3.多周期MIPS流水线23

3.1实验描述23

3.1.1模块描述23

3.1.2新建模块源文件top25

3.1.3编写功能25

3.1.4仿真测试26

4.附录Modelsim使用说明30

1.Overview

1.1实验名称

类MIPS单周期/多周期处理器实现

1.2实验目的

1.用Verilog实现单周期的类mips处理器

2.在单周期mips处理器基础上完成多周期的类mips处理器,多周期处理器有以下功能:

1)实现多周期、单发射流水线

2)实现forwarding和相关性停顿

3)实现指令包括lw,sw,add,sub,or,and,beq(optional),j(optional)

4)可以从modelsim中看到仿真波形

1.3实验范围

本次实验将覆盖以下范围

1.Modelsim的使用

2.使用VerilogHDL进行逻辑设计(本实验默认会使用verilog)

1.4实验预计时间

1周

1.5实验报告与验收办法

提交实验报告;报告内容做成PPT进行答辩。

 

2.单周期MIPS流水线

2.1模块描述

2.1.1总体结构

简单的MIPS处理器由以下模块构成

1.主控制单元模块CTR(control)

2.ALU控制单元模块AluCtr(ALUcontrol)

3.ALU

4.寄存器regFile

5.内存单元模块MEMORY

6.带符号扩展(Signextend)

下面将介绍各个模块的实现,关于Modelsim的使用请参考附录。

2.1.2主控制单元模块CTR

2.1.2.1模块描述

主控制单元输入为指令的opCode字段,即操作码。

操作码经过主控制单元的译码,给ALUCtr,DataMemory,Registers,Muxs等部件输出正确的控制信号。

Mips基本指令格式

主控制模块

2.1.2.2新建源文件

2.1.2.3编写译码功能

主控制模块真值表

注:

j指令,Jump信号输出1,其余输出0

指令操作码

用verilog代码写出上述真值表内容。

实现方式多种多样,这里给出一种使用case语句的参考方案,如下图:

2.1.2.4仿真测试

如果逻辑比较复杂,可以对单个的模块文件进行仿真测试,若逻辑简单则可以省略,待整个project都写好后一起仿真。

1.新建test_for_Ctr.v

2.参照附录中的Modelsim使用方法,可以看到仿真结果(操作小技巧:

小键盘-,+,快速缩放波形视野)检查波形。

如果有错,检查代码逻辑,重新仿真。

 

2.1.3ALU控制单元模块AluCtr

2.1.3.1模块描述

AluCtr根据主控制器的ALUOp来判断指令类型。

根据指令的后6位区分R型指令。

综合这两种输入,控制ALU做正确的操作。

2.1.3.2新建模块源文件

2.1.3.3编写译码功能

我们约定aluCtrOut[3:

0]的值与ALU操作的对应关系如下:

AluCtrOut和alu操作的对应关系

如果根据ALUOp控制位和R型指令的不同功能码设置ALU控制位

[注:

上图中ALUcontrolinput实际上是ALU的输入,ALUCtr的输出]

输入输出真值表

用verilog代码写出上述真值表内容。

实现方式多种多样,这里给出一种使用casex语句的参考方案,如下图:

注:

{a,b}是位拼接运算符

2.1.3.4仿真

1.根据之前记叙的方法新建test_for_aluCtr.v

2.在testBench中设定不同的输入。

请覆盖所有的情况,以保证逻辑的正确。

3.用modelSim仿真,观察波形是否满足逻辑。

如果有错,检查代码,重新仿真。

2.1.4ALU

2.1.4.1实验描述

2.1.4.2模块描述

根据aluCtr,对两个输入做对应的操作。

aluRes输出结果。

如果是减法操作,若结果为0,zero输出置为1.

输入:

input1(32bit),,input2(32bit),aluCtr(4bit)

输出:

zero(1bit),aluRes(32bit)

2.1.4.3新建模块源文件

2.1.4.4实现功能

注:

beq实际是个减法操作

用verilog代码实现ALU功能。

实现方式多种多样,这里给出一种参考方案,如下图:

2.1.4.5仿真

1.根据之前记叙的方法新建test_for_alu.v

2.在testBench中设定不同的输入。

覆盖所有不同控制的情况,多选取一些输入数据,以保证逻辑的正确。

3.用modelSim仿真,观察波形是否满足逻辑。

如果有错,检查代码,重新仿真。

2.1.5寄存器regFile

2.1.5.1模块描述

寄存器是指令操作的主要对象,MIPS中一共有32个32位的寄存器。

寄存器是指令操作的主要对象,MIPS中一共有32个32位的寄存器。

寄存器模块

2.1.5.2新建模块源文件

2.1.5.3编写功能

这里需要注意的是,由于不确定WriteReg,WriteData,RegWrite信号的先后次序,我们采用时钟的下降沿作为些操作的同步信号,防止发生错误。

2.1.5.4仿真测试

运行仿真,可以看到仿真结果(操作小技巧:

小键盘-,+,快速缩放波形视野)

检查波形。

如果有错,检查代码逻辑,重新仿真。

2.1.6内存单元模块MEMORY

2.1.6.1模块描述

本模块与register类似,由于些数据也要考虑信号同步,因此也需要clock_in。

2.1.6.2新建模块源文件

2.1.6.3编写功能

 

2.1.6.4仿真测试

新建testbench,参考代码如下:

用modelSim仿真,观察波形是否满足逻辑。

如果有错,检查代码,重新仿真。

2.1.7带符号扩展

2.1.7.1模块描述

将16位有符号数扩展为32位有符号数。

补码:

(1)正数的补码:

与原码相同。

  +9的补码是00001001。

(2)负数的补码:

符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。

  求-7的补码。

  因为给定数是负数,则符号位为“1”。

  后七位:

+7的原码(0000111)→按位取反(1111000)→加1(1111001)

  所以-7的补码是11111001。

带符号扩展只需要在前面补足符号即可。

2.1.7.2实现功能

2.1.7.3仿真测试

2.2顶层模块top

2.2.1模块描述

a)定义信号线

为top模块内的每一根/组连接信号线命名,并在top模块中声明定义它们。

例如,主控制模块输出端口上的连线:

b)程序计数器PC

这是这个简陋CPU能够跑起来的关键地方。

定义一个32位reg类型PC,在时钟上升沿(下降沿已经被我们用作寄存器的写了)做PC<=PC+4。

注:

简单的讲,在组合逻辑中用阻塞赋值“=”,时序逻辑中用非阻塞赋值“<=”。

两者综合出来的电路不一样,具体区别查阅参考书。

时序逻辑和组合逻辑不要放在同一个always块中。

c)RESET

PC置0x00000000,各寄存器清零,这是reset要做的工作。

同步或异步,边沿或电平,同学们可以自由实现。

寄存器清零,所以要适当修改上次实验的registerFile模块,给模块添加reset信号。

注:

添加reset要注意,写在原来“写”的always块中。

假如新加一个always块,当个两个“写”always同时满足时,就混乱不知赋什么值了。

d)模块实例化,连接模块

实例化前两次实验中编写的模块,实例化的过程中连接模块的端口。

实例化有两种方法:

1.严格按照模块定义的端口顺序来连接,不用表明原模块定义时规定的端口名

模块模块名(连接端口1信号名,连接端口信号名2…)

2.在连接时用“.”符号,表明原模块是定义时规定的端口名

模块模块名(.端口1名(信号1),.端口2名(信号2))

推荐用第二种

以主控制模块为例,以下代码实例化一个Ctr:

mainCtr。

并连接其端口。

INST是定义好的指令存储器输出的连接信号,其他信号线我们在3.1.3中已定义。

实例化

Ctr模块定义

e)连接其他信号线

1.MUX

Mux的实现很简单,一个三目运算符

AssignOUT=SEL?

INPUT1:

INPUT2;

OUT,SEL,INPUT1,INPUT2都是预先定义的信号。

2.左移两位,用移位运算符:

左移(“<<”),右移(“>>”)

3.加法器,直接用无符号加法运算。

注:

verilog中寄存器类型被解释成无符号数,整数类型(integer)被解释成二进制补码形式的有符号数。

因此要综合成无符号算术算符需要使用寄存器类型,而要得到有符号算术算符就需要使用整数。

网线类型被解释成无符号数。

4.与门,使用位运算符&(位与)

注意&和&&的区别

2.3流水线仿真

1.编写二进制测试程序

请编写自己的测试汇编。

写0101的确很麻烦,已经帮你们写好了一个简易汇编器。

在偷懒之前还得强调一下基本知识:

指令格式:

Mips基本指令格式

汇编格式:

注意汇编中寄存器的顺序跟指令格式中的不一样

add$1,$2,$3:

$1=$2+$3

sub$1,$2,$3:

$1=$2-$3

and$1,$2,$3:

$1=$2 & $3

or$1,$2,$3:

$1=$2 | $3

slt$1,$2,$3:

if($2<$3) $1=1 else$1=0

lw $1,10($2):

$1=memory[$2+10]

sw $1,10($2):

memory[$2+10]=$1

beq $1,$2,10:

if($1==$2) goto PC+4+40

[10是PC+4后的指令间隔数,故为PC+4+40]

j 10000:

goto 10000

2.系统任务$readmemb和$readmemh,放在initial初始化块中。

Verilog中这两个系统任务用来从文件中读取数据到存储器中,使用格式如下:

$readmemx(“datafile”,memoryName);

$readmemx(“datafile”,memoryName,startAddr);

$readmemx(“datafile”,memoryName,startAddr,endAddr);

这里写了mem_data和mem_inst3两个文件,分别装入dMem和iMem

mem_data

……

mem_inst3

……

在top中添加initial块

initial

begin

$readmemh("./mem_data",dMem.mem,12'h40);

$readmemb("./mem_inst3",iMem.mem,8'h0);

End

3.其他常用系统任务

$monitor提供监控和输出参数列表中的表达式或变量值的功能。

如$monitor(“rxd=%b”,rxb);

$time返回当前仿真时刻值

如$monitor($time);

4.新建testbenchwaveform

编写clk信号和reset信号

5.Modelsim仿真

3.

多周期MIPS流水线

3.1实验描述

由于单周期流水线实验已经完成了CPU各部分的主要功能,因此只需要完成Top模块。

3.1.1模块描述

下面是流水的主要结构:

将单周期CPU进行分割,插入4级寄存器,将其分割为IF,ID,EX,M,WB五大部分:

其中Control的输出需要被保存下来,以供后续每级流水使用。

如下所示:

3.1.2新建模块源文件top

3.1.3编写功能

添加指令内存模块:

instructionMemory

编写Top模块:

注意,由于各种变量名称极为复杂,推荐在着手编码之前为自己选择一套命名规范。

另外,由于MEM级的Branch会影响PCSrc的值,从而影响下次PC,因此需要为Control加入RESET功能,将Branch置零。

3.1.4仿真测试

3.编写汇编代码,并使用我们提供的汇编器转化为二进制代码文件:

这里有两种选择,推荐使用自己编写的测试程序。

或者也可以使用下面的程序,注意,需要去除中间的DataHazard:

lw$1,40($0);1

lw$2,44($0);5

lw$3,48($0);8

add$4,$1,$2;$4=6

sub$5,$3,$1;$5=7

and$6,$2,$1;$6=1

lw$10,40($0);1

lw$10,40($0);1

lw$10,40($0);1

or$7,$3,$1;$7=9

slt$8,$3,$1;$8=0

beq$0,$0,end;toend

add$9,$7,$8;$9=9,notexecuted

end:

lw$10,40($0);1

lw$10,40($0);1

lw$10,40($0);1

lw$10,40($0);1

lw$10,40($0);1

4.将上述代码转为二进制Codes,保存为文件,文件名自定,这里假定是result.txt,

将数据

1

5

8

保存为data.txt

然后在Top中加入下面面代码:

initial

$readmemb(“result.txt”,instMem.membuf,8’h0);

$readmemb(“data.txt”,dataMem.membuf,8’ha);

end

5.新建testbench

6.运行仿真,可以看到仿真结果(操作小技巧:

小键盘-,+,快速缩放波形视野)

检查波形。

如果有错,检查代码逻辑,重新仿真。

附录Modelsim使用说明

这里将简单介绍modelSim的使用,以及如何脱离ISE进行仿真。

首先,我们打开ModelSim。

Workspace里面看到的是ModelSim中的库。

我们在File->New->Project添加一个新的工程:

输入名字,然后OK。

在出来的对话框中添加已经存在的文件,或者新建文件。

这里我们添加了之前各个模块的文件,Top文件,这里选择将文件保留在原位置:

并新建了一个test.v的测试用例。

在该例中,#50表示在上一句之后延时50个Cycles,一个Cycle的时间为`timescale1ns/1ps中的1ns。

而Always#50clk=~clk;则创建了一个周期100ns的时钟。

在Workspace的Project中,右键选择ProjectSettings:

将FileType改为Verilog。

在Workspace的Project中,右键选择AddToProject->SimulationConfiguration:

选择TipyMIPS下的test,并钩掉优化。

保存

在菜单View中,选择Wave,即可开始仿真。

当更改源代码后,只需重新编译。

然后Restart即可点击Run重新仿真。

上图中的RuntimeOptions可以更改Run一次的时间,如下:

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

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2