BUAA_CO_P6习题分析
P6 习题分析
wtd指令:
记temp1为GRF[rs]的32种循环移位的和 如: 123 + 231 + 321
temp2为GRF[rt]的32种循环移位的和
if (temp1 > temp2) 则 把1写入rd
else if (temp1 < temp2) 则 把 -1写入rd
else 把0写入rd
12345678910111213141516171819202122232425262728293031323334353637383940/* 整体分析:在D级实现一个组合逻辑计算出temp1和temp2,进而确定回写内容 */controllerwire wtd = (opcode_DEin == 6'b0 && func_DEin == 6'b000011) ? 1 : 0;/* 生成控制信号 */RegWrite_DEin = (wtd || ...) ? 1 : 0;RegDst_DEin = (wtd || ...) ? 2'b01 : ... // 写入rd寄存器/* 生成特判信号 */wir ...
BUAA_CO_P7
MIPS微系统
P7需要我们的CPU支持异常处理。
具体地说,就是在“异常事件”发生的时候,调用一段预先写好的程序来处理这种异常,处理结束后再跳转回原来的程序。
P7新增了4条与系统相关的指令:mfc0 mtc0 eret syscall
概念异常事件我们提到的“异常事件”有两种:异常和中断
(内部)异常:
加法溢出
除法除零
(外部)中断:
计时器信号
键盘输入
系统桥系统桥是连接CPU和外设的功能设备,它会给 CPU 提供一种接口,使得 CPU 可以像读写普通存储器一样(即按地址读写)来读写复杂多变的外设。
系统桥统一且简化了 CPU 的对外接口,CPU 不必为每种外设单独提供接口,符合高内聚,低耦合的设计思想。
将CPU封装成单周期对于CPU的外部来说,它并不关心流水线中有多少条指令,是否阻塞等问题。
他们可以简单的认为CPU就是每次处理一条指令的“单周期”的。这是理解流水线CPU封装的关键所在。
CP0协处理器
CP0的两个功能:读写内部寄存器(mfc0 mtc0)+ 判断是否进行异常跳转
读写内部寄存器
有哪些寄存器?
| 寄存器 | 位数 | 编号 ...
BUAA_CO_P6
P6支持30指令的五级全速流水线指令分析29条指令
计算类指令:add sub and or slt sltu lui addi andi ori nop
访存类指令:lb lh lw sb sh sw
乘除类指令:mult multu div divu mfhi mflo mthi mtlo
分支类指令:beq bne
跳转类指令: jal jr
数据冒险需要回写的有16条指令:add sub and or slt sltu lui addi andi ori lb lh lw mfhi mflo jal
转发阻塞Tuse : 在D级用数据为0,E级为1,M级为2,用不到数据为max(在编写时,max = 3)
add
sub
and
or
slt
sltu
lui
addi
andi
ori
nop
Tuse_RS
1
1
1
1
1
1
max
1
1
1
max
Tuse_RT
1
1
1
1
1
1
max
max
max
max
max
lb
lh
lw
sb
sh
sw
beq
bne
jal
jr
Tuse_RS
1 ...
BUAA_CO_P5习题分析
增添指令注意事项:
注意必须在每一级的WriteBack和RegAddr检查回写的内容和地址是否符合新增指令的期望,防止在上游产生的正确回写数据在下游被覆盖!
注意务必为新增指令添加阻塞板块Tuse Tnew的取值。
由于特判信号是随着指令在流水线中流动的,所以其后也要加_DEin这样的后缀。
注意默认拓展是0拓展,要进行符号拓展需要将新增指令的特判信号传入EXTOp。
运算类(1) 运算 + 判断 + 回写(地址确定)
P4T1添加指令为 eam,R型指令。具体操作为,取出 GPR[rs] 的低16位,作为一个有符号数对17取模,结果必须为0~16的某一个非负数,结果为一个16位的数。之后,若 GPR[rt] 的最高位为1,则将该运算结果零扩展至32位,否则将该运算结果一扩展至32位。将结果存至 GPR[rd] 中。
1234567891011121314151617181920212223242526272829/* 整体分析:该题对GRF[rs]取值计算,根据GRF[rt]的最高位决定回写内容,存于固定地址根据尽早产生数据的原则,我们希望利用D级内的组合逻辑得到正确的要回 ...
BUAA_CO_P5
P5_流水线CPU指令分析支持10指令
运算类:add sub nop lui ori
访存类:sw lw
分支跳转类:beq jal jr
数据冒险阻塞根据转发中的第2,3点分析,我们知道每条指令都有相应的产生新数据的时间Tnew(从刚进入D级算起,如果有的话),也有需要用到数据的时间Tuse(从刚进入D级算起,如果有的话)。这样就会构成如下的表格:
如果用不到数据我们就认为是一个很大的时间max(3)
add
sub
nop
ori
lui
sw
lw
beq
jal
jr
Tuse_RS
1
1
max
1
max
1
1
0
max
0
Tuse_RT
1
1
max
max
max
2
max
0
max
max
另一个指标是Tnew,用于体现要回写的新数据产生并存入最近的流水级寄存器堆的时间(从刚进入D级算起)
如果不会产生要回写的数据就记为一个很小的时间min(0)
add
sub
nop
ori
lui
sw
lw
beq
jal
jr
Tnew_DEin
2
2
min
2
1
min
3
min
1
min
...
BUAA_CO_P4
P4_Verilog实现10指令单周期CPU需求分析实现10指令:add, sub, ori, lw, sw, beq, lui, jal, jr, nop
在8指令的基础上增量开发实现10指令,我们首先分析新增指令的功能
jal:将pc + 4写入31号寄存器 + 跳转到指定地址
jr :从31号寄存器中读出 + 跳转到指定地址
思路分析
由于jal要求写入31号寄存器,所以的RegAddr需要至少3种编码,也就是说RegDst至少需要2位,分别对应写入寄存器编号来自rt rd 和 31号
123[1:0] RegDst // RegDst == 2'b00 RegAddr是rt对应的寄存器 (默认) // RegDst == 2'b01 RegAddr是rd对应的寄存器 // RegDst == 2'b10 RegAddr是31号寄存器
同 ...
BUAA_OOpre_5
Lecture 5 如何管理对象
对象与引用:
(1)对象是什么:
对象是程序通过new产生的实例
对象是堆内存中的一个区域,包含属性数据和指向类的指针
方法定义在类中而不是对象中
(2)对象引用是什么:
指向对象内存地址的指针,用以访问对象成员及其属性和方法
对象引用可能为null
改变对象引用的取值不会导致被引用对象数据的改变
(3)区别与联系
当堆中某个对象无法被程序访问时,Java垃圾回收机制会自动回收内存。
改变对象内容的唯一方法是通过对象引用去访问其修改方法
对象引用是一个变量(类似于C语言的指针型变量),对象引用内容的改变可以随时通过变量赋值实现
Java常见容器及其作用:
(1)ArrayList:可伸缩数组
(2)LinkedList:可伸缩链表
优点:当我们需要保持对象的顺序关系并且按照下标访问时,采用ArrayList或者LinkedList是比较好且比较简单的选择
缺点:查找某个对象需要遍历,查找速度较慢
(3)HashMap:哈希表
1234567891011public class Adeventurer { //par ...
BUAA_CO_P3
P3 Logisim实现单周期处理器目录 :
[toc]
整体结构
所要设计的版块:IFU,Splitter,Controller,GRF,ALU,DM,EXT
设计要求:支持的指令集:add sub ori lw sw beq lui nop 其中add和sub按照无符号处理
顶层驱动信号:异步复位reset
指令分析:
R型:add sub nop # Opcode + Rs + Rt + Rd + shamt + Func
I型:ori lw sw lui beq # Opcode + Rs + Rt + immediate
123456789add $t0, $t1, $t2 # 机器码:000000_01001_01010_01000_00000_100000sub $t0, $t1, $t2 # 机器码:000000_01001_01010_01000_ ...
BUAA_CO_P2
P2汇编语言目录:
[toc]
宏定义
P2_L0_Matrix和P2_L1_factorial涉及矩阵读入,运算与输出。可以使用一些宏定义可以增加代码可读性:
1234567891011121314151617181920212223242526272829303132.datastr_enter : .asciiz "\n" # .asciiz 伪指令用于定义一个以空字符结尾的字符串常量。str_space : .asciiz " " # .ascii 伪指令不包含结尾处的空字符.macro printSpace # 输出一个空格 la $a0, str_space # 用于将标签或变量的地址加载到指定的寄存器中。 li $v0, 4 syscall .end_macro .macro printEnter # 输出一个换行符 la $a0, str_enter li $v0, 4 ...
BUAA-CO-P1
P1_Verilog-HDL部件及状态机设计目录:
[toc]
Verilog-HDL语法
状态编码定义的两种方式:parameter 和 `define 语句
1234567891011121314151617181920//parameter语句parameter State1 = 4'b0001, //注意逗号和等号 State2 = 4'b0010, State3 = 4'b0100, State4 = 4'b1000; //分号结束case (State) State1 : begin end State2 : begin end //`define语句`define State1 4'b0000 // 不要加分号和等号`define State2 4'b0010`define State3 4'b0100`define State4 4'b1000case (State) `State1 : begin ...