参考计组实验测试指令 - 简书,添加了一些细节。
1.添加 bne指令
修改 ctrl.v



之后修改mipstestloopjal_sim.asm,mars dump 为 bnetest.dat

修改sccomp_tb

modelsim编译,模拟。信号添加sccomp_tb: u_ctrl -> i_bne ,npc, pc

可见i_bne控制信号为1时,npc变为44。添加bne成功
2.添加jr指令
先看其格式。

R型指令。
故在ctrl.v如下修改。

ctrl.v又两处修改

然后在NPC.v修改。注意添加参数和input



=RD1的原因可见sccpu.v

在ctrl_encode_def 定义NPC_JR

在sccpu.v添加参数 .RD1

然后写测试程序
$ra先赋值为4.这样应该会不断循环。
导出测试

勿忘修改sccomp_tb

波形图可见PC从1c变到设定的4。添加成功

3.添加JALR

ctrl.v





无条件跳转到由寄存器rs指定的指令,并将下一条指令的地址保存到寄存器$ra中
测试代码

可见从14跳到4,

并且$ra 记录 18

4.添加NOR指令



在alu.v中

测试代码

波形:

寄存器:

5.添加sll & sra & srl指令
注意这里做了扩展

注意同时修改了input ALUOp的宽度

然后在ctrl.v中
写寄存器
注意只改了RegWrite,下面的RD没改


添加输出




在sccpu.v中





测试代码:

波形:可以看到ALUop对应 sll,srl,sra的1000,1001,1010

寄存器值:

6.sllv和srlv
这里sllv使用的是rs低五位 自己动手写CPU之第五阶段(3)——MIPS指令集中的逻辑、移位与空指令 - yxwkaifa - 博客园
sllv $t1,$t2,$t3。
则t1值为t2左移t3的低五位
但是这里不太懂,没搞明白是怎么实现的逻辑左右移,位数可变
这里犯了一次错误。复制粘贴后忘了改数字了






测试代码:

波形:

寄存器变化

7.stli指令
小于则置一




测试代码:

波形:

寄存器值:

8.lui指令
取高十六位







测试代码:

波形图:

寄存器值:

9.andi指令


别忘了RT


aluop同and

测试代码:

波形图:

寄存器:

以上。nice!
学号后八位排序
01510029
lui 0x0151
ori 0x0029

记得改sccomp_tb

跑完看result.txt

大概是完成了排序。