1、WinDLX 教程刘 依 张晨曦 编译DLX 处理器 (发音为 “DeLuXe“)是 Hennessy 和 Patterson 合著一书Computer Architecture - A Quantitative Approach 中流水线处理器的例子。WinDLX 是一个基于 Windows 的模拟器。本教程通过一个实例介绍 WinDLX 的使用方法。WinDLX 模拟器能够演示 DLX 流水线是如何工作的。本教程使用的例子非常简单,它并没有囊括 WinDLX 的各个方面,仅仅作为使用 WinDLX 的入门级介绍。当你阅读完本教程后,请参考帮助文件。通过按 F1 键,你可以在任何时候获得相关
2、的帮助信息。虽然我们将详细讨论例子中的各个阶段,但你应具备基本的使用 Windows 的知识。现假定你知道如何启动 Windows,使用滚动条滚动,双击执行以及激活窗口。一、安 装WinDLX 包含 windlx.exe 和 windlx.hlp 文件。同时,还需要一些扩展名为.s 的汇编代码文件。在本手册中将使用 fact.s 和 input.s 这两个汇编代码文件。如果你熟悉 Windows 应用程序的安装,那么将 fact.s 和 input.s 拷贝到 WinDLX 文件夹后,你可以直接阅读下一部分。请按以下步骤在 Windows 下安装 WinDLX:1. 为 WinDLX 创建目录
3、,例如 D:WINDLX2. 解压 WinDLX 软件包或拷贝所有的 WinDLX 文件(至少包含 windlx.exe, windlx.hlp, fact.s 和input.s )到这个 WinDLX 目录。二、一个完整的例子我们使用 WinDLX 汇编器中的汇编文件 fact.s ,这个程序计算数(通过键盘输入)的阶乘。这需要用到文件 input.s,它用于接收从键盘输入的数。1. 开始和配置 WinDLX象启动任何Windows应用程序一样,通过双击 WinDLX 图标 启动WinDLX ,将出现一个带有六个图标的主窗口,双击这些图标将弹出子窗口。后面将解释和介绍如何使用每一个窗口。2为
4、了初始化模拟器, 点击File 菜单中的 Reset all 菜单项,弹出一个“Reset DLX”对话框。然后点击窗口中的“确认”按钮即可。WinDLX可以在多种配置下工作。你可以改变流水线的结构和时间要求、存储器大小和其他几个控制模拟的参数。点击 Configuration / Floating Point Stages(点击Configuration打开菜单,然后点击Floating Point Stages菜单项),选择如下标准配置:Count DelayAddition Units: 1 2Multiplication Units: 1 5Division Units: 1 19如果
5、需要,可以通过点击相应区域来改变设置。然后,点击OK 返回主窗口。点击 Configuration / Memory Size ,可以设置模拟处理器的存储器大小。应设置为0x8000,然后,点击 OK 返回主窗口。在 Configuration 菜单中的其他三个配置也可以设置,它们是:Symbolic addresses, Absolute Cycle Count 和 Enable Forwarding。 点击相应菜单项后, 在它的旁边将显示一个小钩。 2. 装载测试程序在开始模拟之前,至少应装入一个程序到主存。为此,选择File / Load Code or Data,窗口中会列出目录中所有
6、汇编程序。 我们在前面已经提到,fact.s 计算一个整型值的阶乘; input.s中包含一个子程序,它读标准输入(键盘)并将值存入DLX处理器的通用寄存器R1中。按如下步骤操作,可将这两个文件装入主存。 点击 fact.s 点击 select 按钮 点击 input.s 点击 select按钮 点击 load按钮选择文件的顺序很关键,它决定了文件在存储器中出现的顺序。对话框中会显示信息“File(s) loaded successfully. Reset DLX?”,点击“是(Y)” 按钮确认。这样,文件就已被装入到存储器中了。 现在可以开始模拟工作了。3. 模 拟在主窗口中,你可以看见六个
7、图标,它们分别为“ Register”,“ Code”,“ Pipeline”,“Clock Cycle Diagram”,“ Statistics” 和“ Breakpoints”。点击其中任何一个将弹出一个新窗口(子窗口)。在模拟过程中将介绍每一个窗口的特性和用法。(1) Pipeline 窗口我们首先来看一下DLX处理器的内部结构。为此,双击图标Pipeline,出现一个子窗口,窗口中用图表形示显示了DLX的五段流水线。你应尽可能地扩大此窗口,以便处于不同流水段的指令都能够在图表中显示。 3此图显示DLX 处理器的五个流水段和浮点操作 (加 / 减, 乘和除)的单元。(2) Code 窗
8、口我们来看一下 Code 窗口。双击图标,你将看到代表存储器内容的三栏信息,从左到右依次为:地址 (符号或数字)、命令的十六进制机器代码和汇编命令。 $TEXT 0x20011000 addi r1,r0,0x1000main+0x4 0x0c00003c jal InputUnsigned现在,点击主窗口中的 Execution开始模拟。在出现的下拉式菜单中,点击Single Cycle或按 F7键。这时,窗口中带有地址“$TEXT ”的第一行变成黄色。按下 F7 键,模拟就向前执行一步,第一行的颜色变成橘黄色,下一行变成黄色.。这些不同颜色指明命令处于流水线的哪一段。如果Pipeline窗
9、口已经关闭,请双击相应图标重新打开它。 如果窗口足够大,你能够看到命令“jal InputUnsigned”在 IF段,“addi r1, r0, 0x1000 ”在第二段ID。其他方框中带有一个“X”标志,表明没有处理有效信息。再次按下F7键,代码窗口中的颜色会再改变, 红色表明命令处入第三段 “intEX”。 再按下F7,图形显示将变为:在代码窗口中,黄色出现在更下面的位置,并且可能是唯一彩色行。查看一下Pipeline窗口,你会发现IF, intEX 和MEM 段正在使用而ID 段没有。为什么?(3) Clock Cycle Diagram 窗口使所有子窗口图标化,然后打开Clock C
10、ycle Diagram 窗口。它显示流水线的时空图。4在窗口中,你将看到模拟正在第四时钟周期,第一条命令正在MEM段,第二条命令在intEX段,第四条命令在IF段。而第三条命令指示为“aborted“。其原因是 :第二条命令(jal)是无条件分支指令, 但只有在第三个时钟周期, jal 指令被译码后才知道,这时,下一条命令movi2fp已经取出,但需执行的下一条命令在另一个地址处,因而,movi2fp的执行应被取消,在流水线中留下气泡。jal 的分支地址命名为“InputUnsigned“。为找到此符号地址的实际值,点击主窗口中的Memory和 Symbols,出现的子窗口中显示相应的符号和
11、对应的实际值。在 “Sort:“区域选定“name “,使它们按名称排序,而不是按数值排序。数字后的“G“代表全局符号, “L“代表局部符号。“input“中的“InputUnsigned“ 是一个全局符号,它的实际值为0x144 ,用作地址。点击OK 按纽关闭窗口。再一次点击 F7 ,第一条命令( addi)到达流水线的最后一段。如果想了解某条命令执行后处理器内部会发生什么?你只要对准Clock cycle diagram窗口中相应命令所在行,然后双击它,弹出一个新窗口。窗口中会详细显示每一个流水段处理器内部的执行动作。这个窗口“Information about .“ 作为将来的Infor
12、mation 窗口。观察完后,点击 OK按钮关闭窗口。双击第三行(movi2fp),你会看到它只执行了第一段(IF), 这是因为出现跳转而被取消。(双击Code窗口中的某一行或者Pipeline 窗口中的某一段,同样可以Information 窗口。)(4) Breakpoint 窗口当通过Code 窗口观察代码时 (如果未打开,双击图标 Code),你会看到接下来的几条指令几近一样,它们都是sw-操作:将寄存器中的数写入存储器中。重复按F7 将很枯燥,因此,我们使用断点加快此过程。现在,请指向Code 窗口中包含命令trap 0x5的0x0000015c行,此命令是写屏幕的系统调用。单击命令
13、行,然后点击主窗口菜单Code,单击Set Breakpoint (确保命令行仍被标记!),将弹出一个新的“Set Breakpoint“ 窗口。通过此窗口,你可以选择命令运行到流水线的哪一阶段时,程序停止执行。缺省为ID 段。点击 OK 关闭窗口。在Code 窗口中, trap 0x5行上出现 了“BID“ ,它表示当本指令在译码段时,程序中止执行。如果想查看已定义的断点,你只要单击图标Reakpoints,将弹出一个小窗口,其中显示了所有断点。重新使窗口图标化。现在你只要点击Execution / Run 或按F5,模拟就继续运行。会出现一个对话框提示你 “ID-Stage: reache
14、d at Breakpoint #1“,按“确认”按钮关闭。点击Clock cycle diagram窗口中的trap 0x5行,你将看到模拟正处于时钟周期14。trap 0x5行如下所示:原因是:无论何时遇到一条trap指令时,DLX 处理器中的流水线将被清空。在Information 窗口(双击trap行弹出)中,在IF 段显示消息“3 stall(s) because of Trap-Pipeline-Clearing!“。 (不要忘了按OK关闭窗口)。指令trap 0x5 已经写到屏幕上,你可以通过点击主窗口菜单条上的Execute / Display DLX-I/O来查看。5(5)
15、Register 窗口为进一步模拟,点击Code 窗口,用箭头键或鼠标向下滚动到地址为0x00000194的那一行(指令是lw r2, SaveR2(r0)),点击此行,然后按Ins键,或点击Code / Set Breakpoint / OK, 在这一行上设置一个断点。采用同样的方法,在地址0x000001a4(指令jar r31)处设置断点。现在按F5继续运行。这时,会弹出DLX-Standard-I/O 窗口,在信息“An integer value 1: “后鼠标闪烁,键入20 然后按 Enter,模拟继续运行到断点 # 2 处。 在Clock cycle diagram 窗口中,在指
16、令之间出现了红和绿的箭头。红色箭头表示需要一个暂停,箭头指向处显示了暂停的原因。R-Stall (R-暂停)表示引起暂停的原因是 RAW。绿色箭头表示定向技术的使用。现在我们来看一下寄存器中的内容。为此,双击主窗口中的Register 图标。Register 窗口会显示各个寄存器中的内容。看一下R1到 R5的值。按F5使模拟继续运行到下一个断点处,有些值将发生改变,指令lw从主存中取数到寄存器中。如果你希望不设置断点,而使模拟继续进行。办法是:点击Execute / Multiple Cycles 或者按 F8键,在新出现的窗口中输入17 ,然后按 Enter键,模拟程序将继续运行17 个时钟
17、周期。向上滚动Clock cycle diagram 窗口,直到看到指令周期72到78 。在EX段,两个浮点操作(multd and subd)分别在不同的部件上运行,它们都需要多个周期才能结束。因而在它们之后的下一条指令能取指,译码和执行,然后暂停一个周期以允许subd完成MEM 段。(6) Statistics 窗口最后我们来看一下Statistics 窗口。按F5使程序完成执行,出现消息“Trap #0 occurred“ 表明最后一条指令 trap 0 已经执行, Trap指令中编号“0”没有定义,只是用来终止程序。双击图标Statistics。Statistics 窗口提供各个方面的
18、信息:模拟中硬件配置情况、暂停及原因、条件分支、 Load/Store指令、浮点指令和traps。窗口中给出事件发生的次数和百分比,如RAW stalls:17(7.91 % of all Cycles)。在静态窗口中我们可以比较一下不同配置对模拟的影响。现在我们看一看定向的作用。在前面的模拟过程中,我们采用了定向。如果不采用定向,执行时间将会怎样呢?我们先看一下Statistics 窗口 中的各种统计数字:总的周期数(215) 和暂停数 (17 RAW, 25 Control, 12 Trap; 54 Total) ,然后关闭窗口。点击 Configuration中的Enable Forwa
19、rding使定向无效(去掉小钩),打开断点Breakpoints 图标并点击Breakpoints 菜单,删除所有断点,然后按F5 ,键入20后,按Enter ,模拟程序一直运行到结束。重新查看静态窗口,你会看到控制暂停和 Trap 暂停仍然是同样的值,而RAW暂停从17变成了53,总的模拟周期数增加到 236。利用这些值,你能够计算定向技术带来的加速比:236 / 215 = 1.098DLXforwarded比 DLXnot forwarded 快9.8%。三、结束语本教程通过一个例子介绍了 WinDLX 的重要特性,使你对流水线和 DLX 的操作类型有了一定的了解。当然,你还必须学习更多的知识,才能更深入地了解 WinDLX。请参阅“帮助” (Help 菜单) ,你将会获得所有的细节。