BUAA-CO P7设计文档
设计思路
在P6基础上,进行如下修改。
异常中断
- 添加模块CP0
- 添加指令:eret,syscall,mtc0,mfc0
- mfc0指令激活RegWrite与特殊写使能,t设置为2
- mtc0的t_rt设置为2
- eret对应信号与CP0的EXCClr连接
- 修改各级部件以支持异常检测
- F级:PC错误
- D级:指令错误/syscall
- E级:加减溢出,Load/Store地址范围错误
- 所有异常流入M级的CP0中
- 注意流水的优先级顺序,设置各级fixedExcCode信号
- 修改各级部件以支持异常中断
- F级检测到pc异常,则将IM导入的instr清空
- npc在Req激活时跳转到0x00004180
- 各级pc修改为0x00004180
- 各级流水寄存器清空
- CP0进行若干操作:
- 异常后EPCout设置为受害PC-4(延迟槽指令),或PC
- 中断优先级更高,若检测到中断信号,ExcCode设置为0
系统架构
- 将mips改为CPU,修改input和output信号
- 增加Bridge模块,加入Timer0,Timer1
- 增加新的顶层mips模块,包含CPU,Bridge,Timer0,Timer1模块
测试方法
1 |
|
思考题
- 请查阅相关资料,说明鼠标和键盘的输入信号是如何被 CPU 知晓的?
- 硬件设备生成信号,通过接口控制器传递给CPU,CPU进行中断处理或轮询读取数据。
- 请思考为什么我们的 CPU 处理中断异常必须是已经指定好的地址?如果你的 CPU 支持用户自定义入口地址,即处理中断异常的程序由用户提供,其还能提供我们所希望的功能吗?如果可以,请说明这样可能会出现什么问题?否则举例说明。(假设用户提供的中断处理程序合法)
- 理论上可行。但实际会因为编写代码可能存在的漏洞导致系统的安全性风险增加,稳定性降低。
- 支持动态地址会增加性能和管理的开销。
- 为何与外设通信需要 Bridge?
- 主机和外设之间存在接口标准,速度贷款,数据格式等各种差异,需要Bridge从中进行协调。
- 请阅读官方提供的定时器源代码,阐述两种中断模式的异同,并针对每一种模式绘制状态移图。
- 模式0(单次):减到0后停止,产生一次终端。需软件手动重置才能再次计数。
- 模式1(循环):减到0后自动重装初值,产生周期性中断。
- 倘若中断信号流入的时候,在检测宏观 PC 的一级如果是一条空泡(你的 CPU 该级所有信息均为空)指令,此时会发生什么问题?在此例基础上请思考:在 P7 中,清空流水线产生的空泡指令应该保留原指令的哪些信息?
- 问题:如果中断发生时M级是空泡(PC=0),CP0会保存错误的EPC=0。执行eret返回时 CPU 会跳到0地址,导致崩溃。
- 保留PC信号,确保EPC指向正确的返回地址。
- 为什么 jalr 指令为什么不能写成 jalr $31, $31?
- 读写冲突。jalr需要跳转到$31中的地址,同时将PC+8存入$31,如果源和目的都是$31,写入返回地址(PC+8)的操作可能会覆盖掉目标跳转地址,导致 CPU 跳到了下一条指令而不是目标函数,程序逻辑出错。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 炊煙雲海。!
评论

![[炽吾生平]初雪记](/img/cover_xue.jpg)