P7-design-document

P7-Design-Document 0.顶层设计概述 ​ P7要求为实现MIPS微系统,需要为P6实现的流水线CPU添加异常中断功能,并封装为CPU模块、实现系统桥Bridge、计时器Timer1,Timer2等模块,最终形成MIPS微系统,如下图所示。 绿色虚线表示已经实现 紫色虚线表示新增部分 红色虚线为改变后的DM接口 P7需要实现的任务如下列表 任务 解释 计时器 课程组提供代码 系统桥 为CPU提供统一的访问外设的接口,自行实现 协处理器CP0 设置CPU的异常处理功能,反馈CPU的异常信息,自行实现 内部检测异常与流水 CPU检测内部指令执行错误 外部中断响应 CPU需要具有响应外部中断信号的能力 异常处理指令 异常处理程序中,会有一些特殊的指令需要实现 单周期CPU的封装 让CPU从外部看上去是单周期CPU 异常处理程序 利用MARS编写简单的异常处理程序进行测试 施工步骤: 更改流水线各级使之可以产生异常 添加CP0处理异常 添加Bridge与两个外设 异常与中断 异常:内部异常 如F级取指异常、D级计算溢出等 中断:来自外部设备,Timer0,Timer1,Interrupt 来自外部设备的中断比内部异常优先级更高 一.功能部件设计 0.新增指令的实现思路 P7中增加四条指令 mtc0 mfc0 eret syscall mtc0 :写入CP0中寄存器(12/14) 对于mtc0和mfc0指令 : 读取的CP0寄存器地址均为rd域,由于本实现中采用了集中式译码,故增加数据通路,将原指令的rd域流水下去,作为CP0寄存器地址, CP0_addr 指令格式 : 010000 || 00100 || rt || rd || 00000000000 mtc0 rt,rd MCU : CP0_WE_D T_rs_use = T_rt_use = 3(这里rt的真实使用时间是3,但是并不会对暂停/转发造成影响,Tuse >= Tnew成立,可以通过转发解决) T_new = 0 写入时应当注意 :Cause寄存器(13)不允许写入,EPC允许写入,SR寄存器部分字段允许写入,其他不允许写入的字段要保持为0 ...

December 3, 2023 · 11 min · sudo

P6课上测试

P6课上测试 ​ P6课上测试内容与P5课上测试内容大概只有第一题计算类型上的区别,变为考察乘除槽的指令 一.增添指令一般步骤 读懂RTL语言,注意opcode与funct位置,是什么类型的指令,会不会与已经添加过的指令发生冲突(例如P5上机第一题中计算指令与slt指令opcode重复QAQ) 使用课上提供的.class文件在MARS中进行模拟 计算指令是否可以进行归类,cal_R,cal_I;条件跳转指令和条件存储指令一般直接使用check信号对新信号进行特判。 在MCU中从上到下观察是否将新指令加入有效列表 明确新指令的T_use,T_new 二.题型分析 1.涉及到乘除槽的计算类指令 ​ P6的计算指令会涉及到乘除模块,以madd,maddu,msub,msubu等指令为例。 madd : 将两个有符号数相乘,计算结果与之前的HI,LO寄存器中的值相加,而不是覆盖 mddu:将两个无符号数相乘,计算结果与之前的HI,LO寄存器中的值相加,而不是覆盖 msub:将两个有符号数相乘,之前HI,LO中的值减去当前结果 msubu:将两个无符号数相乘,之前HI,LO中的值减去当前结果 1.verilog中的符号性问题 ​ $signed()关键字的功能为数据如何进行补位,根据递归确定外层+向内传播的表达式符号确定规则,例如在P1中遇到的三目表达式中有无符号数导致整个表达式变为无符号的情况。 算数(符号)右移表达式中移位立即数不必要声明为有符号 :$signed(A) »> B 为避免$singed()出现的问题,可以使用位扩展进行代替 1 {{16{imm[15]}},imm}//16位imm符号扩展为32位 2.计算指令中的符号乘除 mult 使用位拼接运算 1 {tmpHI,tmpLO} <= $signed(A) * $signed(B) madd 错误写法1 1 {tmpHI,tmpLO} <= {tmpHI,tmpLO} + $signed(A)*$signed(B) 位拼接运算{tmpHI,tmpLO}默认被当作无符号数,向内传播导致$signed(A)*$signed(B)变为无符号的 修改为: 1 {tmpHI,tmpLO} <= $signed({tmpHI,tmpLO}) + $signed(A)*$signed(B) 错误写法2 1 {tmpHI,tmpLO} <= {tmpHI.tmpLO} + $signed($signed(A)*$signed(B)) 使用$signed()屏蔽了外界符号性的传入,同时屏蔽了位宽信息的传入,由于$signed(A),$signed(B)为32位,则$signed($signed(A)*$signed(B))为32位 ...

December 2, 2023 · 4 min · sudo