流水线模型机实验
一、实验目的
1. 加深对计算机流水线基本概念的理解。
2. 熟练掌握MIPSsim模拟器的操作和使用方法。
3. 理解MIPS结构如何用5段流水线来实现,理解各段的功能和基本操作。
4. 定义五条机器指令,编写相应微程序并具体上机调试。
二、实验环境
MIPSsim模拟器
三、实验原理及说明
1、MIPSsim使用手册
(1)启动模拟器
双击MIPSsim.exe,即可启动该模拟器。
模拟器启动时,自动将自己初始化为默认状态。
当模拟器工作在非流水方式下(配置菜单中的“流水方式”前没有“√”号)时,下面叙述中有关流水段的内容都没有意义,应该忽略之。
(2)MIPSsim的窗口
在流水方式下,模拟器主界面中共有7个子窗口,它们是:代码窗口、寄存器窗口、流水线窗口、时钟周期图窗口、内存窗口、统计窗口和断点窗口。每一个窗口都可以被收起(变成小图标)、展开、拖动位置和放大/缩小。当要看窗口的全部内容时,可以将其放大到最大。
在非流水方式下,只有代码窗口、寄存器窗口、内存窗口和断点窗口。
①代码窗口
代码窗口给出内存中代码的列表,每条指令占一行,按地址顺序排列。每行有5列(当全部显示时):地址、断点标记、指令的机器码、流水段标记和符号指令。如图1所示。:

图1
图中不同抹色的行代表相应的指令所处的执行段。黄色代表IF段,绿色代表ID段,红色代表EX段,青色代表MEM段,棕色代表WB段。
②寄存器窗口
寄存器窗口显示MIPSsim模拟器中的寄存器的内容。共有4组寄存器:通用寄存器、浮点寄存器、特殊寄存器和流水寄存器,分为4栏来显示。每一栏下分别有各自的数据格式选项,如如图2所示。

图2
通用寄存器
MIPS64有32个64位通用寄存器:R0,R1,…,R31。它们被简称为GPRs(General-Purpose Registers),有时也被称为整数寄存器。R0的值永远是0。
通过数据格式选项,可以选择显示的格式是十进制还是十六进制。
浮点寄存器
共有32个64位浮点数寄存器:F0,F1,…,F31。它们被简称为FPRs(Floating-Point Registers)。它们既可以用来存放32个单精度浮点数(32位),也可以用来存放32个双精度浮点数(64位)。存储单精度浮点数(32位)时,只用到FPR的一半,其另一半没用。
特殊寄存器
③流水线窗口
流水线窗口显示流水线在当前配置下的组成以及该流水线的各段在当前周期正在处理的指令。如图3所示。
非流水方式下,没有该窗口。

图3
在该窗口中,每一个矩形方块代表一个流水段,它们用不同的颜色填充。在该窗口的左侧是IF到WB段,其右边为浮点部件。浮点部件分有浮点加法部件(fadd)、浮点乘法部件(fmul)和浮点除法部件(fdiv)三种。在菜单“配置”“常规配置”中修改浮点部件个数,可看到该窗口中对应类型的浮点部件个数会发生相应的变化。
在运行过程中,各段的矩形方块中会显示该段正在处理的指令及其地址(16进制)。当双击某矩形方块时,会弹出窗口显示该段出口处的流水寄存器的内容(16进制)。
④时钟周期图窗口
该窗口用于显示程序执行的时间关系,画出各条指令执行时所用的时钟周期。非流水方式下,没有该窗口。
以窗口左上为原点,横轴正方向指向右方,表示模拟器先后经过的各个周期(列),纵轴正方向指向下方,表示模拟器中先后执行的各条指令(行)。如图4所示。

图4
(3)MIPSsim的菜单
①文件菜单
文件菜单如图5所示:

图5
载入程序
将模拟器要执行的程序载入模拟器的内存。这个程序可以是汇编程序(.s文件),也可以是汇编后的代码(.bin文件)。点击该菜单后,系统将弹出“载入”对话框,选择要载入的文件,然后点击“打开”。如果是.s文件,系统会对该文件进行汇编。若汇编过程无错误,则将产生的二进制代码载入至模拟器的内存;若有错误,则报告错误信息。如果是.bin文件,则直接将该文件的内容载入到模拟器内存。
②执行菜单
该菜单提供了对模拟器执行程序进行控制的功能。在下面的执行方式中,除了单步执行,当遇到断点或者用户手动中止(用“中止”菜单项)时,模拟器将立即暂停执行。
在流水方式下,执行菜单如图6所示:

