自己动手写CPU(4)移动操作指令的实现
指令说明
MIPS32指令集架构中定义的移动操作指令共有6条: movn、movz、mfhi、mthi、mflo、mtlo,后4条指令涉及对特殊寄存器HI、LO的读/写操作。HI、LO寄存器用于保存乘法、除法结果。当用于保存乘法结果时,HI寄存器保存结果的高32位,LO寄存器保存结果的低32位;当用于保存除法结果时,H寄存器保存余数,LO寄存器保存商。
指令格式
MOVN
当功能码为6’b001011时,表示是movn指令。指令用法为:movn rd, rs,rt。
指令作用为: if rt ≠0 then rd <- rs,判断地址为rt的通用寄存器的值。如果不为零,那么将地址为rs 的通用寄存器的值赋给地址为rd的通用寄存器;反之,保持地址为rd的通用寄存器不变。movn是 Move Conditional on Not Zero的意思。
MOVZ
当功能码为6’b001010时,表示是movz指令。指令用法为:movz rd, rs, rt。
指令作用为: if rt = 0 then rd <- rs,与上面movn指令的作用正好相反,判断地址为rt的通用寄存器的值。如果为零,那么将地址为rs 的通用寄存器的值赋给地址为rd的通用寄存器;反之,保持地址为rd的通用寄存器不变。movz是 Move Conditional on Zero 的意思。
MFHI
当功能码为6’b010000时,表示是 mfhi 指令。指令用法为:mfhi rd。
指令作用为: rd <- hi,将特殊寄存器H的值赋给地址为rd的通用寄存器。
MFLO
当功能码为6’b010010时,表示是mflo指令。指令用法为:mflo rd。
指令作用为:rd <- lo,将特殊寄存器LO的值赋给地址为rd的通用寄存器。
MTHI
当功能码为6’b010001时,表示是mthi 指令。指令用法为: mthi rs。
指令作用为: hi<- rs,将地址为rs的通用寄存器的值赋给特殊寄存器HI。
MTLO
当功能码为6’b010011时,表示是mtlo指令。指令用法为:mtlo rs。
指令作用为: lo <- rs,将地址为rs的通用寄存器的值赋给特殊寄存器LO。
助记
MFxx为move from,MTxx为move to,这样是否需要读写特殊寄存器就可以记清了。
修改之处
主要需注意的地方是读取HI、LO寄存器时仍会存在数据相关问题,解决方式仍是使用数据前推,将处于访存阶段、回写阶段的指令对HI、LO寄存器的操作信息反馈到执行阶段,执行阶段依据这些信息,确定HI、LO寄存器的正确值。
修改后的系统结构
仿真结果
实验心得
开始时reg[4]
最后的状态总是不对,不能到全0状态,debug后发现mfhi和mflo两条指令的译码阶段出现问题;分析代码后在译码模块中发现错误,inst[31:21]
为全0的话会进另一个逻辑去判断而不会进op3的case语句中。以后编写代码时仍需谨慎!