# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
"""
|
"""
|
fetch.py
|
fetch.py
|
========
|
========
|
|
|
Fetch Unit
|
Fetch Unit
|
|
|
: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: fetch.py 5 2010-11-21 10:59:30Z rockee $
|
:revision: $Id: fetch.py 6 2010-11-21 23:18:44Z rockee $
|
"""
|
"""
|
|
|
from myhdl import *
|
from myhdl import *
|
from defines import *
|
from defines import *
|
from functions import *
|
from functions import *
|
|
|
def FetchUnit(
|
def FetchUnit(
|
clock,
|
clock,
|
reset,
|
reset,
|
enable,
|
enable,
|
of_hazard,
|
of_hazard,
|
ex_alu_result,
|
ex_alu_result,
|
ex_branch,
|
ex_branch,
|
if_program_counter,
|
if_program_counter,
|
imem_addr_out,
|
imem_addr_out,
|
imem_ena_out,
|
imem_ena_out,
|
):
|
):
|
"""
|
"""
|
"""
|
"""
|
MAX_IMEM_ADDR = 2**CFG_IMEM_SIZE
|
MAX_IMEM_ADDR = 2**CFG_IMEM_SIZE
|
if_comb_r_program_counter = Signal(intbv(0)[CFG_IMEM_SIZE:])
|
if_comb_r_program_counter = Signal(intbv(0)[CFG_IMEM_SIZE:])
|
if_r_program_counter = Signal(intbv(0)[CFG_IMEM_SIZE:])
|
if_r_program_counter = Signal(intbv(0)[CFG_IMEM_SIZE:])
|
|
|
@always_comb
|
@always_comb
|
def comb():
|
def comb():
|
program_counter = intbv(0)[CFG_IMEM_SIZE:]
|
program_counter = intbv(0)[CFG_IMEM_SIZE:]
|
if reset:
|
if reset:
|
program_counter[:] = 0
|
program_counter[:] = 0
|
elif of_hazard:
|
elif of_hazard:
|
program_counter[:] = if_r_program_counter
|
program_counter[:] = if_r_program_counter
|
elif ex_branch:
|
elif ex_branch:
|
program_counter[:] = ex_alu_result[CFG_IMEM_SIZE:]
|
program_counter[:] = ex_alu_result[CFG_IMEM_SIZE:]
|
else:
|
else:
|
#program_counter[:] = ((if_r_program_counter[CFG_IMEM_SIZE:2]+1)
|
#program_counter[:] = ((if_r_program_counter[CFG_IMEM_SIZE:2]+1)
|
#<< 2) % MAX_IMEM_ADDR
|
#<< 2) % MAX_IMEM_ADDR
|
program_counter[:] = (if_r_program_counter+4) % MAX_IMEM_ADDR
|
program_counter[:] = (if_r_program_counter+4) % MAX_IMEM_ADDR
|
if_comb_r_program_counter.next = program_counter
|
if_comb_r_program_counter.next = program_counter
|
#if ex_branch:
|
#if ex_branch:
|
#program_counter[:] = ex_alu_result[CFG_IMEM_SIZE:]
|
#program_counter[:] = ex_alu_result[CFG_IMEM_SIZE:]
|
#else:
|
#else:
|
#program_counter[:] = if_r_program_counter
|
#program_counter[:] = if_r_program_counter
|
###program_counter[:] = ((if_r_program_counter[CFG_IMEM_SIZE:2]+1)
|
###program_counter[:] = ((if_r_program_counter[CFG_IMEM_SIZE:2]+1)
|
###<< 2) % MAX_IMEM_ADDR
|
###<< 2) % MAX_IMEM_ADDR
|
##program_counter[:] = (if_r_program_counter+4) % MAX_IMEM_ADDR
|
##program_counter[:] = (if_r_program_counter+4) % MAX_IMEM_ADDR
|
#if_program_counter.next = program_counter
|
#if_program_counter.next = program_counter
|
#imem_addr_out.next = program_counter
|
#imem_addr_out.next = program_counter
|
#if of_hazard:
|
#if of_hazard:
|
#if_comb_r_program_counter.next = program_counter
|
#if_comb_r_program_counter.next = program_counter
|
#else:
|
#else:
|
#if_comb_r_program_counter.next = (program_counter+4) % MAX_IMEM_ADDR
|
#if_comb_r_program_counter.next = (program_counter+4) % MAX_IMEM_ADDR
|
|
|
@always(clock.posedge)
|
@always(clock.posedge)
|
def seq():
|
def seq():
|
if reset:
|
if reset:
|
if_r_program_counter.next = 0
|
if_r_program_counter.next = 0
|
elif enable:
|
elif enable:
|
if_r_program_counter.next = if_comb_r_program_counter
|
if_r_program_counter.next = if_comb_r_program_counter
|
#if __debug__:
|
|
#print 'pc:=0x%x, enable:=%s, reset:=%s' % (
|
|
#if_comb_r_program_counter, enable, reset)
|
|
|
|
@always_comb
|
@always_comb
|
def regout():
|
def regout():
|
imem_ena_out.next = enable
|
imem_ena_out.next = enable
|
imem_addr_out.next = if_comb_r_program_counter
|
imem_addr_out.next = if_comb_r_program_counter
|
#if __debug__:
|
#if __debug__:
|
#imem_addr_out.next = if_r_program_counter
|
#imem_addr_out.next = if_r_program_counter
|
|
|
if_program_counter.next = if_r_program_counter
|
if_program_counter.next = if_r_program_counter
|
|
|
return instances()
|
return instances()
|
|
|
if __name__ == '__main__':
|
if __name__ == '__main__':
|
clock = Signal(False)
|
clock = Signal(False)
|
reset = Signal(False)
|
reset = Signal(False)
|
enable = Signal(False)
|
enable = Signal(False)
|
imem_addr_out = Signal(intbv(0)[CFG_IMEM_SIZE:])
|
imem_addr_out = Signal(intbv(0)[CFG_IMEM_SIZE:])
|
imem_ena_out = Signal(False)
|
imem_ena_out = Signal(False)
|
if_program_counter = Signal(intbv(0)[CFG_IMEM_SIZE:])
|
if_program_counter = Signal(intbv(0)[CFG_IMEM_SIZE:])
|
of_hazard = Signal(False)
|
of_hazard = Signal(False)
|
ex_alu_result = Signal(intbv(0)[32:])
|
ex_alu_result = Signal(intbv(0)[32:])
|
ex_branch = Signal(False)
|
ex_branch = Signal(False)
|
|
|
args = [
|
args = [
|
FetchUnit,
|
FetchUnit,
|
clock,
|
clock,
|
reset,
|
reset,
|
enable,
|
enable,
|
of_hazard,
|
of_hazard,
|
ex_alu_result,
|
ex_alu_result,
|
ex_branch,
|
ex_branch,
|
if_program_counter,
|
if_program_counter,
|
imem_addr_out,
|
imem_addr_out,
|
imem_ena_out,
|
imem_ena_out,
|
]
|
]
|
toVHDL(*args)
|
toVHDL(*args)
|
toVerilog(*args)
|
toVerilog(*args)
|
|
|
### 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:
|
|
|
|
|