图6
单步执行一个周期
执行一个时钟周期,然后暂停。其快捷键为F7。该菜单仅出现在流水方式下。
撤销上一个周期
模拟器回退一个时钟周期,即恢复到执行该周期之前的状态。其快捷键为F8。该菜单仅出现在流水方式下。
执行多个周期
执行多个时钟周期,然后暂停。点击该菜单后,系统会弹出一个小对话框,由用户指定要执行的周期的个数。该菜单仅出现在流水方式下。
2、相关原理
流水线的基本原理是把一个重复的过程分解为若干个子过程,前一个子过程为下一个子过程创造执行条件,每一个过程可以与其它子过程同时进行。流水线各段执行时间最长的那段为整个流水线的瓶颈,一般地,将其执行时间称为流水线的周期,如图7所示。

图7
取指令(IF):利用PC中的地址从存储器中读取指令,然后将指令放入IF/ID流水线寄存器中。
指令译码和寄存器堆的读取(ID):IF/ID流水线寄存器中的指令包括用于读取寄存器的两个寄存器号和用于符号扩展的16位立即数。读出的两个寄存器值和符号扩展后的32位立即数都存放在ID/EX流水线寄存器中。
指令执行或地址计算(EX):指令执行或地址计算,并将结果存放在EX/MEM流水线寄存器中。
存储器访问(MEM):根据EX/MEM中的有效地址读取数据。值得注意的是,需要写入寄存器的数据在较早的流水级中已经读取并存放在ID/EX中。在MEM级获得这个数据的唯一方法是把数据放入EX步骤中的EX/MEM流水线寄存器中,这一过程与将有效地址放入EX/MEM流水线中类似。
写回(WB):在寄存器堆写信号有效时,将数据写入目的寄存器。sw指令在回写步骤不用做任何事。
四、实验步骤
1、启动MIPSsim(用鼠标双击MIPSsim.exe)。
2、点击“配置”→“流水方式”,使模拟器工作在非流水方式下。
4、选择“文件”→“载入程序”选项,加载样例程序alltest.asm,然后查看“代码”窗口,查看程序所在的位置(起始地址为0x00000004)。
5、查看“寄存器”窗口PC寄存器的值:[PC]=0x。
6、执行load和store指令。步骤如下:
(1)单步执行一条指令(F7)。
(2)单步执行1条指令(F7)。
(3)查看R1的值,[R1]=0x 。(十六进制显示)
(4)单步执行1条指令。
(5)查看R1的值,[R1]=0x 。
(6)单步执行3条指令。
7、执行算术运算类指令。步骤如下:
(1)双击“寄存器”窗口里的R1,将其值修改为2。
(2)双击“寄存器”窗口里的R2,将其值修改为3。
(3)单步执行1条指令。
(4)下一条指令地址为0x ,是一条加法指令。
(5)单步执行1条指令。
(6)查看R3的值,[R3]=0x 。
(7)下一条指令地址为0x ,是一条乘法指令。
(8)单步执行1条指令。
(9)查看LO、HI的值,[LO]=0x ,[HI]=0x。
8、执行逻辑运算类指令。步骤如下:
(1)双击“寄存器”窗口里的R1,将其值修改为0xFFFF0000。
(2)双击“寄存器”窗口里的R2,将其值修改为0xFF00FF00。
(3)单步执行2条指令。
(4)查看R3的值,[R3]=0x____________________。
9、选择配置菜单中的“流水方式”,使模拟器工作于流水方式下。
10、观察程序在流水线中的执行情况,步骤如下:
(1)选择MIPSsim的“文件”→“载入程序”选项来加载pipeline.s(在模拟器所在文件夹下的“样例程序”文件夹中)。
(2)关闭定向功能。这是通过在“配置”→“定向”(使该项前面没有“√”号)来实现的。
(3)用单步执行一周期的方式(“执行”菜单中)或用F7执行该程序,观察每一周期中,各段流水寄存器内容的变化、指令的执行情况(“代码” 窗口)以及时钟周期图。