流水线仿真 实现与设计.docx
《流水线仿真 实现与设计.docx》由会员分享,可在线阅读,更多相关《流水线仿真 实现与设计.docx(39页珍藏版)》请在冰豆网上搜索。
流水线仿真实现与设计
本科学生毕业设计(论文)
流水线仿真实现与设计
GraduationDesign(Thesis)ofChongqingUniversity
DesignandImplementationof
PipelineSimulation
Undergraduate:
BaibinLi
Supervisor:
RenHuang
Major:
NetworkEngineering
CollegeofComputerScience
ChongqingUniversity
June2014
毕业论文(设计)原创性声明
本人所呈交的毕业论文(设计)是我在导师的指导下进行的研究工作及取得的研究成果。
据我所知,除文中已经注明引用的内容外,本论文(设计)不包含其他个人已经发表或撰写过的研究成果。
对本论文(设计)的研究做出重要贡献的个人和集体,均已在文中作了明确说明并表示谢意。
作者签名:
日期:
毕业论文(设计)授权使用说明
本论文(设计)作者完全了解**学院有关保留、使用毕业论文(设计)的规定,学校有权保留论文(设计)并向相关部门送交论文(设计)的电子版和纸质版。
有权将论文(设计)用于非赢利目的的少量复制并允许论文(设计)进入学校图书馆被查阅。
学校可以公布论文(设计)的全部或部分内容。
保密的论文(设计)在解密后适用本规定。
作者签名:
指导教师签名:
日期:
日期:
注意事项
1.设计(论文)的内容包括:
1)封面(按教务处制定的标准封面格式制作)
2)原创性声明
3)中文摘要(300字左右)、关键词
4)外文摘要、关键词
5)目次页(附件不统一编入)
6)论文主体部分:
引言(或绪论)、正文、结论
7)参考文献
8)致谢
9)附录(对论文支持必要时)
2.论文字数要求:
理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。
3.附件包括:
任务书、开题报告、外文译文、译文原文(复印件)。
4.文字、图表要求:
1)文字通顺,语言流畅,书写字迹工整,打印字体及大小符合要求,无错别字,不准请他人代写
2)工程设计类题目的图纸,要求部分用尺规绘制,部分用计算机绘制,所有图纸应符合国家技术标准规范。
图表整洁,布局合理,文字注释必须使用工程字书写,不准用徒手画
3)毕业论文须用A4单面打印,论文50页以上的双面打印
4)图表应绘制于无格子的页面上
5)软件工程类课题应有程序清单,并提供电子文档
5.装订顺序
1)设计(论文)
2)附件:
按照任务书、开题报告、外文译文、译文原文(复印件)次序装订
3)其它
1绪论
1.1课题研究背景
对指令流水线的研究是在于人对计算机的性能需求的日益提高。
随着这些年大型软件的不断开发,人对计算机的性能提出了越来越高的要求,这也就是为什么人对指令流水线的研究更加深入,研究只有一个目的,那就是在人日益增长的海量数据下,尽可能的去让计算机高速效率的处理数据。
这也就是为什么要研究流水线化的指令处理方式。
采用流水线技术后,并没有加速单条指令的执行,每条指令的操作步骤一个也不能少,只是多条指令的不同操作步骤同时执行,因而从总体上看加快了指令流速度,缩短了程序执行时间。
为了进一步满足普通流水线设计所不能适应的更高时钟频率的要求,高档位处理器中的流水线的深度(级数)在逐代增多。
当流水线深度在5~6级以上时,通常称为超流水线结构(SuperPipeline)。
显然,流水线级数越多,每级所花的时间越短,时钟周期就可以设计的越短,指令速度越快,指令平均执行时间也就越短。
流水线技术是通过增加计算机硬件来实现的。
它要求各功能段能互相独立地工作,这就要增加硬件,相应地也加大了控制的复杂性。
如果没有互相独立的操作部件,很可能会发生各种冲突。
例如要能预取指令,就需增加指令的硬件电路,并把取来的指令存放到指令队列缓冲器中,使微处理器能同时进行取指令和分析、执行指令的操作。
1.2国内外相关研究现状
指令流水线技术自从20世纪60年代第一次在高端的大型机中采用,第一次采用指令集静态流水线的计算机是IBM公司生产的IBM7030大型计算机(它又被称为Stretch计算机)。
在后面研制的CDC6600大型计算机也使用了指令态流水线和多功能部件技术。
到了20世纪80年代,流水线技术已经成为精简指令集处理器最为基础的技术了,到了这时流水线技术开始了发展,开始有了新型的流水线技术——超标量流水线。
超标量流水线是精简指令集系统中采用一种并行处理的技术。
它通过将流水线的每一步分别作出与之相对应的细化,增加流水线的级数,和增加指令的主频数,才指令在它的一个时钟周期内完成一个甚至可以达到两个浮点数的操作。
超标量流水线的实质就是用更多的处理空间来换取更少的处理时间,大规模的元器件使用流水线技术并且提供指令的工作主频来提高指令的处理速度。
超标量流水线技术它有3种独特的改进:
1.它的流水线条数已经不是1条,而改进成两至三条,而且超标量流水线还有十一个独立的元器件执行单元去并行地运行。
2.超标量流水线技术它采用了无序执行技术(out-of-orderprocessing)。
这就说明当某一条指令需要一个数据才能执行完成时,它将直接被分流出流水线以等待这条指令所需要的数据。
这样做的目的是,防止因为某一条指令没有执行而影响整个流水线的运行从而导致处理速度的下降。
3.它将指令的执行划分为更加细致的阶段,它已经不是采用一般流水线技术的五级流水线,而是采用更多的流水线级数,比如说十四条流水线级数,它会大大提高流水线的运行效率。
采用超标量流水线处理器的不同元器件可以集成在同一天流水线上,这就表示执行同一种功能的元器件它可以在一条流水线上,而执行另一种功能的元器件它可以在另一条流水线上。
这极大的提高了流水线的运行效率,并且现代的指令都采用了动态执行技术,它包括了分支预测,数据分析,投机执行这几项技术,现代的计算机处理器都使用的是高级指令集并行技术即每一个流水线可以启动多条指令。
1.3本文研究的主要内容
了解指令流水线的基本问题
Logisim的基本使用方法
理解指令流水线的数据冒险,学习相关性判断,和分支冒险
在Logisim上仿真和实现指令静态流水线
1.4论文结构
本文研究了基于RISC指令集下,用Logisim软件仿真与实现静态流水线的方法。
本文共有七章,文章的结构安排如下:
第1章为绪论,这一章描述了这个研究项目所处的研究背景以及其意义,并介绍了这一研究领域国内外的研究状况,接着介绍了本文的研究目的和研究内容,最后展现论文的结构安排。
第2章介绍了Logisim软件的基本用法和在设计过程时将会用到元器件主要功能。
第3章介绍了指令流水线技术的总体技术概要,以及指令流水线技术的原理,指令流水线技术的起源和商业上的运用。
第4章阐述了如何具体的设计指令流水线的每一个部件并将它连接成可以完美运行的有机整体。
第5章描述了指令是如何具体的在指令流水线中执行,以及可能会遇到的问题。
总结了本文所阐述的研究,和感谢导师的指导。
2Logisim软件
2.1Logisim的简介
每一位用户都可以通过它来学习如何创建逻辑电路,方便简单。
它是一款基于Java的应用程序,方便学生来学习设计和模仿数字逻辑电路,可谓一款不折不扣的学习教育工具,方便你来学习电路的相关工作原理等等。
Logism中的主要组成部分之一就在于设计并以图示来显示指令或其他中央处理器单位。
当然Logism中还有其他多种组合分析模型来对你进行帮助,如转换电路,表达式,布尔型和真值表等等。
同时还可以重新利用小规模的电路来作为大型电路的一部分。
Logisim的特点有:
1.它是一个开源的软件而且免费。
2.它可以用Java来编程控件来组成自己设计的逻辑电路图或者是自己设计的比较复杂的指令。
3.Logisim的操作比较方便,它可以勾画出你需要设计的器件的电路图,它有很方便的器件可以用来构成复杂的逻辑电路。
4.而且它可以用你自己写的真值表来自动生成一个逻辑电路,非常的方便。
5.它可以封装一个你自己设计好的逻辑电路图,作为一个器件去用来组成一个更为复杂的电路设计。
6.它可以分层设计电路图,第一次电路图设计好后,在设计第二次电路图让它嵌套在第一次电路图上。
7.Logisim还支持打印你自己设计出来的逻辑电路图。
2.2Logisim元器件的使用
首先在本次仿真过程中,使用Logisim中最为重要的元器件是ROM器件和RAM器件,在本次仿真过程中ROM将它作为指令存储器,将预先编译好的指令转换为16进制存储到ROM中,而RAM它也可以载人预先设计好的数据,并且还可以通过指令流水线的运行,将ALU处理过的数据和寄存器里的值存储在RAM里面。
其次仿真过程中还会用到一个基础并且重要的元器件,那就是寄存器,寄存器它是指令流水线存储单位的基础,计算机很多需要用到的数据都会存储到寄存器中。
并且在Logisim中可以使用多路选择器,数据分离器,与门,或门,反向电路,加法器,减法器,位扩展器等元器件。
2.3Logisim元器件的注意事项
在Logisim中最重要的问题就是解决寄存器和RAM中的时序问题。
因为你可能会出现一种状况,那就是逻辑设计是正确的,但是在具体的执行过程中,寄存器的值可能会在不可控的范围内变化,比如说执行一条指令并要将数据传入寄存器时,上一条指令的数据就可能同时传入即将接收数据的寄存器中,造成数据传输错误。
解决这个问题的关键就是将寄存器的触发从上升沿触发改成高电平触发,这样就可以让寄存器不会造成数据不可控的改变。
3指令流水线
3.1指令流水线技术的起源
在较早的指令处理器中,人们最先设计的单周期处理器,但是单周期处理它每条指令在一个固定长度的时钟周期内完成。
它的性能不是特别完美,所以我们拓展到了多周期处理器。
而在多周期处理器中,指令的每一步将占用一个时钟周期,一个功能单元可以在一条指令的执行过程中使用多次。
多周期处理器的这种共享可以减少所需的硬件数,并且提高一定的性能。
但是多周期处理器依然有着一些缺点,比如说不能流水化的执行指令。
由此人们研究出了指令流水线技术。
在二十世纪的60年代,IBM公司生产的IBM7030大型计算机是世界上第一台采用流水线技术的计算机。
这是因为流水线技术可以大大的提高指令的指令执行效率。
3.2指令流水线技术原理
最经典的指令五级流水线技术,这五个步骤分别为:
1.取指令阶段
执行一次存储器读操作读出的内容(指令)保存到寄存器IR(指令寄存器)中,IR的内容不是每个时钟都更新,所以IR必须加一个“写使能”控制。
在取指令阶段结束时,ALU的输出为PC+4,并送到PC的输入端,但不能在每个时钟到来时就更新PC,所以PC也要有“写使能”控制。
2.译码/读寄存器堆阶段
经过控制逻辑延迟后,控制信号更新为新值。
执行一次寄存器读操作,并同时进行译码。
期间ALU空闲,可以考虑“投机计算”分支地址。
3.ALU运算阶段
ALU运算,输出结果一定要在下个时钟到达之前稳定。
如果是分支branch指令,该阶段需决定是否将分支地址写入PC。
4.读存储器阶段
由ALU运算结果作为地址访问存储器,读出数据。
5.写结果到寄存器
把之前的运算结果或读存储器结果写到寄存器堆中。
这是指令流水线最经典的原理,它非常简洁的表现出了指令最为基本的过程。
3.4指令流水线的冒险
3.4指令流水线技术在商业上的运用
近30年来指令流水线技术在不断的发展,从最初的指令五级流水线到英特尔公司奔腾四处理器的二十级流水线。
现在商业上运用的指令流水线技术它主要是挖掘指令间潜在的并行性,这种并行性被称为指令级并行(ILP)。
有两种方法可以增加潜在的指令级并行程度。
第一种是增加流水线深度一重叠更多的指令。
第二种是复制处理器内部部件的数量,使得每一个流水级可以启动多条指令。
这个技术被称为多发射。
因特尔公司在X86系列的处理器就已经运用了指令流水线技术,并且它又在奔腾系列的处理器使用了流水化程度更高的流水线技术,比如说MMX技术,它是将整个流水线的处理过程多增加了一步,那就是指令从代码的高速缓存中预先提取出来,然后将它传送到“预处理”阶段,在“预处理”阶段它将进行指令的译码阶段。
奔腾系列的处理器它都使用了比较先进的流水线技术,它采用的是动态执行结构,这种结构就是将它本身的寄存器进行重新命名并且在遇到分支指令时使用分支预测来执行指令的结构。
它非常完美的将乱序执行还有推测执行结合了在一起。
它的执行过程是,指令都从一个有序执行的流水线进入,然后通过指令的宏指令将这些指令分解成一些简单的微操作,然后再由一个专门处理这些微操作的乱序超标量处理器内核来分别处理。
因为乱序的超标量流水线处理器里面有几个流水线,这些流水线连接了整型,跳转,浮点和内存执行单元。
所以几种不同的执行单元就可以非常好的集合在一起,同时在一条流水线里完美的进行执行。
因特尔推出的酷睿i7处理器,它的总流水线深度为14级,分支错误预测成为为17个时钟周期。
它一共有48个载入缓冲区和32个存储缓冲区,6个独立功能单元可以在同一时钟周期分别开始执行准备就绪的微操作。
在采取这些高端指令流水线技术后,i7处理器的性能有了质的提升,它的CPI达到了一个最佳预测值。
4指令静态五级流水线的总体设计
4.1指令指令集的设计
本次设计的指令原型机为32位,所以设计的指令系统也是32位的,所以本次设计的指令为:
R型指令-----取指令,指令译码,ALU运算单元,写结果到寄存器。
L型指令-----取指令,指令译码,ALU运算单元,读存储器阶段,写结果到寄存器。
S型指令------取指令,指令译码,ALU运算单元,读存储器阶段。
分支转移指令-----取指令,指令译码,ALU运算单元。
它的指令格式是参照MIPS32的指令格式,也是32位了的指令格式。
指令格式表
表4.1
Op(6)
Rs(5)
Rt(5)
Rd(5)
Shamt(5)
Funct(6)
Op(6)
Rs(5)
Rt(5)
Address(16)
第一个指令格式为R型指令格式,第二个指令格式为I型指令格式。
各个字段的意义如下所示:
op:
它是一条指令具体是哪一种类型指令的标志码,称为操作码。
rs:
在R型指令中它为源寄存器字段,而在取指令和存储指令中它作为基地址与十六位的地址字段相加得到存储地址。
rt:
在R型指令中它也为源寄存器字段,在取指令中,它是取出的数据的目的寄存器,而在存储指令中,它是要存入存储器的数据所在的寄存器。
rd:
它是R型指令的目的字段。
shamt:
位移量。
funct:
它被称为功能字段,这个字段主要是通过和ALUOp控制位组合起来从而确定ALU控制位。
具体来说,它就是和ALUOp配合来确定逻辑处理单元具体是执行哪一个处理过程,比如说add,或者是sub指令它都会用到逻辑处理单元,它指令中的funct字段就是来控制逻辑处理单元到底是执行加还是减的步骤。
本次设计的指令系统都是由上述所说的指令类型来编译的,它将在指令流水线中运行,以确定设计出的流水线是否符合逻辑。
下面将给出具体执行的八条指令:
lw$1,0($0)
add$2,$0,$1
lw$3,1($0)
sub$4,$2,$3
beq$1,$2,7
add$3,$1,$2
add$4,$2,$3
sw$4,2($0)
4.2指令流水线各个部件的设计
4.2.1指令流水线指令控制器
设计指令流水线的指令控制器就要考虑它的指令系统具体是有哪几种类型的指令,下面将会列出指令流水线的具体的各个控制信号的名称以及其作用:
指令流水线控制信号表
表4.2
信号名称
清0效果
置为1效果
RegDst
写入寄存器的目标号来自rt字段(20-16位)
写入寄存器的目标号从rd字段(15-11位)
RegWrite
无
写入寄存器的源寄存器的值置为输入的写入数据
ALUSrc
第二个ALU操作数来自第二个寄存器堆的输出(读数据2)
第二个ALU操作数是一个符号扩展指令的低十六位
PCSrc
PC的值替换为PC+4
PC的值置为分支目标的地址
MemRead
无
输入地址对应的数据存储器内容置为读入数据的输出
MemWrite
无
输入地址对应的数据存储器的内容替换为写入数据的输入
MemtoReg
ALU提供寄存器写数据的输入值
数据存储器提供寄存器写数据的输入值
因为本次设计还有逻辑处理单元的控制码,所以下面将列出逻辑出来单元的控制位的具体控制码:
逻辑控制单元控制码
表4.3
指令操作码
ALUOp
指令操作
功能字段
ALU动作
ALU控制输入
取字
00
取字
XXXXXX
加
010
存储字
00
存储字
XXXXXX
加
010
相等分支
01
相等分支
XXXXXX
减
110
R类型
10
加
100000
加
010
R类型
10
加
100010
减
110
R类型
10
与
100100
与
000
R类型
10
或
100101
或
001
ALU控制输入码
表4.4
ALU控制输入
000
001
010
110
功能
与
或
加
减
下面给出流水线的步骤控制线路分布图:
图4.1
下面将详细介绍流水线的控制问题,可以在任何的一条流水线步骤中都加入与之相应的控制码。
因为每一条控制线路它只会和它所控制的流水线部件相对应,所以只要在流水线的五个步骤中,把控制信号分成五组就可以很好的解决指令流水线控制的问题了。
将控制信号分为
1.取指令:
读指令存储器和写PC的控制信号都置为1,因此在指令流水线的取指令阶段并没有什么一定要注意的控制部件。
2.指令译码/寄存器堆读阶段:
与之前的一步是比较相似的,在每一个的指令时钟周期里,指令本身所做的工作都是一样,它就是译码所以根本就不用控制信号来控制它。
3.指令的执行和地址的计算阶段:
在这个阶段里,被设置的信号有RegDst,ALUOp还有ALUSrc。
指令流水线将根据这些信号来选择结构寄存器,并且可以扩展十六位的地址位让它与寄存器里的值相加从而得到地址。
4.存储器的访问阶段:
在这个步骤中将设置的控制信号有Branch,MemRead和MemWrite这几个信号。
在Branch信号和分支指令检测单元的输出都为零的时候,PCSrc将不会调用下一个顺序地址,否则它将调用下一个顺序的地址。
5.写回阶段:
在这个阶段中将会设置MemtoReg还有RegWrite信号,MemtoReg信号是决定是将ALU结果还是将存储器数据传输到寄存器堆,而RegWrite信号辅助写入选定的数据。
下面将给出本次设计的指令流水线指令控制器在具体指令中应该如何如何设置值的具体表格:
流水线指令控制码
表4.5
指令
RegDst
ALUOp1
ALUOp2
ALUsrc
Branch
MemRead
MemWrite
RegWrite
MemtoReg
R型
1
1
0
0
0
0
0
1
0
lw
0
0
0
1
0
1
0
1
1
sw
x
0
0
1
0
0
1
0
x
beq
x
0
1
0
1
0
0
0
x
当设计出指令流水线控制代码,以及ALU控制代码时,就进行下一步的指令流水线控制器的设计,在本次设计中,使用的是Logisim软件中的ROM存储单元,设计构思是将设计好的ALU控制码直接存储到ROM中,然后将OP字段作为ROM存储单元的地址,即假如OP字段为000001则ROM存储单元输出的是位置在第一个的存储数据,如果OP字段是000000则ROM存储单元输出的是位置在第零位的存储数据。
存储数据输出后将会使用数据分离器来分了各个部分所需要的控制码。
如WB阶段需要两位控制码,MEM阶段需要三位控制码,EX执行阶段需要四位控制码。
下面将给出在Logisim上设计的具体的设计图样:
图4.2
其中,第零号地址不会存储任何的数据,即它全为0;第一号地址存储的是R型指令所需要的控制码,它转换为十六进制为:
182;第二号地址存储的是LW指令所需要的控制码,它转换为十六进制为:
02b;第三号地址存储的是SW指令所需要的控制码,它转换为十六进制为:
024;第四号地址存储的是beq指令所需要的控制码,它转换为十六进制为:
050。
4.2.2指令流水线PC寄存器
PC寄存器是一个专门用于存储下一条指令地址的寄存器,它的主要功能就是存储下一条指令的地址。
但是因为设计的是流水线化的指令原型机,则必须要考虑到相等分支指令执行时,PC寄存器的值一定会跳转到指令所确定的地址,并且在发生指令流水线数据相关时PC寄存器必须要将自己锁存起来,这就要求设计PC寄存器时必须有时它暂时不接收数据的PCWrite信号,在PCWrite信号为零时它不接收任何的数据,在PCWrite信号为一时才接收数据。
PC寄存器有三个部分组成:
第一部分三十二位数据接收单元,第二部分寄存器存储单元,第三部分三十二位数据传出单元。
下面将给出在Logisim上设计的PC寄存器的设计图:
图4.3
其中寄存器的数据位设为三十二位数据域,PC使能信号为一时当第一条指令已经进入译码阶段后,下一条指令的值会立刻存储到PC寄存器中。
4.2.3指令流水线指令存储器
指令流水线指令存储器是一个专门存储已经编译好的指令的存储器,它有一个八位的地址接收单元,三十二位的数据传出单元,和三十二位的ROM存储器三个部分构成。
它的原理是地址单元传输数据到ROM存储器中,则ROM存储器就会传出数据到数据传出单元以便下一步指令的执行。
下面将给出在Logisim上设计的指令存储器的设计图:
图4.4
本次设计的指令流水线中,指令存储器中一共存储了八条指令,但是最终只会执行七条指令,因为在执行相等分支指令时会跳过一条指令转而跳转到相等分支指令指定的地址。
下面将列出设计的具体指令:
lw$1,0($0)
add$0,$1,$2
lw$3,1($0)
sub$2,$3,$4
beq$1,$2,7
add$1,$2,$3
位置在第十二号地址:
add$2,$3,$4
sw$4,2($0)
这八条指令将一次在指令流水线中执行,首先会先把它存入在指令寄存器中,因为指令存储器它的数据进制是十六位的,所以会将编译好的二进制代码转换为十六进制的,它一次分别为:
8010000,4011020,8030001,4432022,10220007,4221820,4432020,c040002
这些指令代码全部存入指令存储器中,当指