第 7 章 异常和中断的支持
在前面的几章中,我们已经实现了一个支持46条LoongArch指令的流水线CPU。不过,到目前为止,我们实现的都是指令系统的用户态部分。为了最终可以基于所实现的CPU搭建出一个小型的计算机系统,我们还要逐步添加指令系统中的特权态部分。这一章我们先介绍如何在CPU中支持异常(Exception)和中断(Interrupt)功能。
【本章学习目标】
- 理解异常和中断的软硬件协调处理机制。
- 理解精确异常的概念和处理方法。
- 掌握在流水线CPU中添加异常和中断支持的方法。
【本章实践目标】
本章有两个实践任务(见本章7.1节)。读者可以在学习本章内容的基础上完成这些任务。
7.1 任务与实践
完成本章的学习后,希望读者能够完成以下2个实践任务:
7.1.1 实践任务12:添加系统调用异常支持
本实践任务要求在实践任务11实现的CPU基础上完成以下工作:
- 为CPU增加csrrd、csrwr、csrxchg和ertn指令。
- 为CPU增加控制状态寄存器CRMD、PRMD、ESTAT、ERA、EENTRY、SAVE0~3。
- 为CPU增加syscall指令,实现系统调用异常支持。
- 运行exp12对应的func,要求成功通过仿真和上板验证。
请参照第2.3.1节中介绍的方式获取本次实践任务所需的实验开发环境。具体的实验环境仍位于 mycpu_env/ 目录下,且仍使用soc_bram/子目录。
实验环境准备就绪后,请参考下列步骤完成本实践任务:
- 将所实现CPU的代码更新至mycpu_env/myCPU/目录中。
- 修改func配置文件——mycpu_env/func/include/test_config.h,选择exp12的配置,编译。(如果是通过压缩包exp12.zip获取实验开发环境的,请跳过该步骤。)
- 打开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获取实验开发环境的,请跳过该步骤。)
- 进入 mycpu_env/soc_verify/soc_bram/run_vivado/ 目录下启动验证myCPU的工程。如果该目录下尚未创建工程,请参照附录D.2节介绍的步骤,利用该目录下的 create_project.tcl 文件创建工程。如需要,请参考附录D.4节进行IP核升级。如果该目录下已有前一实践任务创建过的工程,可以在打开工程后,参照附录D.3节介绍的步骤,更新项目中CPU实现文件的列表。
- 参考第4章4.2.5.2小节,对工程中的inst_ram重新定制。(如果是通过压缩包exp12.zip获取实验开发环境的,请跳过该步骤。)
- 在验证myCPU的工程中运行仿真(进入仿真界面后,直接点击run all),进行功能验证与调试,直至仿真测试通过。
- 在验证myCPU的工程中综合实现后生成bit流文件,进行上板验证。(如果无硬件实验平台,请跳过该步骤。)
7.1.2 实践任务13:添加其它异常支持
本实践任务要求在实践任务12实现的CPU基础上完成以下工作:
- 为CPU增加取指地址错(ADEF)、地址非对齐(ALE)、断点(BRK)和指令不存在(INE)异常的支持。
- 为CPU增加中断的支持,包括2个软件中断、8个硬件中断和定时器中断。
- 为CPU增加控制状态寄存器ECFG、BADV、TID、TCFG、TVAL、TICLR。
- 为CPU增加rdcntvl.w、rdcntvh.w和rdcntid指令。
- 运行exp13对应的func,要求成功通过仿真和上板验证。
请参照第2.3.1节中介绍的方式获取本次实践任务所需的实验开发环境。具体的实验环境仍位于 mycpu_env/ 目录下,且仍使用soc_bram/子目录。
实验环境准备就绪后,请参考下列步骤完成本实践任务:
- 将所实现CPU的代码更新至mycpu_env/myCPU/目录中。
- 修改func配置文件——mycpu_env/func/include/test_config.h,选择exp13的配置,编译。(如果是通过压缩包exp13.zip获取实验开发环境的,请跳过该步骤。)
- 打开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获取实验开发环境的,请跳过该步骤。)
- 进入 mycpu_env/soc_verify/soc_bram/run_vivado/ 目录下启动验证myCPU的工程。如果该目录下尚未创建工程,请参照附录D.2节介绍的步骤,利用该目录下的 create_project.tcl 文件创建工程。如需要,请参考附录D.4节进行IP核升级。如果该目录下已有前一实践任务创建过的工程,可以在打开工程后,参照附录D.3节介绍的步骤,更新项目中CPU实现文件的列表。
- 参考第4章4.2.5.2小节,对工程中的inst_ram重新定制。(如果是通过压缩包exp13.zip获取实验开发环境的,请跳过该步骤。)
- 在验证myCPU的工程中运行仿真(进入仿真界面后,直接点击run all),进行功能验证与调试,直至仿真测试通过。
- 在验证myCPU的工程中综合实现后生成bit流文件,进行上板验证。(如果无硬件实验平台,请跳过该步骤。)