WinDLX 模拟器安装与使用
实验目的
建立实验环境,了解 WINDLX 模拟器的结构及使用。
实验原理
WinDLX 软件包中带有说明文件,供安装程序时候使用。
实验步骤
安装 WinDLX
由于 WinDLX 是一个非常古老的模拟软件,但是我们现在多用 Win10 和 Win11 系统,所以需要使用虚拟机运行该软件。Win11 可以使用 Hyper-V 虚拟化运行方案,其界面如下所示:
![Hyper-V管理器主界面](/2022/10/15/experiments/jizu/installing-and-using-windlx/image_qFbv2Qa_D3.png)
具体启用支持的方法在这里不多说了,之后可以像 VMware 虚拟机一样,添加一个 Windows XP 的系统镜像,并等待虚拟机上操作系统安装的流程走完,即可开始使用。
Hyper-V 无法像 VMware 虚拟机那样直接将文件拖入窗口来复制,但可以先将需要用到的文件制作成 vhd 虚拟硬盘,然后再加载硬盘。
所给定的 WinDLX 文件夹如下所示,我们可以直接双击 WinDLX.exe 来启动软件。
![](/2022/10/15/experiments/jizu/installing-and-using-windlx/image_sPpeg0VgHi.png)
熟悉使用界面
启动软件过后,可以看到一个窗口和六个子窗口,子窗口的名称分别为 Clock Cycle Diagram、Statistics、Breakpoints、Register、Code 和 Pipeline,双击这些子窗口或单击其上方的还原键即可看到子窗口的内容。
![](/2022/10/15/experiments/jizu/installing-and-using-windlx/image_KxjgEY9_X1.png)
要初始化模拟器,可以点击 File 菜单中的 Reset all 菜单项,弹出一个 “Reset DLX” 对话框。然后点击窗口中的 “确认” 按钮即可。
![](/2022/10/15/experiments/jizu/installing-and-using-windlx/image_YEchSWiXz5.png)
要载入文件或代码,需要点击 File 菜单的 Load Code or Data,在以下对话框中,依次选择 Fact.s 和 Input.s 文件,完成后单击 Load,将它们加载到主存中。
注意:要先选择 fact.s 再选择 input.s 文件。程序在内存中出现的顺序很重要。
![](/2022/10/15/experiments/jizu/installing-and-using-windlx/image_XfmJxGPgJb.png)
![现在,单击Load按钮将它们加载到主存中](/2022/10/15/experiments/jizu/installing-and-using-windlx/image_jU6xYnVOwT.png)
成功加载文件后,会提示你重置 DLX,单击 “是”。这样,文件就已经装入到存储器中了。
![](/2022/10/15/experiments/jizu/installing-and-using-windlx/image_zGYcGmsMFa.png)
结合装载的文件,来介绍一下六大窗口的主要功能
Code 代码窗口
在 Code 窗口中,我们能够看到代表存储器内容的三栏信息,从左到右依次为:地址 (符号或数字)、命令的十六进制机器代码和汇编命令。
![](/2022/10/15/experiments/jizu/installing-and-using-windlx/image_N5Tfs32zDs.png)
单击 WinDLX 窗口的 Execute(执行)按钮可以执行装入的程序,可以选择单步执行(Single Cycle,快捷键 F7)或多步执行(Multi Cycles,快捷键 F8)。当单步执行时,也有流水段颜色的区分(IF、ID、intEX、MEM 和 WB)
![](/2022/10/15/experiments/jizu/installing-and-using-windlx/image_OAHMDNAJGN.png)
如果需要多步执行,就在这个对话框中输入要执行的流水数目即可。
![](/2022/10/15/experiments/jizu/installing-and-using-windlx/image_1Zzwpmaorh.png)
Pipeline 流水线窗口
流水线窗口主要显示了 DLX 处理器的内部结构,窗口下标识了 DLX 处理器的五个流水段和浮点操作(加 / 减、乘和除)的单元。
![](/2022/10/15/experiments/jizu/installing-and-using-windlx/image_bphLLi5PTe.png)
在运行指令时,将 Pipeline 窗口放大,即可看到当前与 Code 中所处的时刻相同的指令流水,可以清晰看到不同流水段执行的是哪条指令。
![](/2022/10/15/experiments/jizu/installing-and-using-windlx/image_ar42V_rtMT.png)
Clock Circle Diagram 时钟周期图窗口
Clock Cycle Diagram 窗口主要显示了运行代码时流水线的时空图,时空图反映的是不同时隙内的运行情况。
![](/2022/10/15/experiments/jizu/installing-and-using-windlx/image_mC0USoVaqr.png)
在非空转代码的时候,显示如下:
![](/2022/10/15/experiments/jizu/installing-and-using-windlx/image_bYqORtx7CN.png)
任意双击指令的一行,可以详细看到不同流水段的情况,如下图所示。
![](/2022/10/15/experiments/jizu/installing-and-using-windlx/image_ijbidVFTvq.png)
Register 寄存器窗口
Register 窗口会显示各个寄存器中的内容。
![](/2022/10/15/experiments/jizu/installing-and-using-windlx/image_oSJhNz14hV.png)
Statistic 统计数据窗口
Statistics 窗口提供对运行程序中任何数据的分析,主要包括模拟器中硬件配置的情况。
![](/2022/10/15/experiments/jizu/installing-and-using-windlx/image_ph76EvKYO5.png)
这里包含:
- 整体指令执行情况
- 硬件配置情况
- 暂停次数、百分比和原因分析
- 分支次数和百分比
- Load/Store 指令执行情况
- 浮点指令执行次数和百分比
- trap 发生次数和百分比
Breakpoints 断点窗口
该窗口主要用来观察代码运行的情况。使用前,需要打开 Breakpoints 窗口(首先需要激活 Breakpoints 小窗口才会出现 Breakpoints 菜单项)来设置 breakpoint,这个值代表了指令运行到流水线的哪个阶段就暂停运行。
![](/2022/10/15/experiments/jizu/installing-and-using-windlx/image_5qA1KGdijo.png)
![](/2022/10/15/experiments/jizu/installing-and-using-windlx/image_sM6iUTJGxM.png)
![从菜单中选择Set后,出现Set Breakpoint窗口](/2022/10/15/experiments/jizu/installing-and-using-windlx/image_cgfKBRYSZU.png)
如果选择了 ID 阶段,在 Code 窗口相应行会出现 BID,表示程序执行到取指令 IF 结束译码 ID 开始的时候,程序将中止。
![此时,Breakpoints窗口的显示为地址、中止阶段和当前指令](/2022/10/15/experiments/jizu/installing-and-using-windlx/image_XrK7jIlqPf.png)
WinDLX 可以在多种配置下工作。可以改变流水线的结构和时间要求、存储器大小和其他几个控制模拟的参数。均在 Configuration 菜单中完成配置。
Floating Point Stages 配置窗口
![](/2022/10/15/experiments/jizu/installing-and-using-windlx/image_T_5pLEA9Z3.png)
可以设置加法、乘法和触发的单元数目和延迟。
Memory Size 配置窗口
![](/2022/10/15/experiments/jizu/installing-and-using-windlx/image__EPQPVWZ6k.png)
可以设置存储空间的大小。
其他配置窗口
Configuration 菜单中的还有其他三种配置,它们是:Symbolic addresses、Absolute Cycle Count 和 Enable Forwarding。点击相应菜单项后,在它的旁边将显示一个小钩。
- 最重要的配置项为 Enable Forwarding,指的是启用定向技术,定向技术是指将某个计算结果从其产生的地方直接送到其它指令需要它的地方,可以减少数据冲突引起的停顿。