Line 6... |
Line 6... |
Instruction Decoder
|
Instruction Decoder
|
|
|
:copyright: Copyright (c) 2010 Jian Luo
|
:copyright: Copyright (c) 2010 Jian Luo
|
:author-email: jian.luo.cn(at_)gmail.com
|
:author-email: jian.luo.cn(at_)gmail.com
|
:license: LGPL, see LICENSE for details
|
:license: LGPL, see LICENSE for details
|
:revision: $Id: decoder.py 5 2010-11-21 10:59:30Z rockee $
|
:revision: $Id: decoder.py 6 2010-11-21 23:18:44Z rockee $
|
"""
|
"""
|
|
|
from random import randrange
|
from random import randrange
|
from myhdl import *
|
from myhdl import *
|
from defines import *
|
from defines import *
|
from functions import *
|
from functions import *
|
from gprf import *
|
from gprf import *
|
from debug import *
|
#from debug import *
|
|
|
def Decoder(
|
def Decoder(
|
# Inputs
|
# Inputs
|
clock,
|
clock,
|
reset,
|
reset,
|
Line 59... |
Line 59... |
# Write back stage outputs
|
# Write back stage outputs
|
of_fwd_mem_result,
|
of_fwd_mem_result,
|
of_fwd_reg_d,
|
of_fwd_reg_d,
|
of_fwd_reg_write,
|
of_fwd_reg_write,
|
|
|
# XXX: if __debug__:
|
# Ports only for debug
|
#of_instruction=False,
|
of_instruction=0,
|
):
|
):
|
"""
|
"""
|
Python System Model of the OF Stage
|
Python System Model of the OF Stage
|
"""
|
"""
|
of_comb_r_has_imm_high = Signal(False)
|
of_comb_r_has_imm_high = Signal(False)
|
Line 176... |
Line 176... |
#if cfg_reg_fwd_wrb == True:
|
#if cfg_reg_fwd_wrb == True:
|
of_fwd_mem_result.next = wb_dat_d
|
of_fwd_mem_result.next = wb_dat_d
|
of_fwd_reg_d.next = mm_reg_d
|
of_fwd_reg_d.next = mm_reg_d
|
of_fwd_reg_write.next = mm_reg_write
|
of_fwd_reg_write.next = mm_reg_write
|
|
|
#if __debug__:
|
|
#if 0: # DEBUG_VERBOSE:
|
|
#print 'OF reged:', of_reg_write, of_reg_d,' ra:', of_reg_a
|
|
#print 'OF reged pc:', of_r_program_counter
|
|
#print 'OF rd:', mm_reg_write, mm_reg_d, wb_dat_d,
|
|
#print ' ra:', imem_data_in[21:16]
|
|
#print 'OF pc:', of_comb_program_counter
|
|
|
|
@always_comb
|
@always_comb
|
def regout():
|
def regout():
|
of_hazard.next = of_r_hazard
|
of_hazard.next = of_r_hazard
|
of_mem_read.next = of_r_mem_read
|
of_mem_read.next = of_r_mem_read
|
of_reg_d.next = of_r_reg_d
|
of_reg_d.next = of_r_reg_d
|
#if __debug__:
|
if __debug__:
|
#of_instruction.next = of_r_instruction
|
of_instruction.next = of_r_instruction
|
|
|
@always_comb
|
@always_comb
|
def comb():
|
def comb():
|
# XXX intbvs should be explicitly declared
|
# XXX intbvs should be explicitly declared
|
# Register
|
# Register
|
Line 203... |
Line 195... |
r_program_counter = intbv(0)[CFG_IMEM_SIZE:]
|
r_program_counter = intbv(0)[CFG_IMEM_SIZE:]
|
r_program_counter[:] = if_program_counter
|
r_program_counter[:] = if_program_counter
|
r_immediate_high = intbv(0)[16:]
|
r_immediate_high = intbv(0)[16:]
|
r_has_imm_high = False
|
r_has_imm_high = False
|
r_reg_d = intbv(0)[5:]
|
r_reg_d = intbv(0)[5:]
|
# Local
|
# Local Variables
|
r_hazard = False
|
r_hazard = False
|
immediate = intbv(0)[32:]
|
immediate = intbv(0)[32:]
|
#r_immediate_high = intbv(0)[16:]
|
|
immediate_low = intbv(0)[16:]
|
immediate_low = intbv(0)[16:]
|
instruction = intbv(0)[32:]
|
instruction = intbv(0)[32:]
|
mem_result = intbv(0)[32:]
|
mem_result = intbv(0)[32:]
|
opcode = intbv(0)[6:]
|
opcode = intbv(0)[6:]
|
opgroup = intbv(0)[5:]
|
opgroup = intbv(0)[5:]
|
Line 219... |
Line 210... |
reg_b = intbv(0)[5:]
|
reg_b = intbv(0)[5:]
|
|
|
if mm_mem_read:
|
if mm_mem_read:
|
mem_result[:] = align_mem_load(dmem_data_in, mm_transfer_size,
|
mem_result[:] = align_mem_load(dmem_data_in, mm_transfer_size,
|
mm_alu_result[2:])
|
mm_alu_result[2:])
|
#print 'of: load %x' % mem_result
|
|
else:
|
else:
|
mem_result[:] = mm_alu_result
|
mem_result[:] = mm_alu_result
|
|
|
wb_dat_d.next = mem_result
|
wb_dat_d.next = mem_result
|
|
|
Line 491... |
Line 481... |
if __name__ == '__main__':
|
if __name__ == '__main__':
|
clock = Signal(False)
|
clock = Signal(False)
|
reset = Signal(False)
|
reset = Signal(False)
|
enable = Signal(False)
|
enable = Signal(False)
|
|
|
dmem_data_in = Signal(intbv(0)[32:])
|
dmem_data_in = Signal(intbv(0)[CFG_DMEM_WIDTH:])
|
imem_data_in = Signal(intbv(0)[32:])
|
imem_data_in = Signal(intbv(0)[CFG_IMEM_WIDTH:])
|
if_program_counter = Signal(intbv(0)[CFG_IMEM_SIZE:])
|
if_program_counter = Signal(intbv(0)[CFG_IMEM_SIZE:])
|
ex_flush_id = Signal(False)
|
ex_flush_id = Signal(False)
|
mm_alu_result = Signal(intbv(0)[32:])
|
mm_alu_result = Signal(intbv(0)[CFG_DMEM_WIDTH:])
|
mm_mem_read = Signal(False)
|
mm_mem_read = Signal(False)
|
mm_reg_d = Signal(intbv(0)[5:])
|
mm_reg_d = Signal(intbv(0)[CFG_GPRF_SIZE:])
|
mm_reg_write = Signal(False)
|
mm_reg_write = Signal(False)
|
mm_transfer_size = Signal(transfer_size_type.WORD)
|
mm_transfer_size = Signal(transfer_size_type.WORD)
|
gprf_dat_a = Signal(intbv(0)[CFG_DMEM_WIDTH:])
|
gprf_dat_a = Signal(intbv(0)[CFG_DMEM_WIDTH:])
|
gprf_dat_b = Signal(intbv(0)[CFG_DMEM_WIDTH:])
|
gprf_dat_b = Signal(intbv(0)[CFG_DMEM_WIDTH:])
|
gprf_dat_d = Signal(intbv(0)[CFG_DMEM_WIDTH:])
|
gprf_dat_d = Signal(intbv(0)[CFG_DMEM_WIDTH:])
|
Line 511... |
Line 501... |
of_branch_cond = Signal(branch_condition.NOP)
|
of_branch_cond = Signal(branch_condition.NOP)
|
of_carry = Signal(carry_type.C_ZERO)
|
of_carry = Signal(carry_type.C_ZERO)
|
of_carry_keep = Signal(False)
|
of_carry_keep = Signal(False)
|
of_delay = Signal(False)
|
of_delay = Signal(False)
|
of_hazard = Signal(False)
|
of_hazard = Signal(False)
|
of_immediate = Signal(intbv(0)[32:])
|
of_immediate = Signal(intbv(0)[CFG_DMEM_WIDTH:])
|
of_mem_read = Signal(False)
|
of_mem_read = Signal(False)
|
of_mem_write = Signal(False)
|
of_mem_write = Signal(False)
|
of_operation = Signal(False)
|
of_operation = Signal(False)
|
of_program_counter = Signal(intbv(0)[CFG_IMEM_SIZE:])
|
of_program_counter = Signal(intbv(0)[CFG_IMEM_SIZE:])
|
of_reg_a = Signal(intbv(0)[5:])
|
of_reg_a = Signal(intbv(0)[CFG_GPRF_SIZE:])
|
of_reg_b = Signal(intbv(0)[5:])
|
of_reg_b = Signal(intbv(0)[CFG_GPRF_SIZE:])
|
of_reg_d = Signal(intbv(0)[5:])
|
of_reg_d = Signal(intbv(0)[CFG_GPRF_SIZE:])
|
of_reg_write = Signal(False)
|
of_reg_write = Signal(False)
|
of_transfer_size = Signal(transfer_size_type.WORD)
|
of_transfer_size = Signal(transfer_size_type.WORD)
|
|
of_fwd_mem_result = Signal(intbv(0)[CFG_DMEM_WIDTH:])
|
|
of_fwd_reg_d = Signal(intbv(0)[CFG_GPRF_SIZE:])
|
|
of_fwd_reg_write = Signal(False)
|
|
if __debug__:
|
|
of_instruction = Signal(intbv(0)[CFG_IMEM_WIDTH:])
|
|
# End Ports only for debug
|
|
|
|
|
kw = dict(
|
kw = dict(
|
Decoder,
|
|
clock=clock,
|
clock=clock,
|
reset=reset,
|
reset=reset,
|
enable=enable,
|
enable=enable,
|
dmem_data_in=dmem_data_in,
|
dmem_data_in=dmem_data_in,
|
imem_data_in=imem_data_in,
|
imem_data_in=imem_data_in,
|
Line 557... |
Line 553... |
of_reg_a=of_reg_a,
|
of_reg_a=of_reg_a,
|
of_reg_b=of_reg_b,
|
of_reg_b=of_reg_b,
|
of_reg_d=of_reg_d,
|
of_reg_d=of_reg_d,
|
of_reg_write=of_reg_write,
|
of_reg_write=of_reg_write,
|
of_transfer_size=of_transfer_size,
|
of_transfer_size=of_transfer_size,
|
|
of_fwd_mem_result=of_fwd_mem_result,
|
|
of_fwd_reg_d=of_fwd_reg_d,
|
|
of_fwd_reg_write=of_fwd_reg_write,
|
|
|
)
|
)
|
toVerilog(**kw)
|
toVerilog(Decoder, **kw)
|
toVHDL(**kw)
|
toVHDL(Decoder, **kw)
|
|
|
|
|
### EOF ###
|
### EOF ###
|
# vim:smarttab:sts=4:ts=4:sw=4:et:ai:tw=80:
|
# vim:smarttab:sts=4:ts=4:sw=4:et:ai:tw=80:
|
|
|