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.

62 lines
2.4 KiB

3 years ago
from adder import *
from alu_controller import *
from alu import *
from binandint import *
from branch_unit import *
from data_mem import *
from forwarding_unit import *
from hazard_detector import *
from Imm_gen import *
from insn_mem import *
from mux import *
from mux4 import *
from proc_controller import *
from reg_file import reg_file
IM=insn_mem()
PC=0
def IF(BrPC,Brflush,stall,PC,IM):
PCplus4=adder(PC,4)
if Brflush=='1':
nPC=BrPC
else:
nPC=PC+4
insn=IM.fetch(nPC)
return nPC,insn
REG=reg_file()
def ID(PC,insn,RegWrite,Brflush,stall,REG,WB_data):
funct7=insn[0:7]
rs2=BintoUInt(insn[7:12])
rs1=BintoUInt(insn[12:17])
funct3=insn[17:20]
rd=BintoUInt(insn[20:25])
opcode=insn[25:32]
ALUSrc, MemtoReg, RegWritex, MemRead, MemWrite, ALUOp, Branch, JalrSel, RWSel=proc_controller(opcode)
ImmG=Imm_gen(insn)
REG.write(RegWrite,rd,WB_data)
RD1,RD2=REG.read(rs1,rs2)
return ALUSrc, MemtoReg, RegWritex, MemRead, MemWrite, ALUOp, Branch, JalrSel, RWSel,PC,RD1,RD2,ImmG,rs1,rs2,rd,funct3,funct7
def EX(ALUSrc, MemtoReg, RegWrite, MemRead, MemWrite, ALUOp, Branch, JalrSel, RWSel,PC,RD1,RD2,ImmG,rs1,rs2,rd,funct3,funct7,lastrs1,lastrs2,forwardA,forwardB,WB_data,alu_out):
stall=hazard_detector(lastrs1,lastrs2,rd,MemRead)
tempA=mux4(RD1,alu_out,WB_data,0,forwardA)
tempB=mux4(RD2,alu_out,WB_data,0,forwardB)
tempB2=mux(tempB,ImmG,ALUSrc)
alu_ctrl=alu_controller(ALUOp,funct7,funct3)
ALU_result=alu(tempA, tempB2, alu_ctrl)
pc_plus_imm,pc_plus_4,branch_target,pc_sel=branch_unit(PC,ImmG,JalrSel,Branch,ALU_result)
return MemtoReg, RegWrite,MemWrite,RWSel,MemRead,pc_plus_imm,pc_plus_4,branch_target,pc_sel,ALU_result,rs1,rs2,rd,tempA,tempB,funct3,funct7
MEMORY=data_mem()
def MEM(MEMORY,MemtoReg, RegWrite,MemWrite,RWSel,MemRead,pc_plus_imm,pc_plus_4,ALU_result,rs1,rs2,rd,tempA,tempB,funct3,funct7):
data_out=MEMORY(MemWrite,MemRead,ALU_result,tempB,funct3)
return MemtoReg, RegWrite,RWSel,pc_plus_imm,pc_plus_4,data_out,tempB,rd
def WB(MemtoReg, RegWrite,RWSel,pc_plus_imm,pc_plus_4,data_out,tempB,ex_mem_rd,mem_wb_rd,ex_mem_rs1,ex_mem_rs2,ex_mem_regwrite,mem_wb_regwrite):
mem_out=mux(data_out,tempB,MemtoReg)
WB_data=mux4(mem_out,pc_plus_4,pc_plus_imm,0,RWSel)
forward_a,forward_b= fowardingunit(ex_mem_rs1,ex_mem_rs2,ex_mem_rd,mem_wb_rd,ex_mem_regwrite,mem_wb_regwrite)
return WB_data,RegWrite,forward_a,forward_b