MIPS控制单元如何区分Jr与同OpCode的其他R型指令?
问题
我正在开发一款MIPS数据通路模拟器,当前控制单元仅以OpCode作为输入。Jr指令与其他R型指令的OpCode均为000000,但Jr指令需要将RegWrite置为0,且需跳转到rd寄存器中的地址,而现有控制逻辑会让所有R型指令触发跳转并开启RegWrite。想请教:控制单元该如何区分Jr与其他R型指令?是否需要将funct码传入控制单元?
当前控制单元实现代码:
this.outputs[0].changeValue(opCode == "000000"); // regdest this.outputs[1].changeValue(opCode == "000010" || opCode == "000011"); //jump this.outputs[2].changeValue(opCode == "000100"); //branch this.outputs[3].changeValue(opCode == "100011"); //memread this.outputs[4].changeValue(opCode == "100011"); // memtoreg this.outputs[5].changeValue( ["000000"].includes(opCode) ? "10" : ["100011", "101011"].includes(opCode) ? "00" : opCode == "000100" ? "01" : "11" //X ); //aluop this.outputs[6].changeValue(opCode == "101011"); //memwrite this.outputs[7].changeValue(opCode != "000000" && opCode != "000100"); //alusrc this.outputs[8].changeValue( !["101011", "000010", "000100"].includes(opCode) ); //regwrite
解决方案
- 必须传入funct码到控制单元:所有R型指令的OpCode都是000000,它们的区分完全依赖指令的funct字段(即指令的最低6位)。Jr指令的funct码是001000,所以控制单元需要同时接收OpCode和funct码作为输入,才能针对性生成控制信号。
- 修改控制信号逻辑:
- Jump信号:原有逻辑只识别J/JAL指令的OpCode,现在需要补充:当OpCode为000000且funct码为001000时,Jump信号置1(触发跳转)。
- RegWrite信号:原有逻辑中R型指令会开启RegWrite,但Jr是特殊的R型指令,不需要写寄存器。所以RegWrite的判断要排除“OpCode为000000且funct码为001000”的情况。
- 其他R型指令兼容:对于除Jr外的其他R型指令(OpCode为000000且funct码不为001000),保持原有控制信号逻辑不变,比如RegWrite置1、RegDest置1等。
修改后的关键控制信号示例:
// Jump信号:包含J/JAL,以及Jr指令 this.outputs[1].changeValue( opCode == "000010" || opCode == "000011" || (opCode == "000000" && funct == "001000") ); // RegWrite信号:排除Jr、SW、J、BEQ指令 this.outputs[8].changeValue( !["101011", "000010", "000100"].includes(opCode) && !(opCode == "000000" && funct == "001000") );
内容的提问来源于stack exchange,提问作者Salih Erdem Kaymak
相关产品推荐
相关产品推荐

