You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.4 KiB
60 lines
1.4 KiB
from instruction.instruction import Instruction
|
|
|
|
#RI类指令
|
|
class RegImmInstr(Instruction):
|
|
def instrDecode(self):
|
|
super().instrDecode()
|
|
|
|
instr = self.hw.pplReg[1][0].read()
|
|
mask = (1 << 5) - 1
|
|
|
|
rs = (instr >> 21) & mask
|
|
rsData = self.hw.genReg[rs].read()
|
|
rt = (instr >> 16) & mask
|
|
|
|
self.hw.pplReg[2][0].write(rsData)
|
|
self.hw.pplReg[2][2].write(rt)
|
|
|
|
def memAccess(self):
|
|
super().memAccess()
|
|
|
|
res = self.hw.pplReg[3][0].read()
|
|
rt = self.hw.pplReg[3][1].read()
|
|
|
|
self.hw.genReg[rt].write(res)
|
|
|
|
#进行零扩展的RI类指令
|
|
class ZeroExtRegImmInstr(RegImmInstr):
|
|
def instrDecode(self):
|
|
super().instrDecode()
|
|
|
|
instr = self.hw.pplReg[1][0].read()
|
|
mask = (1 << 16) - 1
|
|
|
|
imm = instr & mask
|
|
self.hw.pplReg[2][1].write(imm)
|
|
|
|
#进行符号扩展的RI类指令
|
|
class SignExtRegImmInstr(RegImmInstr):
|
|
#符号扩展
|
|
#输入:
|
|
# imm为16bit数据
|
|
#输出:
|
|
# imm的32bit符号扩展
|
|
def signedExtend(imm):
|
|
mask = (1 << 16) - 1 << 16
|
|
if (imm >> 15) & 1:
|
|
return imm | mask
|
|
else:
|
|
return imm
|
|
|
|
def instrDecode(self):
|
|
super().instrDecode()
|
|
|
|
instr = self.hw.pplReg[1][0].read()
|
|
mask = (1 << 16) - 1
|
|
|
|
imm = instr & mask
|
|
imm = SignExtRegImmInstr.signedExtend(imm)
|
|
self.hw.pplReg[2][1].write(imm)
|