master
parent
652cf24590
commit
6137635669
@ -1,23 +1,17 @@
|
||||
def Imm_gen(inst_code):
|
||||
test=inst_code[25:32]
|
||||
if test=='0010011':
|
||||
imm_out=20*inst_code[0]+inst_code[0:12]
|
||||
elif test=='0000011':
|
||||
test = inst_code[25:32]
|
||||
if test == '0010011':
|
||||
imm_out = 20*inst_code[0]+inst_code[0:12]
|
||||
elif test == '0000011':
|
||||
pass
|
||||
elif test=='0100011':
|
||||
elif test == '0100011':
|
||||
pass
|
||||
elif test=='1100011':
|
||||
elif test == '1100011':
|
||||
pass
|
||||
elif test=='1101111':
|
||||
elif test == '1101111':
|
||||
pass
|
||||
elif test=='1100111':
|
||||
elif test == '1100111':
|
||||
pass
|
||||
elif test=='0110111':
|
||||
elif test == '0110111':
|
||||
pass
|
||||
def imm_gen(inst_code,imm_out):
|
||||
test=inst_code[25:32]
|
||||
if test=="0010011":
|
||||
imm_out=inst_code[0]*20+inst_code[0:12]
|
||||
else:
|
||||
imm_out='0'*32
|
||||
return imm_out
|
||||
return imm_out
|
||||
|
@ -0,0 +1,62 @@
|
||||
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
|
@ -1,6 +1,6 @@
|
||||
def hazard_detector(if_id_rs1,if_id_rs2,id_ex_rd,id_ex_memread):
|
||||
if id_ex_memread and (id_ex_rd==if_id_rs1 or id_ex_rd==if_id_rs2):
|
||||
stall=1
|
||||
stall='1'
|
||||
else:
|
||||
stall=0
|
||||
stall='0'
|
||||
return stall
|
@ -1,5 +1,10 @@
|
||||
class insn_mem:
|
||||
memory=[8*'0']*4*1024*16
|
||||
def fetch(self,address):
|
||||
insn=self.memory[address]
|
||||
return insn
|
||||
memory = [8*'0']*4*1024*16
|
||||
|
||||
def __init__(self) -> None:
|
||||
pass
|
||||
|
||||
def fetch(self, address):
|
||||
insn = self.memory[address+3]+self.memory[address+2] + \
|
||||
self.memory[address+1]+self.memory[address]
|
||||
return insn
|
||||
|
@ -0,0 +1,14 @@
|
||||
class reg_file:
|
||||
regs = [0]*32
|
||||
|
||||
def __init__(self) -> None:
|
||||
pass
|
||||
|
||||
def write(self, write_en, write_addr, data_in):
|
||||
if write_en == '1' and write_addr != 0:
|
||||
self.regs[write_addr] = data_in
|
||||
|
||||
def read(self, read_addr1, read_addr2):
|
||||
data_out1 = self.regs[read_addr1]
|
||||
data_out2 = self.regs[read_addr2]
|
||||
return data_out1, data_out2
|
@ -0,0 +1 @@
|
||||
from datapath import *
|
Loading…
Reference in new issue