实验 5:处理器实验
模板文件
本实验的顶层模块模板:thinpad_top.srcs/sources_1/new/thinpad_top.sv
与前几个实验不同,模板仅为示例代码,因此可能需要在该模板代码中进行大量修改,请大胆进行任何你觉得必要和合理的修改。
实验目的
在本实验之前,同学们已经完成了 ALU 实验、SRAM 实验以及 UART 实验,基本掌握了 Thinpad 平台的使用方法以及各个元器件的时序特性(包括 FPGA 模块、同步的 SRAM 模块以及异步的 UART 模块)。
本实验的目的是在做较为复杂的能够运行监控程序的五级流水线处理器之前,让同学们通过一个简单的处理器设计来对每一条指令的执行有一个直观的感受。本实验的处理器与大实验基本类似,但只需要支持少数的指令即可。本实验的具体目标:
- 加深对 SRAM 和 UART 时序的理解,能够通过一个 Wishbone 总线模块来驱动 SRAM 和 UART 硬件;
- 掌握指令的执行阶段的含义,熟悉执行阶段所需要的信号;
- 理解一个简单程序的执行流程,为后续的大实验打好基础。
实验环境
- 硬件环境:PC 计算机(Windows 10 或者 Linux 操作系统);ThinPAD-Cloud 教学计算机或者云实验平台;
- 软件环境:FPGA 开发工具软件 Vivado;硬件平台的模拟环境(QEMU);RISC-V 的汇编器。
实验内容
设计并实现一个能够运行上述程序的多周期或流水线处理器,运行给定的汇编程序,能够从串口看到输出的效果。上述代码编译生成二进制文件之后通过工具装入到 BaseRAM 里面,启动时从 BaseRAM 的起始地址执行程序,按复位键开始运行。使用 Thinpad 云平台工具,观察程序的输出。
实验原理
本实验是支持多条指令的处理器。具体的多周期和流水线原理请参考计算机组成原理教材、课件和本实验指导书。
需要掌握基本的 CPU 设计方法。若设计流水线 CPU,则需要理解 CPU 中可能存在的结构冲突、数据冲突和控制冲突。对于冲突的处理只需要使用延迟冲突(即插入气泡)处理方法即可,不需要使用其它方式(例如数据旁路)来提高性能。
实验步骤
本实验比较复杂,是一个初步的处理器设计实验,作为设计可以执行监控程序的流水线处理器的铺垫。因此,在做本实验的过程中,需要比较深入理解处理器执行每一条指令的流程。
- 分析所编写的汇编代码,依据每一条指令所需要完成的功能(参考 RISC-V 指令集手册),划分每条指令的执行步骤,设计指令流程图。
- 实现 Wishbone Master,通过总线协议访问 SRAM 和 UART,二者通过不同的地址进行区分。
- 依据单周期的处理器设计方法把所需要的指令都加入到数据通路中,并标记各条线路上的信号名称,引出各条指令所需要的信号。
- 划分处理器的各功能部件和阶段设计,给出处理器的概要结构图,并标识出各主要信号及数据流向、阶段寄存器需要保存的各类信息。
- 细化各功能部件,设计出包含每个部件的外部控制信号以及数据信号的详细结构图,并根据指令流程图在该结构图上执行每条指令,检查指令执行是否正确。若设计流水线 CPU,使用流水线延迟(插入气泡)的方式对流水线冲突进行处理。
- 确认结构图中的每个功能部件的具体功能和外部连接信号,注意时序之间的配合。使用硬件描述语言设计实现每个功能部件并且使用软件进行仿真。仿真过程中尽量将各种情况的输入都加入,保证每个部件能够按照预定功能运行。
- 连接各个功能部件组成整体的 CPU,并对其进行软件仿真。
- 连接各个外设和 CPU 形成计算机系统,并对其进行软件仿真。
- 程序的二进制文件装入到 BaseRAM 中,将设计好的 CPU 装在到 FPGA 中,进行实际硬件调试。
实验数据
- 画出你的 CPU 的结构图,请不要使用 ppt 当中或由 vivado 生成的图片。
- 若设计多周期 CPU,请仿照多周期 CPU 的设计与实现一节给出你的 CPU 的信号表和状态转移表。
- 若设计流水线 CPU,请仿照流水线 CPU 的设计和实现一节给出你的 CPU 的信号表。
- 查看内存数据,观察在对应位置是否写入了最后的结果值,将内存数据截图作为实验报告的一部分。
- 查看串口的输出,将串口输出的截图作为实验报告的一部分。
思考题
- 流水线 CPU 中,用于 branch 指令的比较器既可以放在 ID 阶段,也可以放在 EXE 阶段。放在这两个阶段分别有什么优缺点?
实验报告要求
-
进行仿真,给出跳转时,写入内存和写入串口时的波形图和对应的指令译码情况。
-
完成实验数据部分对应的内容要求。
-
回答思考题。