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