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.

150 lines
3.5 KiB

from architecture import *
#执行一个周期
def run(arch):
arch1 = Architecture()
for i in range(INSTR_MEM_SIZE):
arch1.mem[INSTR_MEM_OFF + i] = arch.mem[INSTR_MEM_OFF + i]
arch1.clk = arch.clk + 1
arch1.reg[PC_REG_OFF] = runPC(arch)
'''
for i in range(INT_REG_SIZE):
arch1.reg[INT_REG_OFF + i] = runIntReg(arch, i)
for i in range(FP_REG_SIZE):
arch1.reg[FP_REG_OFF + i] = runFpReg(arch, i)
for i in range(DATA_MEM_SIZE):
arch1.mem[DATA_MEM_OFF + i] = runMem(arch, i)
arch1.fu[INT_FU_OFF] = runIntFU(arch)
arch1.fu[ADD_FU_OFF] = runAddFU(arch)
arch1.fu[MUL_FU_OFF] = runMulFU(arch)
arch1.fu[MEM_FU_OFF] = runMemFU(arch)
arch1.rs[INT_RS_OFF] = runIntRS(arch)
for i in range(ADD_RS_SIZE):
arch1.rs[ADD_RS_OFF + i] = runAddRS(arch, i)
for i in range(MUL_RS_SIZE):
arch1.rs[MUL_RS_OFF + i] = runMulRS(arch, i)
for i in range(MEM_RS_SIZE):
arch1.rs[MEM_RS_OFF + i] = runMemRS(arch, i)
for i in range(BUF_REG_SIZE):
arch1.reg[BUF_REG_OFF + i] = runBufReg(arch, i)
arch1.bus = runBus(arch)
'''
return arch1
def runPC(arch):
pc = Register()
if issue(arch):
pc.val = arch.reg[PC_REG_OFF].val + 1
instr = fetch(arch)
if instr.op == 'jump':
pc.src = INT_RS_OFF
else:
pc.src = arch.reg[PC_REG_OFF].src
elif arch.reg[PC_REG_OFF].src and not arch.fu[INT_FU_OFF].clk:
pc.val = arch.fu[INT_FU_OFF].res
pc.src = 0
else:
pc.val = arch.reg[PC_REG_OFF].val
pc.src = arch.reg[PC_REG_OFF].src
return pc
def runIntReg(arch, i):
reg = Register()
fuOff = writeReg(arch, INT_REG_OFF + i)
if fuOff:
reg.val = arch.fu[fuOff].res
else:
reg.val = arch.reg[INT_REG_OFF + i].val
rsOff = issue(arch)
if rsOff:
instr = fetch(arch)
if instr.op == 'addi':
#TODO
def runFpReg(arch, i):
pass
def runMem(arch, i):
pass
def runIntFU(arch):
pass
def runAddFU(arch):
pass
def runMulFU(arch):
pass
def runMemFU(arch):
pass
def runIntRS(arch):
pass
def runAddRS(arch, i):
pass
def runMulRS(arch, i):
pass
def runMemRS(arch, i):
pass
def runBufReg(arch, i):
pass
def runBus(arch, i):
pass
def issue(arch):
if not arch.reg[PC_REG_OFF].src:
instr = fetch(arch)
if instr:
rsMap = {
'addi': (INT_RS_OFF, INT_RS_SIZE),
'jump': (INT_RS_OFF, INT_RS_SIZE),
'fadd': (ADD_RS_OFF, ADD_RS_SIZE),
'fmul': (MUL_RS_OFF, MUL_RS_SIZE),
'load': (MEM_RS_OFF, MEM_RS_SIZE),
'store': (MEM_RS_OFF, MEM_RS_SIZE)
}
offset, size = rsMap[instr.op]
return first(arch, offset, size):
return 0
def fetch(arch):
return arch.mem[INSTR_MEM_OFF + arch.reg[PC_REG_OFF].val]
def first(arch, offset, size):
for i in range(size):
if not arch.rs[offset + i].busy:
return offset + i
return 0
def writeReg(arch, i):
src = arch.reg[i].src
if src == INT_RS_OFF:
return INT_FU_OFF
elif src >= ADD_RS_OFF and src < ADD_RS_OFF + ADD_RS_SIZE:
return ADD_FU_OFF
elif src >= MUL_RS_OFF and src < MUL_RS_OFF + MUL_RS_SIZE:
return MUL_FU_OFF
elif src >= MEM_RS_OFF and src < MEM_RS_OFF + MEM_RS_SIZE:
return MEM_FU_OFF
else:
return 0