跳转至

实验5 处理器实验

实验5:处理器实验

处理器实验目的

在本实验之前,同学们已经完成了ALU实验、SRAM实验以及UART实验,基本掌握了Thinpad平台的使用方法以及各个元器件的时序特性(包括FPGA模块、同步的SRAM模块以及异步的UART模块)。

本实验的目的是在做较为复杂的能够运行监控程序的五级流水线处理器之前,让同学们通过一个简单的处理器设计来对每一条指令的执行有一个直观的感受。本实验的处理器与实验6基本类似,但只需要支持少数的指令即可。本实验的具体目标:

  1. 加深对SRAM和UART时序的理解,能够通过一个模块来同时驱动SRAM和UART硬件;

  2. 掌握指令的执行阶段的含义,熟悉执行阶段所需要的信号;

  3. 理解一个简单程序的执行流程,为后续的实验6打好基础。

实验环境

  1. 硬件环境: PC计算机(Windows10或者Linux操作系统); THINPAD-Cloud教学计算机或者云实验平台;

  2. 软件环境: FPGA开发工具软件Vivado; 硬件平台的模拟环境(QEMU); RISCV的汇编器。

实验内容

本实验分为两个部分:

① 首先使用汇编语言编写一段程序,完成如下的功能:

a)计算从1加到100的结果(必须使用循环);

b)将结果存入地址BaseRAM 的 0x100 偏移处;

c)从串口中输出\"done!\"。程序的最后一部分是死循环,用下面的指令来实现:

end:
    beq   zero, zero, end

由于是一个裸程序,这个程序没有操作系统和运行时的支持,在输出的时候必须依赖于 UART 进行输出。参考监控程序的做法,可以通过往 0x10000000 写入数据来达到往串口输出的目的,即可以通过 SB 指令来达到输出的目的。注意,在编写代码的时候要尽可能少使用不同的指令,这样可以减少处理器需要支持的指令的数目。

② 设计并实现一个能够运行上述程序的流水线处理器(或者多周期处理器),运行上述程序,能够从串口看到输出的效果。上述代码编译生成二进制文件之后通过工具装入到 BaseRAM 里面,启动时从 BaseRAM 的起始地址执行程序,按复位键开始运行。使用 Thinpad 云平台工具,观察程序的输出。

实验原理

本实验是支持多条指令的流水线处理器,指令的条数依据同学们编写的程序来定。按照教科书的要求,将每一条指令划分为取指、译码、执行、访存、写回五个阶段。具体的流水线原理请参考计算机组成原理教材和本实验指导书关于 ThinPAD-Cloud 实验平台的详细介绍。

实验重点在于流水线 CPU 的设计,实验前请注意对流水线技术进行重点掌握。需要掌握基本的设计方法,理解 CPU 中可能存在的结构冲突、数据冲突和控制冲突。对于冲突的处理只需要使用延迟冲突(即插入气泡)处理方法即可,不需要使用其它方式(例如数据旁路)来提高性能。

主要实验步骤

本实验比较复杂,是一个初步的处理器设计实验,作为设计可以执行监控程序的流水线处理器的铺垫。因此,在做本实验的过程中,需要比较深入理解处理器执行每一条指令的流程。

(1)依据本实验需要达到的目标编写汇编语言代码,并编译生成二进制文件;这个二进制文件在模拟器上通过调试运行,可以正确进行计算和输出结果;另外,在编写汇编代码的时候不用担心代码过长,但是要尽量减少不同指令的使用,将所使用的不同指令限制在 10 条以内为宜,以降低所需要实现的处理器的工作量。

(2)分析所编写的汇编代码,依据每一条指令所需要完成的功能(参考 RISCV 指令集手册),划分每条指令的执行步骤,设计指令流程图。

(3)在前面的实验中,分别对 SRAM 以及 UART 进行独立控制。但是,在实验平台上,这两个器件的数据总线是共享的(BASE_RAM 的低 8 位)。由于本实验(以及实验6)需要同时使用 SRAM 和 UART,因此需要用同一套逻辑对共享的数据总线进行控制和处理。这部分也是实验的一个重点。由于串口占用一段不同的地址空间,在控制器中可以依据不同的目标地址区分使用 SRAM 和 UART。

(4)依据单周期的处理器设计方法把所需要的指令都加入到数据通路中,并标记各条线路上的信号名称,引出各条指令所需要的信号。

(5)划分处理器的各功能部件和流水线阶段设计,给出处理器的概要结构图,并标识出各主要信号及数据流向、阶段寄存器需要保存的各类信息。

(6)细化各功能部件,设计出包含每个部件的外部控制信号以及数据信号的详细结构图,并根据指令流程图在该结构图上执行每条指令,检查指令执行是否正确。另外,设计使用流水线延迟(插入气泡)的方式对流水线冲突进行处理。

(5)确认结构图中的每个功能部件的具体功能和外部连接信号,注意时序之间的配合。使用硬件描述语言设计实现每个功能部件并且使用软件进行仿真。仿真过程中尽量将各种情况的输入都加入,保证每个部件能够按照预定功能运行。

(6)连接各个功能部件组成整体的 CPU,并对其进行软件仿真。

(7)连接各个外设和 CPU 形成计算机系统,并对其进行软件仿真。

(8)程序的二进制文件装入到 BaseRAM 中,将设计好的 CPU 装在到 FPGA 中,进行实际硬件调试。

本实验可以使用多周期,也可以使用流水线。如果决定使用多周期来完成本实验,请参考课堂中讲解的多周期处理器的原理和代码(代码见网络学堂-课程文件)。

实验数据

① 查看内存数据,观察在对应位置是否写入了最后的结果值,将内存数据截图作为实验报告的一部分。

② 查看串口的输出,将串口输出的截图作为实验报告的一部分。


最后更新: 2021年10月30日