指令 lw 0 1 0 //从1号寄存器+0偏移 读出ram里的数据? 送入0号寄存器 期望执行结果: ram地址0 预先写入 ff 如果指令被执行成功则 0号寄存器被写入ff add 2 0 1 //从0号寄存器和1号寄存器取数 add 写入2号寄存器 期望执行结果 2号寄存器变为ff sw 2 1 1 //从1号寄存器+1偏移 将2号寄存器写入ram[1]中 期望执行结果 ram中1号位变为ff
由于采用流水线结构 所以指令实际执行流程如下 tick1 tick2 tick3 tick4 tick5 tick6 tik7 tick8 tick9 tick10 tick11 取指1 译码1 运算1 访存1 写回1 nop nop 取指2 译码2 运算2 访存2 写回2 nop nop 取指3 译码3 运算3 访存3 写回3
使用转发解决数据冒险 tick1 tick2 tick3 tick4 tick5 tick6 tik7 tick8 tick9 tick10 tick11 取指1 译码1 运算1 访存1(<-0) 写回1 nop 取指2 译码2(0->) 运算2(<-2) 访存2 写回2
取指3 译码3(2->) 运算3 访存3 写回3
所以实际指令为
lw 0 1 0
nop
add 2 0 1
sw 2 1 3
二进制指令 十六进制
lw 0 1 0 =>01011 000 001 000 00 =>5820
nop => 00000 000 000 000 00 => 0
add 2 0 1 =>00001 010 000 001 00 => A04
sw 2 1 1 => 10000 010 001 00011 => 8223
beq a b c =>10001 a b c(5bit)
1000101001100111 8A67
1000101110000111
j m=>11000 000 m
sub a b c => 00010 a b c 00
实际指令十六进制
5820 0 0 A04 0 0 8221
十六制微指令 微指令地址 lw 12A7 01011 11 B sw 1A6 10000 16 10 add 14A5 00001 1 1 nop 0 0 beq 819 10001 17 11 j 80D 11000 24 18 sub 1419 00010 2 2 bne 859 10010 18 12 jr 80E 11001 25 19 数据RAM内存排布 address 0 FF 其余为0 rrr.hex 8bit codeRom内存排布 见romCode.hex 16bit 微指令Rom内存排布 见romM16bit32.hex 16bit
期望程序执行过程(tick1 表示 一个上边沿 下边沿 后瞬间的状态)
tick1 取codeRam地址0 读出lw 0 1 0指令 上边沿codeRom读0地址 下边沿 romM读01011地址
tick2 regheap读出R1=寄存器1 chooser2 读出a=寄存器1 b=立即数00000
tick3 alu计算 寄存器1+立即数00000
tick4 访存1:ram读地址0 读出FF 取指2 codeRam读地址3
tick5 写回1:将FF写回寄存器0 译码2 取寄存器0的值 (先写后读!!!!)
tick6 运算2 寄存器0 和寄存器1 相加 结果为FF
tick7 访存2:无事可做 取指3: codeRam读地址6
tick8 写回2:将alu的结果写回寄存器2 译码3 取寄存器2的值(应取到FF) chooser2选择 y和z
tick9 运算3 :送入alu 运算加法
tick10 访存3 : wren On alu结果送入address 寄存器2内容送入ram
tick11 写回3: 无事可做
todo: 缩短分支延迟 j imm 取指处理 jr rs 译码处理 nop1 beq rs,rt,imm nop1 译码后做比较
斐波那契 addi 1 0 0 addi 2 0 1 addi 4 0 0 addi 5 0 5 add 3 1 2 addi 1 2 0 addi 2 3 0 addi 4 4 1 pln 3 beq 4 5 14 nop nop j 5 sb 3 0 0 阶乘
addi 3 0 1 addi 2 0 1 addi 1 1 1 mul 0 1 2 mflo 2 pln 2 j 3
2的N次方 addi 1 0 1 addi 2 0 2 mul 1 2 mflo 1 pln 1 j 3
j a (index )-255 =a 斐波那契: addi 1 0 0 addi 2 0 1 addi 4 0 0 addi 5 0 2 add 3 1 2 addi 1 2 0 addi 2 3 0 addi 4 4 1 pln 3 slt 6 4 5 beqz 6 5 nop sb 3 0 0
除法: