资源描述
2017
计算机组成原理 课程设计报告
题 目:
5段流水CPU设计
专 业:
计算机科学与技术
班 级:
学 号:
姓 名:
电 话:
邮 件:
完成日期:
2017-03-10 周五下午
华 中 科 技 大 学 课 程 设 计 报 告
目 录
1 课程设计概述 2
1.1 课设目的 2
1.2 设计任务 2
1.3 设计要求 2
1.4 技术指标 3
2 总体方案设计 5
2.1 扩展指令的设计 5
2.2 中断机制设计 7
2.3 流水CPU设计 9
3 详细设计与实现 11
3.1 扩展指令的实现 11
3.2 中断机制实现 16
3.3 流水CPU实现 19
4 实验过程与调试 24
4.1 测试用例和功能测试 24
4.2 主要故障与调试 31
4.3 实验进度 32
5 设计总结与心得 33
5.1 课设总结 33
5.2 课设心得 33
参考文献 35
I
华 中 科 技 大 学 课 程 设 计 报 告
1 课程设计概述
1.1 课设目的
计算机组成原理是计算机专业的核心基础课。该课程力图以“培养学生现代计算机系统设计能力”为目标,贯彻“强调软/硬件关联与协同、以CPU设计为核心/层次化系统设计的组织思路,有效地增强对学生的计算机系统设计与实现能力的培养”。课程设计是完成该课程并进行了多个单元实验后,综合利用所学的理论知识,并结合在单元实验中所积累的计算机部件设计和调试方法,设计出一台具有一定规模的指令系统的简单计算机系统。所设计的系统能在LOGISIM仿真平台和FPGA实验平台上正确运行,通过检查程序结果的正确性来判断所设计计算机系统正确性。
课程设计属于设计型实验,不仅锻炼学生简单计算机系统的设计能力,而且通过进行中央处理器底层电路的实现、故障分析与定位、系统调试等环节的综合锻炼,进一步提高学生分析和解决问题的能力。
1.2 设计任务
本课程设计的总体目标是利用FPGA以及相关外围器件,设计五段流水CPU,要求所设计的流水CPU系统能支持自动和单步运行方式,能正确地执行存放在主存中的程序的功能,对主要的数据流和控制流通过LED、数码管等适时的进行显示,方便监控和调试。尽可能利用EDA软件或仿真软件对模型机系统中各部件进行仿真分析和功能验证。
1.3 设计要求
(1) 根据课程设计指导书的要求,制定出设计方案;
(2) 分析指令系统格式,指令系统功能。
(3) 根据指令系统构建基本功能部件,主要数据通路。
(4) 根据功能部件及数据通路连接,分析所需要的控制信号以及这些控制信号的有效形式;
(5) 设计出实现指令功能的硬布线控制器;
(6) 调试、数据分析、验收检查;
(7) 课程设计报告和总结。
1.4 技术指标
(8) 支持表 1.1前27条基本32位MIPS指令;
(9) 支持教师指定的4条扩展指令;
(10) 支持多级嵌套中断,利用中断触发扩展指令集测试程序;
(11) 支持5段流水机制,可处理数据冒险,结构冒险,分支冒险;
(12) 能运行由自己所设计的指令系统构成的一段测试程序,测试程序应能涵盖所有指令,程序执行功能正确。
(13) 能运行教师提供的标准测试程序,并自动统计执行周期数
(14) 能自动统计各类分支指令数目,如不同种类指令的条数、冒险冲突次数、插入气泡数目、load-use冲突次数、动态分支预测流水线能自动统计预测成功与失败次数。
表 1.1 指令集
#
指令助记符
简单功能描述
备注
1
ADD
加法
指令格式参考MIPS32指令集,最终功能以MARS模拟器为准。
2
ADDI
立即数加
3
ADDIU
无符号立即数加
4
ADDU
无符号数加
5
AND
与
6
ANDI
立即数与
7
SLL
逻辑左移
8
SRA
算数右移
9
SRL
逻辑右移
10
SUb
减
11
OR
或
12
ORI
立即数或
13
NOR
或非
14
LW
加载字
15
SW
存字
16
BEQ
相等跳转
17
BNE
不相等跳转
18
SLT
小于置数
19
STI
小于立即数置数
20
SLTU
小于无符号数置数
21
J
无条件转移
22
JAL
转移并链接
23
JR
转移到指定寄存器
If $v0==10 halt(停机指令)
else 数码管显示$a0值
24
SYSCALL
系统调用
25
MFC0
访问CP0
中断相关,可简化,选做
26
MTC0
访问CP0
中断相关,可简化,选做
27
ERET
中断返回
异常返回,选做
28
扩展指令:SLLV
逻辑可变左移
29
扩展指令:SUBU
无符号减
30
扩展指令:LH
加载半字
31
扩展指令:BLEZ
小于等于0是转移
35
2 总体方案设计
2.1 扩展指令设计
在本次实验中首先需要完成单周期CPU的设计,然后在其基础之上完成老师布置的4条扩展指令的添加,对于单周期CPU的设计在组成原理实验中已经做了详细介绍,这里不再赘述。主要介绍四条扩展指令的设计有实现。为了实现实验课程的连贯性,这里给出单周期CPU设计的总体结构图如图2.1所示。在单周期的基础之上添加4条扩展指令主要有运算指令2条,存储访问指令1条,跳转指令1条。
图 2.1 总体结构图
2.1.1 数据通路的设计
在单周期CPU的基础之上,添加4条扩展指令,主要包括运算指令SLLV,SUBU。存储访问指令LH,以及跳转指令BLEZ。下面给出四条扩展指令的数据通路。
表 2.1指令系统数据通路
指令
PC
RF
ALU
DM
R1#
R2#
W#
Din
A
B
OP
Addr
Din
SLLV
pc+4
rs
rt
rd
ALU
R2#
R1#
0000
无
无
SUBU
pc+4
rs
rt
rd
ALU
R2#
R1#
0110
无
无
LH
pc+4
base
无
rt
Memory
R1#
立即数
0101
ALU
无
BLEZ
pc+立即数
rs
无
无
无
无
无
无
无
无
2.1.2 控制器的设计
当完成扩展指令的数据通路时,接下来就需要完成对数据通路以及运算器的控制。对于控制信号进行统计,包括各个主要部件所需要输入的控制信号,以及数据通路合并表中所示的具有多输入的主要部件需要进行输入选择的控制信号,并且对各个统计信号的各种取值情况进行定义,单周期CPU中的部分控制信号在组成原理实验报告中已经完成这里不再赘述,此处只对4条扩展指令的控制信号进行描述其中的SUBU扩展指令没用新的控制信号。统计得到的控制信号以及说明如表 2.2。
表 2.2主控制器控制信号的作用说明
控制信号
取值
说明
SLLV
0
寄存器堆R2或者0-15的扩展,或者6-10的扩展
1
寄存器堆R1
LH
0
数据来自ALU或者memory
1
数据来自ALU或者memory将0-15扩展为32位数据
BLEZ
0
PC+4进行更新PC
1
PC+4后的值加上来自指令的0-15的扩展更新PC
对照所有控制信号,依次分析各条指令,分析该指令执行过程中需要哪些控制信号,对于与本条指令无关的控制信号,控制信号的取值一律为0,以简化控制器电路的设计。对于单周期CPU的控制信号在组成原理实验中已经做了详细描述,这里不再赘述,但对于扩展指令的数据通路的控制信号会做详细描述。该控制信号表的框架如表 2.3所示。
表 2.3主控制器控制信号框架
指令
R
ALUop
MemWrite
MemRead
Din
Branch
SYSCALL
SLLV
LH
BLEZ
SLLV
1
0000
0
0
无
0
0
1
0
0
SUBU
1
0110
0
0
无
0
0
0
0
0
LH
1
0101
0
1
无
0
0
0
1
0
BLEZ
0
无
0
0
无
1
0
0
0
1
2.2 中断机制设计
2.2.1 总体设计
中断实验部分主要分为两部分,单机中断和多级中断,这里主要介绍多级中断的实现机制。多级中断主要包括如下几个阶段。
(1)中断信号来临。
(2)关中断,保护现场,设置新的屏蔽字,PC值压栈。
(3)开中断,执行中断程序。
(4)关中断,恢复现场,开中断。
(5)中断返回,回到断点PC,执行主程序。
实验实现的3个中断分别编号为1号中断,2号中断,3号中断。优先级为:3>2>1。3号中断具有最高优先级。当执行主程序时具有最低优先级,级数为0级。当中断信号来临时可以打断主程序,优先级高的中断可以打断优先级低的中断,当有优先级更高的中断的时候转去执行优先级更高的中断,当优先级更高的中断执行完成之后,每次主程序被打断或者有优先级更高的中断打断优先级低的中断的时候,将当前的PC存放到一个特殊的寄存器的值进行压栈处理,EPC其实就是一个被调用者保护寄存器。在多级中断中,中断信号的产生,优先级的比较以及PC值的保存时使用硬件实现的,其余是使用软件的方式实现的。
2.2.2 硬件设计
(1)生成中断信号。
本次实验需要实现的有3个中断信号,分别编号为1号中断,2号中断,3号中断。优先级为:3>2>1。3号中断具有最高优先级。当执行主程序时具有最低优先级,级数为0级。3个中断信号分别对应不同的中断子程序。中断信号的产生使用的是中断信号产生电路,中断信号产生电路使用的是老师给的参考资料的电路。中断信号发生电路具有统一的时钟断和不同的清零端,中断信号使用上升沿触发。
(2)中断信号筛选。
中断信号筛选电路需要实现中断信号的筛选,主要是当有优先级高的中断来临的时候转向去执行优先级更高的中断,如果有优先级低的中断来临着将中断信号压栈,如果是同级中断,则忽略该中断。中断筛选电路的实现需要使用当前的中断优先级以及新中断的优先级还要使用到优先编码器,通过有线编码器决定中断信号的选择中断信号。
(3)PC值的转变。
在中断实验部分,转向到中断程序的PC值的过程是由硬件实现的。通过执行中断返回指令ERET指令,在物理电路中设计一个由ERET信号控制的控制信号,当执行ERET指令时,跳转到对应的PC值,这个PC值可能是优先级低的中断或者是主程序。
2.2.3 软件设计
(1)开关中断。
本次实验的开关中断是使用软件来实现,使用mfc0和mtc0实现中断的开关,但同时在硬件部分需要使用一个使能控制信号来控制中断信号这个使能信号需要结合软件部分进行使用。
(2)保护现场。
当进入中断程序之前,需要进行现场的保存,如果不保护现场那么返回后以前的值没有了,也就不能恢复当断点的状态。现场保存主要是将各个寄存器的值进行压栈处理,数据堆栈通常放在数据存储器中。MIPS处理器的堆栈是向下生长的,因此SP寄存器初始指向存储器的最高地址,每保存一个值,SP要减4;出栈时则SP加4。
2.3 流水CPU设计
2.3.1 总体设计
在本次实验中,需要完成流水CPU的设计。流水CPU的设计是建立在单周期CPU并且增加4条扩展指令的基础之上的。由于设计的流水线是理想流水线,需要完成的指令是理想流水线的4条测试指令加上扩展的4条指令,理想流水线的设计主要部分是设计缓存寄存器组,主要包括5个阶段的寄存器组:1.取指令阶段2.译码阶段3.执行运算4.访存阶段5.结果回写阶段。5个阶段的数据保存根据需要完成的指令来决定,指令的数据和对应的控制指令在这个阶段没有被使用,那么就需要将其保存,如果这个阶段使用了那么下一个阶段就不需要保存。在对结果进行测试的时候可能会出现数据冲突的现象,处理的方法是添加无关指令等待数据处理完,避免冲突。
2.3.2 流水接口部件设计
流水线的接口部件主要是使用一些寄存器组来存放需要使用到的数据和控制信号,这些寄存器组的数据宽度不一,因为有的是立即数,有的是地址,有的是控制信号,主要有两类,一类是32位的数据;一类是1位的控制信号。其中的寄存器组需要使用统一的时钟控制信号,因为寄存器组是随时会被使用的,为方便将所有的寄存器的使能端设常数1,又因为当有新的数据来时,寄存器的数据会自动被覆盖,所以将其清0端设为常量0。由总体设计可知,各个阶段的寄存器组的数目在依次递减,因为每过一个阶段,寄存器组中的数据被使用使得下个阶段的存储数据变少。对于寄存器组封装的时对应的接口位置,由于在本次实验中,流水接口的设计使用的是隧道连接,所以接口的布局显得不是那么的重要。
2.3.3 理想流水线设计
为了便于表达理想流水线的设计思想,在本次实验中,理想流水线的设计主要涵盖了8条指令,其中4条是参考资料中提供的理流水线的测试用例,还有4条是CCMD扩展指令。为了完成理想流水线的设计,不得不对每一条指令重新走一遍数据通路,将每条指令的数据在什么阶段使用,需要使用什么样的控制信号必须搞清楚。还未使用的数据和控制信号需要使用该阶段的寄存器组进行缓存,以便在流水线的下一个阶段使用,需要注意的是,regfile寄存器组的RW,DIN,WE三个信号需要一直保存到最后一个阶段。对于流水线的测试文件,为了避免数据冲突需要使用到一些无关指令,等待相关数据的到来或者相关指令的完成,避免冲突的发生。
3 详细设计与实现
3.1 扩展指令的实现
3.1.1 扩展指令的设计
1) 指令SLLV.
指令SLLV为逻辑可变左移。其包含的指令格式以及对应的逻辑功能如图3.1所示。
图 3.1指令SLLV
其实现的逻辑功能为:将寄存器编号为RT的寄存器的值左移寄存器编号为 RS的寄存器的值的位数。并且将逻辑左移后的结果存放到寄存器编号为RD的寄存器中。
2) 指令SUBU.
指令SUBU为无符号减,其包含的指令格式以及对应的逻辑功能如图3.2所示。
图 3.2指令SUBU
其实现的逻辑功能为:将寄存器编号为RS的寄存器的值减去寄存器编号为RT寄存器的值,并将计算结果的值保存到寄存器编号为RD的寄存器。
3) 指令LH.
指令LH为加载半字,其包含的指令格式以及对应的逻辑功能如图3.3所示。
图 3.3指令LH
其实现的功能为:将编号为BASE的寄存器的值加上0-15位立即数扩展后的32位数之后作为一个地址,并以这个地址访问主存,从主存中读取其值,并将这个值存放到编号为RT的寄存器中。其中设计的立即数的位扩展为有符号扩展。
4) 指令BLEZ.
指BLEZ为小于等于0是跳转。其包含的指令格式以及对应的逻辑功能如图3.4所示。
图 3.4指令BLEZ
其实现的功能为:首先判断编号为RS的寄存器的值,如果该寄存器的值小于等于0,那么将执行将PC的值加上0-15位左移两位并进行32位扩展的值作为新的PC实现跳转指令。
3.1.2 数据通路的实现
本次课程实验所包含的指令有27条MIPS基础指令,以及扩展的4条指令,对于27条基础指令指令不再赘述,主要介绍4条扩展指令。如表 3.1所示。
表 3.1指令系统数据通路表
指令
PC
RF
ALU
DM
R1#
R2#
W#
Din
A
B
OP
Addr
Din
SLLV
pc+4
rs
rt
rd
ALU
R2#
R1#
0000
无
无
SUBU
pc+4
rs
rt
rd
ALU
R2#
R1#
0110
无
无
LH
pc+4
base
无
rt
Memory
R1#
立即数
0101
ALU
无
BLEZ
pc+立即数
rs
无
无
无
无
无
无
无
无
在完成指令系统数据通路表的填写之后,根据列出的数据通路表,进行多指令数据通路的合并输入数,将各个主要功能部件进行连接,根据数据通路合并表的最终结果,对于所有的多输入部件使用多路选择器进行输入选择。最终便可以完成数据通路的搭建单周期 CPU数据通路如图3.5所示。
图 3.5 单周期CPU数据通路(Logism)
3.1.3 控制器的实现
主控制器实现部分主要介绍任务中需要扩展的4条扩展指令,对于MIPS的27条基础指令在组成原理实验中已经做了详细介绍,这里不再赘述,下面主要介绍4条扩展指令的控制的实现以及逻辑关系。
对照表 3.2所示。
表 3.2主控制器控制信号
指令
R
ALUop
MemWrite
MemRead
Din
Branch
SYSCALL
SLLV
LH
BLEZ
SLLV
1
0000
0
0
无
0
0
1
0
0
SUBU
1
0110
0
0
无
0
0
0
0
0
LH
1
0101
0
1
无
0
0
0
1
0
BLEZ
0
无
0
0
无
1
0
0
0
1
根据在Logism实现中得到的各个一位控制信号的表达式,使用控制信号的逻辑表达式动态生成逻辑电路,这里对4条扩展指令的控制信号的逻辑表达式进行举例说明。
1) 控制信号SLLV
控制信号SLLV对应的是逻辑可变左移是一个R型指令,其设计只需要针对其FUNT字段进行设计,对应的逻辑表达式为:~funct5 ~funct4 ~funct3 funct2 ~funct1 ~funct0。该控制信号的作用为选择输入到ALU运算器的Y输入端口的数据来自哪里。SLLV控制信号的逻辑电路图如图3.6所示。
图 3.6控制信号SLLV电路图
SLLV控制信号在MAIN结构图中的位子如图3.7所示
图 3.7控制信号SLLV分布图
2)控制信号LH
控制信号LH对应的是加载半字,该指令需要使用OP字段组成该控制信号的输出,对应的逻辑表达式为:op5 ~op4 ~op3 ~op2 ~op1 op0。该控制信号的作用为是否将数据进行32位扩展。LH控制信号的逻辑电路如图3.8所示。
图 3.8控制信号LH电路图
控制信号LH在MAIN结构中的分布位子如图3.9所示。
图 3.9控制信号LH分布图
3)控制信号BLEZ
控制信号BLEZ对应的是跳转指令,该指令需要使用OP字段组成该控制信号的输出,对应的逻辑结构表达式为:~op5 ~op4 ~op3 op2 op1 ~op0。该控制信号的作用为是否进行跳转操作。BLEZ控制信号对应的逻辑电路图如图3.10所示。
图 3.10控制信号BLEZ电路图
该控制信号在MAIN结构中的分布位子如图3.11所示。
图 3.11控制信号BLEZ分布图
3.2 中断机制实现
3.2.1 硬件设计实现
(1)中断信号的产生。
在本次实验中需要实现3级中断,所使用到的中断信号产生电路是老师所给的参考资料中的中断产生电路,但是需要进行适当改进,将其转换为一个实现同时处理3个中断信号的电路,实现3级中断,由于当中断信号被处理完之后,需要将中断信号清0,则需要设计中断信号的清零位,下面给出中断信号产生电路的具体实现。如图3.12所示。
图 3.12 中断信号产生电路图
对于中断信号的清除需要设置中断清零装置,需要比较当前的优先级已经中断信号的优先级。中断信号的清除如图3.13所示。
图 3.13 中断信号清零电路图
(2)中断信号的筛选。
对于多级中断,当有一系列的中断信号来临时,需要对中断信号进行筛选。优先级高的需要先执行,当有优先级低的中断信号时,需要暂时缓存中断信号,中断信号的筛选电路如图3.14所示。
图 3.14 中断信号筛选电路图
(3)中断返回。
中断返回也是使用软件实现的,中断返回使用的是ERET指令,在物理电路中需要设计一个由ERET指令控制的使能信号,当执行ERET指令时将是使能信号为1,这时将返回一个PC值,该PC值为将要执行的程序的入口地址,这个程序可能是主程序或者是优先级比上一个中断优先级低的中断程序。
图 3.15 中断返回信号电路图
3.2.2 软件设计实现
(1)开关中断。
在本次实验中多级中断的开关中断使用了软件实现,经过与同学的商讨,开关中断还是需要一部分硬件进行,在开关中断中软件部分主要使用MFC0和MTCO指令,硬件中主要是通过使用关中断的使能信号控制中断的开关。开关中断的部分代码如图3.16,图3.17所示。
图 3.16 开关中断软件部分图
图 3.17 开关中断软件部分图
开关中断需要使用的硬件部分的电路图如图3.18所示。
图 3.18 开关中断硬件部分图
(2)保护现场。
不管是单级中断还是多级中断,中断现场的保护是非常重要的中断现场的保护一般使用软件来实现,现场保存主要是将各个寄存器的值进行压栈处理,数据堆栈通常放在数据存储器中。现场保护的实现 如图3.19所示。
图 3.19 保护现场软件部分图
保护现场与其对应的还有回复现场,对于回复现场则是保护现场的逆过程,回复现场的软件部分图如图3.20所示。
图 3.20 恢复现场软件部分图
3.3 流水CPU实现
3.3.1 流水接口部件实现
流水线的接口部件主要是使用一些寄存器组来存放需要使用到的数据和控制信号,主要有5个阶段分别是:IF(取址阶段),ID(译码阶段),EX(执行阶段),MEM(访存阶段),WB(回写阶段)。这些寄存器组的数据宽度不一,因为有的是立即数,有的是地址,有的是控制信号,主要有两类,一类是32位的数据;一类是1位的控制信号。参考资料给的测试文件需要完成的指令包括:addi,ori,sw,syscall。需要设计涵盖这四条指令的理想流水线,同时还要涵盖4条扩展指令。其中的寄存器组需要使用统一的时钟控制信号,因为寄存器组是随时会被使用的,为方便将所有的寄存器的使能端设常数1,又因为当有新的数据来时,寄存器的数据会自动被覆盖,所以将其清0端设为常量0。具体实现如下。
1)IF阶段。
IF阶段又称取指令阶段,该阶段需要缓存的有操作指令,应老师要求可以将PC进行缓存观察。缓存的指令为32位指令,PC也为32位地址,使用两个32位寄存器进行缓存,并且使用同一的时钟和使能端。其对应的寄存器组结构图如图3.21所示。
图 3.21IF/ID寄存器组结构图
2)ID阶段
ID阶段又称译码阶段,在该阶段需要进行缓存的主要是在上一个阶段进行缓存的指令进行译码后的结果,其中的数据不仅包括有主要的总线的数据,还有控制信息。主要有PC,寄存器组R1,R2的输出,以及符号扩展。缓存的32位数据如图3.22所示。
图 3.22 ID/EX寄存器组结构图
还需要缓存的是控制信号,控制信号主要是1位的信号,其中的ALUOP控制信号,其中的ALUOP运算器选择信号主要为4位主要有Regwrite,Alusrc,Memrite,syscall,RW,SLLV,Memtoreg,LH.其对应的逻辑结构图如图3.23所示。
图 3.23 ID/EX寄存器组结构图
3)EX阶段
EX阶段又称执行阶段,来自ID阶段的信号关于ALU的控制信号和数据被使用,已经被使用的控制信号子啊EX阶段不需要再被缓存,但是总线的数据还是需要继续缓存,因为来自总线的数据在下个阶段依然可能被使用。其中32位数据信号主要有来自运算器的结果Result,PC,存储器地址MEMPC,存储器写入数据MEMDIN。如图3.24
图 3.24 EX/MEM寄存器组结构图
还需要缓冲的有控制信号,主要有Regwrite, Memrite,halt,syscall,RW, Memtoreg,LH.其对应的寄存器组结构图如图3.25所示
图 3.25 EX/MEM寄存器组结构图
4)Mem阶段
Mem阶段又称为访存阶段,该阶段完成的主要是对主存储器的访问,在访问主存储器的时候需要使用一些控制指令,已经使用的控制指令在回写阶段不需要保存,主要缓存的信息有访存的结果result,PC,regwrite,halt,RW,Mem/WB对应的寄存器组的结构如图3.26所示。
图 3.26 MEM/WB寄存器组结构图
5)WB阶段
WB又称回写阶段,该阶段需要将最后的数据输入到regfile中,回写的数据主要是写入寄存器中,包括有寄存器的使能信号WE,写入寄存器的编号RW,以及写入的数据RESULT.将对应的数据通路连接到regfile寄存器。具体见MAIN结构图 3.27。
3.3.2 理想流水线实现
理想流水线的的最关键的部分是在接口部件的设计,流水线的设计核心就是实现预用数据的缓存实现部件的并行进行。对于缓存寄存器组的设计在接口部件的实现已经做了详细介绍,这里不在赘述,下面主要介绍理想流水线实现的数据通路如何连接。
理想流水线的数据通路和与前面介绍的单周期的指令的数据通路一样,与单周期CPU指令不同之处在于,使用的数据都经过对应的寄存器组进行缓存,然后再传送到下一个阶段使用,则连接数据通路时有两种选择一是直接在单周期的基础之上删去多余的数据通路,并且将各个阶段对应的寄存器组插入其中,重新连接数据通路,另一种方式是将数据通路重新设计,这将带来很大的工作量,所以我采用的是第一种,但是对于需要完成的指令的数据通路还是需要再走一次。理想流水线的数据通路参考前面的扩展指令的数据通路实现。理想流水线的实现电路图如图3.27。
图 3.27 流水线MIAN电路图
4 实验过程与调试
4.1 测试用例和功能测试
本次综合实验的测试用例主要有课堂中设计的参考用例以及根据自己分配的任务所完成的实验部分的自己编写的测试用例。
对于4条扩展指令的测试编写了一个综合的测试文件测试4条指令的正确运行,这条指令有:SLLV(逻辑可变左移),SUBU(无符号减),LH(记载半字),BLEZ(小于等于0是跳转)。
接着就是单级中断的测试,单级中断的测试程序是在老师给的参考用例上进行改造编写,多级中断也是在其基础之上进行编写,单级中断能正确实现当执行主程序时中断来临可以转向执行对应的中断,并且当执行完中断后能后正确返回到上次执行的主程序的位置。
多级中中断中具有嵌套关系,优先级高的中断能够打断优先级低的中断,优先级低的中断不能打败优先级高的中断,当中断执行时有优先级高的中断来临,则当前中断被打断,转向去执行优先级更高的中断,执行完之后在回到当前中断继续执行。
最后的测试是理想流水线的测试,理想流水线的测试需要首先测试标准测试用例实现在流水线中标准测试用例的周期数为21,接着需要测试扩展指令的测试用例,这个扩展指令是自己编写的为了避免出现冲突现象,这里在测试用例中加入了很多无关指令实现类似气泡的功能。下面具体介绍这些测试用例。
4.1.1 4条扩展指令测试
4条扩展指令的测试情况如下:
(1)SLLV逻辑可变左移
测试如图4.1,图4.2所示。
测试的初始值为6,每次将6进行逻辑左移1位。
图 4.1逻辑可变左移测试图
图 4.2逻辑可变左移测试图
测试结果正确,实现了逻辑可变左移。
(2)SUBU无符号减
测试情况如图4.3,图4.4 所示。
测试的初始值为8,每次将8的值进行减一操作。
图 4.3无符号减测试图
图 4.4无符号减测试图
(3)LH加载半字
测试结果如图4.5,图4.6,图4.7所示。
测试的数据保存在数据存储器中,其中的值如图4.5所示。
图 4.5数据存储器内容图
每次加载半字的数据都是来自数据存储器,加载情况如图4.6,图4.7所示。
图 4.6加载半字测试图
图 4.7加载半字测试图
(4)BLEZ小于等于0时跳转
小于等于0是跳转的初始数据为1,一句小于等于0的判断条件进行跳转,每次跳转进行加1操作。如图4.8,图4.9所示。
图 4.8小于等于0时跳转测试图
图 4.9 小于等于0时跳转测试图
4.1.2 单级中断测试
单级中断程序测试主要执行的程序有主程序(0号),1号中断程序(自己的CCMD),2号中断程序,3号中断程序。 其中的主程序为老师提供的benchmark子程序。
(1)1号中断
首先进入主程序如图4.10。
图 4.10 主程序测试图
当点击1号中断的时候进入1号中断子程序。如图4.11。
图 4.11 1号中断程序测试图
当程序执行完后返回主程序如图4.12所示。
图 4.12 返回主程序测试图
(2)2号中断
点击2号中断,进入2号中断程序。如图4.13所示。
图 4.13 2号中断测试图
当执行完2号中断后返回主程序。如图4.13所示。
图 4.13 2号中断返回主程序测试图
(3)3号中断
当点击3号中断的时候,执行3号中断子程序,如图4.14所示。
图 4.14 3号中断测试图
当执行完3号中断后返回主程序。如图4.15所示。
图 4.15 3号中断返回主程序测试图
4.1.3多级中断
多级中断支持一次输入多个中断号,并根据优先级进行选择执行。输入中断的顺序为1->2->3->1。当执行完1,2,3,1号程序后返回主程序。测试结果如下。
首先进入主程序,如图4.16所示。
图 4.16 多级中断主程序测试图
点击1号中断,进入1号中断子程序。如图4.17所示。
图 4.17 多级中断1号中断测试图
然后点击2号中断,进入2号中断测试程序。如图4.18所示。
图 4.18 多级中断2号中断测试图
然后点击3号中断,进入3号中断测试程序。如图4.19所示。
图 4.19 多级中断3号中断测试图
然后点击1号程序,1号程序显示等待。如图4.20所示。
图 4.20 多级中断1号中断等待测试图
然后返回2号,1号,和主程序,返回2号中断程序如图4.21所示。
图 4.21 多级中断返回2号中断测试图
然后返回1号中断程序,如图4.22所示。
图 4.22 多级中断返回1号中断测试图
最后返回主程序,如图4.23所示。
图 4.23 多级中断返回主程序测试图
4.1.4理想流水线
理想流水线的测试主要包括两个部分,1是老师提供的理想流水线的测试文件,最后的指令周期数为:21,另一个是测试自己的CCMD在理想流水线上是否可用,在测试文件中需要加入一些无关指令起到类似气泡的作用。具体测试如下。
课程提供的测试文件测试如图4.24所示。
图 4.24 理想流水线测试图
接着在理想流水线上跑CCMD,测试结果如图4.25所示。
图 4.25 理想流水线CCMD测试测试图
4.2 主要故障与调试
4.2.1 扩展指令故障
在扩展指令中,由扩展指令参与控制的使能信号,对扩展指令的高低位弄混淆。
故障现象:当执行对应的扩展指令时,对应的使能信号不能正确输出,使得指令不能正确执行。
原因分析:首先我对扩展指令的数据通路进行的重新梳理,发现数据通路没有什么问题,接着对对应指令控制的使能信号的逻辑表达式进行核查发现也没有什么问题,但是当在封装部件中输入真值时,对应的输出并不是正确的,如图4.26所示。
解决方案:将控制信号的逻辑表达式的高低位进行对调即可。
图 4.26扩展指令故障示意图
4.2.2 中断故障
在中断的设计中,没有对中断信号产生装置进行清零操作。
故障现象:当进入一个中断后,这使得中断信号一直存在,不能正确实现多级中断。
原因分析:在中断信号产生电路中只设计了中断信号的产生电路没有设计中断信号的清零操作电路。
解决方案:设计一个中断信号清零电路,当该中断执行完毕,则需要对该中断进行清零操作,消除中断信号。
4.2.3 理想流水线故障
理想流水线中的HALT信号没有正确缓存。
故障现象:当执行理想流水线时,测试理想流水线的测试程序对应的时钟周期数不正确。
原因分析:在检查理想流水线的数据通路没有问题的情况下,发现是因为HALT信号没有正确缓存,因为HALT信号并不是直接来至于指令译码阶段,而是在执行阶段产生的,没有将其缓存。
解决方案:在EX/MEM寄存器组中和MEM/WB中缓存HALT信号。
4.3 实验进度
表 4.1 课程设计进度表
时间
进度
第一天
复习组成原理基本知识,明确任务,制定计划。
第二天
查阅相关资料,根据CCMD的指令格式设计CCMD的数据通路。
第三天
完成扩展指令的设计和实现,编写测试文件进行测试。
第四天
熟悉单级中断知识,开始设计单级中断。
第五天
设计单级中断,编写测试程序。
第六天
测试单级中断,并且调试BUG。
第七天
完成单级中断。
第八天
开始实现多级中断,并调试BUG。完成多级中断。
第九天
设计流水线,完成测试文件的指令。
第十天
添加CCMD指令到理想流水线。完成理想流水线。
5 设计总结与心得
5.1 课设总结
在本次组成原理课程设计实验的总结如下:
1) 本次实验的单周期实现了31条指令,其中包括有27条基础指令以及4条扩展指令,主要有:SLLV(逻辑可变左移),SUBU(无符号减),LH(加载半字),BLEZ(小于等于0时跳转)。
2) 在单周期CPU的基础之上实现了单级中断和多级中断,主程序设置为0,还有3个中断测试程序,分别为1号中断,2号中断,3号中断。
3) 完成了对理想流水线的设计。理想流水线主要有课程提供的测试程序以及分配任务时的扩展指令。
5.2 课设心得
本次课程设计所设计的内容总体来说还是很多的,课程要求的任务量还是很大,虽然没能完成所有的任务,但是还是学到了很多知识,锻炼了自己的能力。
本次课程设计建立在上学期的组成原理实验的基础之上,如果没有上学期的基础直接来做这个课程设计将是相当庞大的一个工程,就是简单的实现27条加4条扩展指令都将耗费大量的时间。但是如果有了组成原理的实验的基础,此次课程设计在一定程度上还是有突破点的。
在设计4条扩展指令时,很好的完成了对上学期组成原理实验课程是衔接,在原理的27条指令的基础之上添加属于自己的4条CCMD将是很容易的,只需要查阅相关资料,明确指令执行的数据通路,需要的控制信号,完成4条扩展指令相对来说还是比较简单的。期间主要是将控制信号的高低位弄混淆耽误了些时间。
对于中断部分,这部分的难度还是相当大的,我想对于大部分同学来说,在这里都花费了很多的时间,主要是单级中断,多级中断的内容很多,需要考虑的情况和处理的数据很多,不仅需要考虑硬件部分,还需要考虑软件部分,使得人摸不着头脑,幸好有老师分享了“关于中断问题的19问”,对我提供了很大的帮助。中断部分需要学习的内容很多在这部分花费了大量的时间,但是通过这部分的实验,使我对中断实现的软硬件机制有了更加深刻的了解。特别是在如何处理多个中断信号,以及信号优先级的设定和中断返回机制有了更加深刻的认识。
理想流水线部分相对来说,还是比较简单,一开始对于流水线的机制没有太明白,不知如何动手,当和同学进行交流之后,明白了流水线的实现机制,很快有了思路,同时也是因为理想流水线实现的指令并不是很多,设计
展开阅读全文