from hardware.hardware import Hardware class Debugger: def __init__(self, hw): self.hw = hw #打印程序计数器 #效果: # 打印当前pc寄存器的值 def dumpPC(self): pc = self.hw.pc.read() print('pc: {:08x}'.format(pc)) #打印通用寄存器 #效果: # 打印当前所有通用寄存器的值 def dumpGenReg(self): for i in range(self.hw.genRegCnt): data = self.hw.genReg[i].read() print('GR{:02}: {:08x}'.format(i, data)) #打印流水线寄存器 #效果: # 打印当前所有流水线寄存器的值 def dumpPplReg(self): for i in range(self.hw.stageCnt): print('stage{}:'.format(i)) for j in range(self.hw.pplRegCnt): data = self.hw.pplReg[i][j].read() print('PR{}: {:08x}'.format(j, data)) #打印指令存储器 #输入: # addr为地址 #效果: # 打印当前指令存储器地址addr所在的一个字 def dumpInstrMem(self, addr): data = self.hw.instrMem.read(addr) print('IM{:08x}: {:08x}'.format(addr, data)) #打印数据存储器 #输入: # addr为地址 #效果: # 打印当前数据存储器地址addr所在的一个字 def dumpDataMem(self, addr): data = self.hw.dataMem.read(addr) print('DM{:08x}: {:08x}'.format(addr, data)) #获取指令列表 #输入: # fileName为程序文件名 #输出: # 程序中指令的列表 #约束: # 程序文件的每一行是一个8位16进制数,表示一条指令 def getListFromFile(fileName): instrList = [] program = open(fileName, 'r') for line in program: instrList.append(int(line, 16)) return instrList #加载程序 #输入: # fileName为程序文件名 #效果: # 将程序写入指令存储器,地址从0开始,并将pc置为0 def loadProgram(self, fileName): instrList = Debugger.getListFromFile(fileName) addr = 0 for instr in instrList: self.hw.instrMem.write(addr, instr) self.hw.globalSync() addr = addr + 4 self.hw.pc.write(0) self.hw.globalSync()