master
parent
652cf24590
commit
6137635669
@ -1,23 +1,17 @@
|
|||||||
def Imm_gen(inst_code):
|
def Imm_gen(inst_code):
|
||||||
test=inst_code[25:32]
|
test = inst_code[25:32]
|
||||||
if test=='0010011':
|
if test == '0010011':
|
||||||
imm_out=20*inst_code[0]+inst_code[0:12]
|
imm_out = 20*inst_code[0]+inst_code[0:12]
|
||||||
elif test=='0000011':
|
elif test == '0000011':
|
||||||
pass
|
pass
|
||||||
elif test=='0100011':
|
elif test == '0100011':
|
||||||
pass
|
pass
|
||||||
elif test=='1100011':
|
elif test == '1100011':
|
||||||
pass
|
pass
|
||||||
elif test=='1101111':
|
elif test == '1101111':
|
||||||
pass
|
pass
|
||||||
elif test=='1100111':
|
elif test == '1100111':
|
||||||
pass
|
pass
|
||||||
elif test=='0110111':
|
elif test == '0110111':
|
||||||
pass
|
pass
|
||||||
def imm_gen(inst_code,imm_out):
|
return 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
|
|
||||||
|
@ -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):
|
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):
|
if id_ex_memread and (id_ex_rd==if_id_rs1 or id_ex_rd==if_id_rs2):
|
||||||
stall=1
|
stall='1'
|
||||||
else:
|
else:
|
||||||
stall=0
|
stall='0'
|
||||||
return stall
|
return stall
|
@ -1,5 +1,10 @@
|
|||||||
class insn_mem:
|
class insn_mem:
|
||||||
memory=[8*'0']*4*1024*16
|
memory = [8*'0']*4*1024*16
|
||||||
def fetch(self,address):
|
|
||||||
insn=self.memory[address]
|
def __init__(self) -> None:
|
||||||
return insn
|
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