电子科技大学计算机系统结构综合实验实验报告.docx
- 文档编号:2989739
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:39
- 大小:1.76MB
电子科技大学计算机系统结构综合实验实验报告.docx
《电子科技大学计算机系统结构综合实验实验报告.docx》由会员分享,可在线阅读,更多相关《电子科技大学计算机系统结构综合实验实验报告.docx(39页珍藏版)》请在冰点文库上搜索。
电子科技大学计算机系统结构综合实验实验报告
实验报告
课程名称:
计算机系统结构综合实验
学 院:
计算机科学与工程学院
专 业:
计算机科学与技术
学生姓名:
WolfAlice
学 号:
2016020912016
指导教师:
米源
评 分:
日 期:
2019年 6月6日
电子科技大学
实验报告
学生姓名:
WolfAlice学号:
*************指导教师:
米源
实验地点:
主楼A2-412实验时间:
2019.5.24
一、实验室名称:
主楼A2-412
二、实验项目名称:
CPU流水线结构分析
三、实验学时:
4
四、实验原理:
(一)流水线处理机及其设计
流水线(pipeline)是一种能够使多条指令重叠执行的处理机的实现技术,它已成为现代处理机设计中最为关键的技术。
流水线处理机把一条指令的执行分成几个步骤,或称级(stages),每一级在一个时钟周期内完成。
在每个时钟周期,处理机启动执行一条指令。
如果处理机的流水线有m级,则同时可重叠执行的指令总条数将为m,每条指令处在不同的执行阶段。
如果分级分得好的话,那么每一级都没有时间上的浪费,这是最理想的情况。
流水线处理机的最大特点:
每一个时钟周期取出一条指令来执行。
所有的指令按取出的先后次序通过数据路径。
依照指令类型的不同,每种指令在执行过程中可能会用到数据路径的不同的部分。
1.流水线寄存器的引入
在单周期处理机中,如果一条指令还没有执行完毕,PC的内容不会改变。
这就使得在一条指令的整个执行过程中,IM始终输出当前指令。
流水线处理机每个时钟周期都要取出一条指令。
因此,当流水线处理机已从存储器取出一条指令并把它送到ID级去译码时,下一条指令也正在从指令存储器中取出。
如果先取出的指令没被保存,则它后面正在被取出的指令会对它造成影响。
也就是说,必须要使用寄存器来保存从存储器取出的指令。
推而广之,我们必须要在流水线的各级之间安排一组寄存器,用以保存当前时钟周期各流水级操作的结果,以便为下个周期使用,我们称这些寄存器为流水线寄存器。
在第一级与第二级之间,我们使用了一个被称为IR(instructionregister)的指令寄存器。
对于字长为32位的处理机来讲,PC一般有30位,它存放的是32位指令的字地址。
IR有32位,用来存放一条指令。
第二和第三级之间需要较多的寄存器:
*从寄存器堆中读出的两个32位数据A和B必须要保存。
*经符号扩展后的32位立即数I也要保存。
图中的ISE(immediatesign-extend)代表指令中立即数的符号扩展。
*一个d寄存器(5位),它被用来保存目的寄存器号;因为指令的操作结果要在WB级写入寄存器堆,目的寄存器号也要在那时使用,因此必须要同步跟随过去。
第三级和第四级之间除了d之外,还有Z,R和S:
•Z用于存放ALU的一位ZERO标志。
当ALU指令的运算结果为全0时,ZERO输出1,否则输出0。
在执行条件转移指令时,Z用来决定是否真正转移。
•S专为store指令而设,用来存放要被写入存储器中的数据。
•R保存32位ALU运算结果。
第四级和第五级之间的寄存器如下:
•D存放load指令从存储器中读出的数据;
•C只是保存前一级的R,即ALU指令的结果。
•这一级d寄存器的输出用于指定目的寄存器,D或C的数据要被写入由d所指定的目的寄存器中。
我们可以把寄存器堆看作是最后一级流水线寄存器。
2.流水线处理机的5部分和数据路径
我们把执行指令的过程分为5部分,使其能够按流水线方式执行指令。
每一级所使用的名字及其要完成的动作如下:
(1)IF(instructionfetch)取指令;
•使用PC的内容访问指令存储器,取出指令,并在该级结束时,把指令打人IR寄存器。
•下一条指令的地址也在这一级计算出,并把它打人PC寄存器。
(2)ID(instructiondecode)指令译码并读寄存器操作数;
指令译码级主要有两件事情要做:
•从寄存器堆中读寄存器操作数和对指令中的立即数部分进行符号扩展。
•此外:
目的寄存器号要保存在流水线寄存器d中,以便在WB级指定把结果写入哪一个寄存器中。
(3)EXE(execution)执行;
*ALU运算类指令将在本级计算结果,并把它打人R寄存器。
同时,ALU的ZERO输出也被打入Z寄存器。
ALU的两个操作数,一个来自于寄存器rs1,它在前一级已被打人流水线寄存器A中了;另一个或是寄存器rs2操作数(B中内容),或是立即数(I中内容)。
(4)MEM(memoryaccess)存储器访问;
存储器访问级专为load/store指令而设。
•load/store均使用流水线寄存器R的输出作为访问存储器的地址。
store指令把S的内容写入存储器。
load指令读存储器,并把读出的数据打入流水线寄存器D。
•ALU指令在本级直接把R内容打入C。
(5)WB(writeback)写回。
写回级把指令结果写回到寄存器堆。
目的寄存器号由从ID级一直传递过来d指定。
写入的来源有两个:
*一个是流水线寄存器D中的内容(load指令读出内容),即存储器数据;
*一个是ALU的计算结果
指令执行时从左移向右通过数据通路。
但有两处从右向左的例外:
•WB级,它把运算结果写回中间靠左位置的寄存器堆中;
•IF级,它把经过计算的下一条指令的地址写入程序计数器PC中。
下一条指令地址的计算方法有两种:
一种是当前PC加4;另一种是当前PC加字地址偏移量,偏移量在指令中定义出。
(二)流水线模型机的指令系统和指令格式
✧ALU操作类型的指令
✧存储器访问指令
✧条件转移指令
✧无条件转移指令
ALU指令除了把运算结果写入寄存器堆之外,也把ZERO标志写入Z寄存器。
条件转移指令使用Z标志决定是否转移,其它指令不影响Z寄存器。
1、对于add/and/or/xorrd,rs,rt指令//rdrsoprt
其中rs和rt是两个源操作数的寄存器号,rd是目的寄存器号。
2、对于sll/srlrd,rt,shift指令//rdrt移动shift位
3、对于addirt,rs,imm指令//rtrs+imm(符号拓展)
rt是目的寄存器号,立即数要做符号拓展到32位。
4、对于andi/ori/xorirt,rs,imm指令//rtrsopimm(零拓展)
因为是逻辑指令,所以是零拓展。
5、对于loadrt,offset(rs)指令//rtmemory[rs+offset]
load是一条取存储器字的指令。
寄存器rs的内容与符号拓展的offset想加,得到存储器地址。
从存储器取来的数据存入rt寄存器。
6、对于storert,offset(rs)指令//memory[rs+offset]rt
store是一条存字指令。
存储器地址的计算方法与load相同。
7、对于beqrs,rt,label指令//if(rs==rt)PClabel
beq是一条条件转移指令。
当寄存器rs内容与rt相等时,转移到label。
如果程序计数器PC是beq的指令地址,则label=PC+4+offset<<2。
offset左移两位导致PC的最低两位永远是0,这是因为PC是字节地址,而一条指令要占4个字节。
offset要进行符号拓展,因为beq能实现向前和向后两种转移。
8、bne指令去beq类似,但是是在寄存器rs内容与rt不相等时,转移到label。
9、对于jumptarget指令//PCtarget
jump是一条跳转指令。
target是转移的目标地址,32位,由3部分组成:
最高4位来自于PC+4的高4位,中间26位是指令中的address,最低两位为0。
五、实验内容:
1.贴出补全的CPU流水线结构图;
2.对流水线中各模块,描述其端口信号的作用,模块的工作原理以及模块在流水线中的功能
六、实验目的:
1.熟悉代码中的模块名和接口信号,并理解其作用;
2.通过补全流水线的模块图,进一步熟悉代码中各模块的连接细节,加强
对流水线CPU工作原理的掌握。
七、实验器材(设备、元器件)
PC机
实验环境:
Windows8.1
八、实验步骤:
1.贴出补全的CPU流水线结构图;
2.对流水线中各模块,描述其端口信号的作用,模块的工作原理以及模块在流水线中的功能
九、实验数据及结果分析:
1.贴出补全的CPU流水线结构图;
2.对流水线中各模块,描述其端口信号的作用,模块的工作原理以及模块在流水线中的功能
(1)IF(instructionfetch)取指令;
1.程序计数器PCR
PCR负责输出下一条指令的地址。
输入信号:
Clock:
时钟信号
Resetn:
复位信号,低电平有效,此时pc被清零。
Npc:
输入下一条指令的地址
输出信号:
Pc:
输出指令地址,若复位则为0,否则为npc.
2.32位加法器
加法器负责计算pc+4,即当前指令按顺序执行的下一条指令地址。
输入信号:
Pc:
PCR输出的指令地址
4:
常数4,一条指令的长度
输出信号:
Pc4:
pc+4用于输出至ID级计算跳转地址
3.32位4选1选择器
根据ID级的pcsource信号选择下一条指令的地址。
输入信号:
Pcsource:
选择信号,选择下一条指令的地址。
bpc:
分支指令的下一条地址。
jpc:
跳转指令的下一条地址。
Pc4:
pc+4,正常顺序执行的跳转地址。
32位常数0:
复位时下一条地址为0
输出信号:
npc:
输出下一条指令的地址
4.指令存储器
从存储器取出需要执行的指令。
输入信号:
Pc:
下一条指令的地址。
输出信号:
inst:
需要执行的指令
(2)ID(instructiondecode)指令译码并读寄存器操作数;
1.控制部件
负责根据指令的类型,产生各类控制信号。
输入信号:
rsrtequ:
判断ALU输出结果是否为0
func,op:
指令中相应控制码字段
输出信号:
wreg,m2reg,wmem,regrt,aluimm,sext,shift,wz:
CPU控制信号,具体的意义在各个部件会详细介绍。
它们被送到需要用到的部件上,或是传到寄存器当中供之后使用。
aluc:
ALU控制码
pcsource:
PC多路选择器控制码,选择下一条指令的地址
2.寄存器堆
寄存器堆有32个32位的寄存器,0号寄存器恒为0;在上升沿将数据写入寄存器。
输入信号:
rna,rnb:
需要取寄存器a,b值的寄存器编号
wn,d:
需要回写到寄存器的数据和地址
clk,clrn:
时钟和复位信号
we:
回写使能控制信号
输出信号:
qa,qb:
寄存器a,b的值
3.5位2选1选择器
选择目的寄存器是来自于rd,还是rt,取决是寄存器类型指令或是Load指令。
输入信号:
rd,rt:
指令中对应的地址。
Regrt:
选择信号,当前指令类型是寄存器类型指令还是Load指令
输出信号:
id_rn:
目的寄存器的地址
4.32位加法器
负责beq,bne指令的目标地址的计算。
输入信号:
pc4,br_offset:
当前地址和偏移地址。
输出信号:
bpc:
beq,bne指令的目标地址
此外,ID级还输出以下信号:
Jpc:
jump指令的目标地址
Imm:
立即数操作数
(3)EXE(execution)执行;
1.32位选择器
有两个,分别负责选择ALUa端、b端的数据来源。
a端:
输入信号:
exe_a,sa:
ALUa端的数据来源,寄存器或立即数扩展
exe_shift:
选择信号。
输出信号:
alua:
ALUa端的数据
b端:
输入信号:
exe_b,exe_imm:
ALUb端的数据来源,寄存器或立即数
exe_aluimm:
选择信号。
输出信号:
alua:
ALUb端的数据
2.ALU
负责运算的执行。
输入信号:
alua,alub:
ALUa端、b端的数据。
exe_aluc:
ALU运算类型。
输出信号:
exe_alu,z:
运算结果和z标志。
Z标志用来判断运算结果是否为0。
此外,这一级还将没有用到的控制信号送往下一级。
(4)MEM(memoryaccess)存储器访问;
Load/store指令需要在这一级访问存储器。
输入信号:
Datain,addr:
数据和地址,load指令用addr指明地址,store指令用datain指明写入的数据。
we:
写入使能信号。
Clk:
时钟信号。
输出信号:
dataout:
如果是取存储器数据,输出取出的数据。
此外,这一级还将没有用到的控制信号送往下一级。
(5)WB(writeback)写回:
负责将需要写回寄存器的值送到ID级写入寄存器。
输入信号:
r_alu,m_o:
alu运算结果和存储器取出的数据。
m2reg:
选择信号,判断回写的数据是上面两个输入中的哪个。
输出信号:
wdi:
需要写回的数据。
(6)各级寄存器:
流水线CPU各级间的寄存器存放控制信号、运算结果、标志等。
各级CPU的输入信号即从上一级继承的控制信号,和时钟信号、复位信号。
输出信号即把这一级需要使用的控制信号送给各模块,并把后续需要使用的控制信号传到下一级寄存器。
十、实验结论:
通过这次实验,成功绘制了流水线CPU的结构图,完成了对流水线CPU各模块的分析。
十一、总结及心得体会:
在这次实验中,我加深了对流水线CPU结构的理解,熟悉了Visio的基本操作和应用,对计算机体系结构的认识更深了,也为之后流水线CPU代码的实现打下了基础。
十二、对本实验过程及方法、手段的改进建议:
可以尝试自己对流水线CPU的结构进行改进。
报告评分:
指导教师签字:
电子科技大学
实验报告
学生姓名:
WolfAlice学号:
*************指导教师:
米源
实验地点:
主楼A2-412实验时间:
2019.5.31
一、实验室名称:
主楼A2-412
二、实验项目名称:
流水线CPU实现及仿真
三、实验学时:
4
四、实验原理:
(一)VerilogHDL基础知识
1.5种抽象的级别
VerilogHDL既是一种行为描述的语言也是一种结构描述语言。
VerilogHDL模型可以是实际电路的不同级别的抽象,这些抽象的级别和它们所对应的模型类型共有以下5中:
1、系统级(System-Level):
用高级语言结构实现设计模块的模型。
2、算法级(Algorithem-level):
用高级语言结构实现设计算法的模型。
3、RTL级(Register-Transfer-Level):
描述数据在寄存器之间流动和如何处理这些数据的模型。
4、门级(Gate-Level):
描述逻辑门以及逻辑门之间连接的模型。
5、开关级(Switch-Level):
描述器件中三极管和存储节点以及它们之间连接的模型。
2.VerilogHDL具有的功能
VerilogHDL是一种结构化和过程性的语言,其语法结构非常适合于算法级和RTL级的模型。
具有功能如下:
1、可描述顺序执行或并行执行的程序结构;
2、用延迟表达式或事件表达式来明确地控制过程的启动时间。
3、通过命名的事件来触发其他过程里的激活行为或停止行为。
3.模块的使用
一个模块是由两部分组成的,一部分描述接口,另一部分描述逻辑功能,即定义输入是如何影响输出的。
在许多方面,程序模块和电路图符号是一致的。
每个Verilog程序包括4个主要部分:
端口定义、I/O说明、内部信号说明和功能定义。
1.模块的端口定义
模块的端口声明了模块的输入、输出口,格式如下:
module模块名(口1,口2,口3,….);
2.I/O说明
I/O说明的格式如下:
输入口:
input端口名1,端口名2,….;
输出口:
output端口名1,端口名2,….;
3.内部信号说明
内部信号的说明可以使用wire语句。
4.功能定义
有三种方法可在模块中产生逻辑。
1.用“assign”声明语句
2.用实例元件
3.用“always”块
五、实验内容:
1.给出主要Verilog模块代码(注:
代码必须包含注释),辅以文字说明;
2.贴出仿真结果截图及所运行的指令序列,对仿真结果进行说明,验证仿真结果的正确性。
六、实验目的:
通过补全流水线CPU的代码并仿真,进一步熟悉代码中各模块的连接细节,加强
对流水线CPU工作原理的掌握。
七、实验器材(设备、元器件)
PC机
实验环境:
Windows8.1
八、实验步骤:
1.编写代码
2.编写仿真代码并截图
九、实验数据及结果分析:
1.给出主要Verilog模块代码(注:
代码必须包含注释),辅以文字说明;
(1)IF(instructionfetch)取指令;
1.程序计数器PCR
PCR负责输出下一条指令的地址。
2.32位加法器
加法器负责计算pc+4,即当前指令按顺序执行的下一条指令地址。
3.32位4选1选择器
根据ID级的pcsource信号选择下一条指令的地址。
4.指令存储器
从存储器取出需要执行的指令。
实现时,先将指令填入存储器,再实现输出。
因为一条地址4字节,所以取地址的第7到2位,忽略最后两位。
5.IF级整体
将IF级各模块写好后,将它们整合在一起,如下图:
(2)ID(instructiondecode)指令译码并读寄存器操作数;
1.控制部件
负责根据指令的类型,产生各类控制信号。
在这一单元中,先列表得到各个信号产生的逻辑表达式,再根据逻辑表达式进行编程。
代码如下:
2.寄存器堆
寄存器堆有32个32位的寄存器,0号寄存器恒为0;在上升沿将数据写入寄存器。
3.5位2选1选择器
选择目的寄存器是来自于rd,还是rt,取决是寄存器类型指令或是Load指令。
寄存器的实现和32位选择器类似,这里就不详细阐述其代码了。
4.32位加法器
负责beq,bne指令的目标地址的计算。
代码与IF级的加法器相似。
5.ID级整体
将ID级各模块写好后,将它们整合在一起,如下图:
(3)EXE(execution)执行;
1.32位选择器
有两个,分别负责选择ALUa端、b端的数据来源。
它们的实现与上文提到的选择器相同。
2.ALU
负责运算的执行。
根据运算控制码的不同,编程实现不同的运算。
代码如下:
Z寄存器用来判断结果是否为0。
3.EX级整体代码
将各模块整合之后的EX级整体代码如下:
(4)MEM(memoryaccess)存储器访问;
Load/store指令需要在这一级访问存储器。
代码如下:
(5)WB(writeback)写回:
负责将需要写回寄存器的值送到ID级写入寄存器。
代码包含一个32位选择器模块来实现这个功能。
(6)各级寄存器及CPU整体:
将CPU的各级整合在一起,加上各级间的寄存器,代码如下:
2.贴出仿真结果截图及所运行的指令序列,对仿真结果进行说明,验证仿真结果的正确性。
仿真实验的指令序列如下图所示:
将译码的指令放入指令存储器后,编写测试代码。
测试代码如下:
写好测试代码后,运行该文件进行测试。
测试结果如下:
PC是指令的地址,每条指令4字节,因此一个时钟周期PC应该+4,和仿真结果相符。
首先观察第二行If_inst的结果,该行的结果是取指阶段的结果。
可以看到,该行的数据和之前输入指令存储器的指令的值吻合,说明流水线CPU的取指阶段没有问题。
之后观察第三行ID_inst的结果,按照流水线CPU的执行方式,该行的结果应该落后if_inst一个周期,即上一级输入该级的指令,但值应该相同。
查看仿真结果,与仿真结果吻合。
第四行EXE_Alu是alu执行运算之后的输出结果。
根据指令序列分析,第一条指令将r1+4,r1初始值为1,结果应该为5。
第二条指令loadr3+4的地址,ALU结果应该是r3+4,即7.
第三条指令将寄存器r5,r6取按位或,结果应该是5or6=7。
第四条指令需要使r3=r5+r6,结果应该是r5+r6=5+6=11。
第五条指令时store指令,地址为r7+2=7+2=9.
第六条指令是移位指令,是逻辑右移,结果是r7>>2=7>>2=1.
将上述结果从第三个时钟周期开始和EXE_Alu的值核对,结果一致,说明CPU的EX级是正确的。
第五行MEM_Alu是访问内存阶段的地址,由于这一阶段若访问内存,则其地址是根据ALU的运算结果得到的,所以除了在时间上落后EXE_Alu的值一个周期外,该行的值应该和上一行一致。
仿真结果和预期的结果相同。
第六行WB_Alu是需要回写到寄存器的结果,若指令是load指令,则结果应该是从存储器取出的值;否则其应该是ALU的运算结果。
观察仿真的结果,第二条指令是load指令,load的地址是7,而7号存储器被初始化为了7,对应的时间是1200ns-1400ns。
对于其他指令,WB_Alu的值应该和上一行相同。
仿真的结果与预期一致,证明指令成功执行。
十、实验结论:
代码成功实现了一个流水线CPU。
十一、总结及心得体会:
通过这次实验,我对Verilog编程有了更深入的实践和了解,也更加熟悉流水线CPU的内部结构与组成,也激发了我对计算机系统结构这门课的强烈兴趣。
十二、对本实验过程及方法、手段的改进建议:
可以根据流水线CPU的特点和结构,自己尝试编写更多的指令,使指令系统更丰富。
报告评分:
指导教师签字:
电子科技大学
实验报告
学生姓名:
WolfAlice学号:
*************指导教师:
米源
实验地点:
主楼A2-412实验时间:
2019.6.7
一、实验室名称:
主楼A2-412
二、实验项目名称:
数据冒险问题
三、实验学时:
4
四、实验原理:
(一)数据冒险
数据冒险是指由于流水线上指令重叠执行,改变了原来串行执行的读/写操作数顺序,使得后面依赖前面指令结果的指令得不到准备好的数据。
例如下面的指令序列:
I1:
addr1,r2,r3
I2:
subr4,r1,r5
I3:
andr6,r7,r1
I4:
orr8,r1,r9
I5:
addir10,r1,100
画出这些指令的执行时空图,结果如下:
可以看到,第一条指令对r1的值进行了修改,而I2,I3,I4读取的值是没有修改的r1,即第一条指令还没有来得及回写数据,使得后续指令出错。
(二)数据冒险的解决方法
1.提前回写
让写寄存器堆的操作提前半个周期,即由时钟的下降沿打入;读在后半周期。
设一个时钟周期是10ns,寄存器堆的访问只需要5ns。
这样,在上图的例子当中,I4读取
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子科技大学 计算机系统 结构 综合 实验 报告