第 7 章 异常和中断的支持

在前面的几章中,我们已经实现了一个支持46条LoongArch指令的流水线CPU。不过,到目前为止,我们实现的都是指令系统的用户态部分。为了最终可以基于所实现的CPU搭建出一个小型的计算机系统,我们还要逐步添加指令系统中的特权态部分。这一章我们先介绍如何在CPU中支持异常(Exception)和中断(Interrupt)功能。

【本章学习目标】

  • 理解异常和中断的软硬件协调处理机制。
  • 理解精确异常的概念和处理方法。
  • 掌握在流水线CPU中添加异常和中断支持的方法。

【本章实践目标】

本章有两个实践任务(见本章7.1节)。读者可以在学习本章内容的基础上完成这些任务。

7.1 任务与实践

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

  1. 添加系统调用异常支持,参见下面第7.1.1小节。
  2. 添加其他异常与中断支持,参见下面第7.1.2小节。

7.1.1 实践任务12:添加系统调用异常支持

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

  1. 为CPU增加csrrd、csrwr、csrxchg和ertn指令。
  2. 为CPU增加控制状态寄存器CRMD、PRMD、ESTAT、ERA、EENTRY、SAVE0~3。
  3. 为CPU增加syscall指令,实现系统调用异常支持。
  4. 运行exp12对应的func,要求成功通过仿真和上板验证。

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

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

  1. 将所实现CPU的代码更新至mycpu_env/myCPU/目录中。
  2. 修改func配置文件——mycpu_env/func/include/test_config.h,选择exp12的配置,编译。(如果是通过压缩包exp12.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才有完整的内容。(如果是通过压缩包exp12.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重新定制。(如果是通过压缩包exp12.zip获取实验开发环境的,请跳过该步骤。)
  6. 在验证myCPU的工程中运行仿真(进入仿真界面后,直接点击run all),进行功能验证与调试,直至仿真测试通过。
  7. 在验证myCPU的工程中综合实现后生成bit流文件,进行上板验证。(如果无硬件实验平台,请跳过该步骤。)

7.1.2 实践任务13:添加其它异常支持

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

  1. 为CPU增加取指地址错(ADEF)、地址非对齐(ALE)、断点(BRK)和指令不存在(INE)异常的支持。
  2. 为CPU增加中断的支持,包括2个软件中断、8个硬件中断和定时器中断。
  3. 为CPU增加控制状态寄存器ECFG、BADV、TID、TCFG、TVAL、TICLR。
  4. 为CPU增加rdcntvl.w、rdcntvh.w和rdcntid指令。
  5. 运行exp13对应的func,要求成功通过仿真和上板验证。

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

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

  1. 将所实现CPU的代码更新至mycpu_env/myCPU/目录中。
  2. 修改func配置文件——mycpu_env/func/include/test_config.h,选择exp13的配置,编译。(如果是通过压缩包exp13.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才有完整的内容。(如果是通过压缩包exp13.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重新定制。(如果是通过压缩包exp13.zip获取实验开发环境的,请跳过该步骤。)
  6. 在验证myCPU的工程中运行仿真(进入仿真界面后,直接点击run all),进行功能验证与调试,直至仿真测试通过。
  7. 在验证myCPU的工程中综合实现后生成bit流文件,进行上板验证。(如果无硬件实验平台,请跳过该步骤。)