在上一篇中,运行了一个测试程序,但是对于运行的结果以及那么多窗口每个窗口表示的含义还并不明确,所以本篇就来分析一下这些内容。
上一篇:WinMIPS64工具进行MIPS指令集实验(一)
地址:https://blog.csdn.net/SweeNeil/article/details/89466463
在上一篇我们最后得出了如下的运行结果,可以看到winmips64是以六个窗口来进行展示的,这六个窗口分别是:Pipeline, Code, Data, Registers, Statistics, Cycles。
实际上,在winmips64主窗口中,其实是有七个子窗口,和一条在底部的状态栏。这七个子窗口分别是Pipeline, Code, Data, Registers, Statistics, Cycles和Terminal。
但是好像我们最开始并没有找到Terminal窗口,那么它隐藏在哪里呢,我们再仔细看看上图中的左下角,发现其实还有一个窗口,它就是Terminal窗口,只是最开始它没有像另外六个窗口那样显眼:
我们可以把这个窗口放大:
了解了winmips64有7个子窗口,现在就开始一个一个揭开它们神秘的面纱。
Pipeline window 显示了mips64处理器的五级流水线(IF、ID、EX、MEM、WB)和浮点运算(加、减、乘、除)的单元示意图。它展示出了流水线的每个阶段中都有哪些指令。
可以看到我们现在处于取指(IF)阶段的是 lw,此时它对应着:
lw r5,0(r1)
处于译码(ID)阶段的是 daddi ,此时对应着:
daddi r4,r0,6
处于执行(EX)阶段的是daddi,此时对应着:
daddi r3,r0,c
处于访存(MEM)阶段的是 daddi,此时对应着:
daddi r2,r0,b
处于回写(WB)阶段的是 daddi,此时对应着:
daddi r1,r0,a
在接下来的窗口中,将会看到更多与之相关的内容,例如即将讲解的Cycles Window。
Cycles Window 它显示流水线的时空图,在窗口中,我们使用了Multi Cycle模式运行,模拟正在第五时钟周期,第一条指令正在WB段,第二条命令在Mem段,第三条指令处在EX段,第四条命令在处于ID段,第五条指令处于IF段。
使用快捷键继续执行,执行结果如下图所示,可以看到在有的周期,指令会处于停滞状态,我们可以看到最下面的两条指令:
daddi r4,r4,-1
bnez r4,Loop
上述第二条指令会用到第一条指令 r4 寄存器中的值,但在这个时候 r4 寄存器中的值并不可用,所以必须等待 r4 寄存器的值可用才可继续往下执行,因此出现了停滞。这种情况也被称为 Data Hazards,有的翻译为 数据冒险。
同时我们可以看到,Cycles Window 又分为了两个子窗口,左边的子窗口是一系列的指令,右边的窗口是图示的指令执行过程。其中,左边子窗口的命令是动态出现的,当一条指令在进行“取值”时,该指令才出现,而且,当出现了 Data Hazards 的时候,所涉及到的指令会变色,暂停的指令会变成蓝色(如上图的:bnez r4,Loop ),而被其影响的后续指令会变成灰色。
Registers Window 显示存储在寄存器中的值。如果寄存器显示为灰色,则它正在被指令写入(如上图中的R4寄存器)。如果它用一种颜色表示,那么就代表,该颜色所代表的的流水线阶段的值可以用来进行前递(forwarding)。同时,Registers Window允许交互更改那些不在写入或转发过程中的64位整数和浮点寄存器的内容。
我们可以看到 Registers Window 中直接显示出了各个寄存器的值。
双击要更改的注册表,弹出窗口将询问是否有新内容,如下图所示,按“OK”便可确认更改。
Statistics Window 用来记录一些模拟周期的统计数据。其中包括Execution,Stalls,和Code Size三个大项。
(1)Execution 用来显示模拟周期中指令数,执行周期数和CPI(每条指令所用周期数)。可以看到此时运行了22个周期,13条指令,现在的CPI为1.692。
(2)Stalls 用来表示暂停的周期数,并且分门别类的进行了统计,其中包括RAW Stalls,WAW Stalls,WAR Stalls, Structural Stalls, Branch Taken Stalls和Branch misprediction Stalls。
在现在的程序中只有 7 个RAW Stalls
(3)Code Size 表示了代码的大小,用byte表示,在这里为64Bytes。
Data Window 可以观察到内存中的数据,包括数据内容和地址两个方面,其中地址使用64位表示。
如果想改变一个整型的数据的值,左键双击该值所在的行,如果是想改变一个浮点类型的数据的值,那么请右键双击该值所在的行,如下图所示,直接可以进行修改。
在上面的 Data Window 中,左边一行即为用64位表示的内存地址,中间行为数据的内容,右边的一行为相关的代码。
Code Window 显示了三栏信息,从左到右依次为:
1)字节地址,
2)十六进制机器代码,
3)汇编语言语句。
从上图中可以看到,有的行被不同的颜色标识,这些不同的颜色代表指令分别处于不同的流水线阶段。黄色代表“取指(IF)”,蓝色代表“译码(ID)”,红色代表“执行(EX)”,绿色代表“内存数据读或写(MEM)”,紫色代表“写回(WB)”。
现在指令:
bnez r4,Loop
处于译码(ID)状态。
指令:
daddi r4,r4,-1 ; i++
处于写回(WB)状态。
指令:
end: halt
处于取指(IF)状态。
Code Window 结合 Cycles Window就可以更加直观的了解现在这个周期的运行情况:
Terminal Window 模拟具有有限图形功能的I/O设备。
在这里我们的Terminal 为空,没有输出。
结合这几个窗口的内容,我们将运行的结果进行了了解,通过这些窗口就可以很好地了解MIPS指令的运行特性。