第 6 章 在流水线中添加普通用户态指令

在本章中,我们将介绍如何在已有的简单流水线CPU上添加更多的普通用户态指令。具体包括:

  • 算术逻辑运算类指令slti, sltui, andi, ori, xori, sll, srl, sra, pcaddu12i; ??
  • 乘除运算类指令mul.w, mulh.w, mulh.wu, div.w, mod.w, div.wu, mod.wu; ??
  • 转移指令blt, bge, bltu, bgeu; ??
  • 访存指令ld.b, ld.h, ld.bu, ld.hu, st.b, st.h. ??

【本章学习目标】

  • 加深对流水线结构与设计的理解。
  • 掌握在CPU中增加普通用户指令的方法。

【本章实践目标】

本章有两个实践任务(见本章6.1节)。读者可以在学习本章内容的基础上完成这些任务,两者之间的对应关系如下:

  • ??~??节的内容对应实践任务10(6.1.1节)。
  • ??~??节的内容对应实践任务11(6.1.2节)。

6.1 任务与实践

完成本章的学习后,希望读者能够完成以下2个实践任务:

  1. 算术逻辑运算指令和乘除法运算指令添加,参见下面第6.1.1小节。
  2. 转移指令和访存指令添加,参见下面第6.1.2小节。

6.1.1 实践任务10:算术逻辑运算指令和乘除法运算指令添加

本实践任务要求在实践任务9实现的CPU基础上完成以下工作:

  1. 添加算术逻辑运算类指令slti、sltui、andi、ori、xori、sll、srl、sra、pcaddu12i。
  2. 添加乘除运算类指令mul.w、mulh.w、mulh.wu、div.w、mod.w、div.wu、mod.wu。
  3. 运行exp10对应的func,要求成功通过仿真和上板验证。

请参照第2.3.1节中介绍的方式获取本次实践任务所需的实验开发环境。具体的实验环境仍位于 mycpu_env/ 目录下,且仍使用soc_bram/子目录。

实验环境准备就绪后,请参考下列步骤完成本实践任务:

  1. 将所实现CPU的代码更新至mycpu_env/myCPU/目录中。
  2. 修改func配置文件——mycpu_env/func/include/test_config.h,选择exp10的配置,编译。(如果是通过压缩包exp10.zip获取实验开发环境的,请跳过该步骤。)
  3. 打开gettrace工程——mycpu_env/gettrace/gettrace.xpr。(该Vivado工程中的IP核是使用Vivado2019.2创建的,如果使用更高版本的Vivado打开,请参考附录D.4节进行IP核升级。)运行gettrace工程的仿真(进入仿真界面后,直接点击run all等待仿真运行完成),生成新的参考trace文件golden_trace.txt(mycpu_env/gettrace/golden_trace.txt)。要等仿真运行完成,golden_trace.txt才有完整的内容。(如果是通过压缩包exp10.zip获取实验开发环境的,请跳过该步骤。)
  4. 进入 mycpu_env/soc_verify/soc_bram/run_vivado/ 目录下启动验证myCPU的工程。如果该目录下尚未创建工程,请参照附录D.2节介绍的步骤,利用该目录下的 create_project.tcl 文件创建工程。如需要,请参考附录D.4节进行IP核升级。如果该目录下已有前一实践任务创建过的工程,可以在打开工程后,参照附录D.3节介绍的步骤,更新项目中CPU实现文件的列表。
  5. 参考第44.2.5.2小节,对工程中的inst_ram重新定制。(如果是通过压缩包exp10.zip获取实验开发环境的,请跳过该步骤。)
  6. 在验证myCPU的工程中运行仿真(进入仿真界面后,直接点击run all),进行功能验证与调试,直至仿真测试通过。
  7. 在验证myCPU的工程中综合实现后生成bit流文件,进行上板验证。(如果无硬件实验平台,请跳过该步骤。)

6.1.2 实践任务11:转移指令和访存指令添加

本实践任务要求在实践任务10实现的CPU基础上完成以下工作:

  1. 添加转移指令blt、bge、bltu、bgeu。
  2. 添加访存指令ld.b、ld.h、ld.bu、ld.hu、st.b、st.h。
  3. 运行exp11对应的func,要求成功通过仿真和上板验证。

请参照第2.3.1节中介绍的方式获取本次实践任务所需的实验开发环境。具体的实验环境仍位于 mycpu_env/ 目录下,且仍使用soc_bram/子目录。

实验环境准备就绪后,请参考下列步骤完成本实践任务:

  1. 将所实现CPU的代码更新至mycpu_env/myCPU/目录中。
  2. 修改func配置文件——mycpu_env/func/include/test_config.h,选择exp11的配置,编译。(如果是通过压缩包exp11.zip获取实验开发环境的,请跳过该步骤。)
  3. 打开gettrace工程——mycpu_env/gettrace/gettrace.xpr。(该Vivado工程中的IP核是使用Vivado2019.2创建的,如果使用更高版本的Vivado打开,请参考附录D.4节进行IP核升级。)运行gettrace工程的仿真(进入仿真界面后,直接点击run all等待仿真运行完成),生成新的参考trace文件golden_trace.txt(mycpu_env/gettrace/golden_trace.txt)。要等仿真运行完成,golden_trace.txt才有完整的内容。(如果是通过压缩包exp11.zip获取实验开发环境的,请跳过该步骤。)
  4. 进入 mycpu_env/soc_verify/soc_bram/run_vivado/ 目录下启动验证myCPU的工程。如果该目录下尚未创建工程,请参照附录D.2节介绍的步骤,利用该目录下的 create_project.tcl 文件创建工程。如需要,请参考附录D.4节进行IP核升级。如果该目录下已有前一实践任务创建过的工程,可以在打开工程后,参照附录D.3节介绍的步骤,更新项目中CPU实现文件的列表。
  5. 参考第44.2.5.2小节,对工程中的inst_ram重新定制。(如果是通过压缩包exp11.zip获取实验开发环境的,请跳过该步骤。)
  6. 在验证myCPU的工程中运行仿真(进入仿真界面后,直接点击run all),进行功能验证与调试,直至仿真测试通过。
  7. 在验证myCPU的工程中综合实现后生成bit流文件,进行上板验证。(如果无硬件实验平台,请跳过该步骤。)