Line 6... |
Line 6... |
Top Level of the System Design
|
Top Level of the System Design
|
|
|
: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: top.py 3 2010-11-21 07:17:00Z rockee $
|
:revision: $Id: top.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 *
|
Line 40... |
Line 40... |
data_out.next = imem[address[:2]]
|
data_out.next = imem[address[:2]]
|
return instances()
|
return instances()
|
|
|
def SysTop(txd_line, rxd_line, txd_line2, rxd_line2, leds, reset, clock,
|
def SysTop(txd_line, rxd_line, txd_line2, rxd_line2, leds, reset, clock,
|
|
|
# if __debug__:
|
# Ports only for debug
|
debug_if_program_counter,
|
debug_if_program_counter=0,
|
|
|
debug_of_alu_op,
|
|
debug_of_alu_src_a,
|
|
debug_of_alu_src_b,
|
|
debug_of_branch_cond,
|
|
debug_of_carry,
|
|
debug_of_carry_keep,
|
|
debug_of_delay,
|
|
debug_of_hazard,
|
|
debug_of_immediate,
|
|
debug_of_instruction,
|
|
debug_of_mem_read,
|
|
debug_of_mem_write,
|
|
debug_of_operation,
|
|
debug_of_program_counter,
|
|
debug_of_reg_a,
|
|
debug_of_reg_b,
|
|
debug_of_reg_d,
|
|
debug_of_reg_write,
|
|
debug_of_transfer_size,
|
|
|
|
debug_of_fwd_mem_result,
|
|
debug_of_fwd_reg_d,
|
|
debug_of_fwd_reg_write,
|
|
|
|
debug_gprf_dat_a,
|
|
debug_gprf_dat_b,
|
|
debug_gprf_dat_d,
|
|
|
|
debug_ex_alu_result,
|
|
debug_ex_reg_d,
|
|
debug_ex_reg_write,
|
|
|
|
debug_ex_branch,
|
|
debug_ex_dat_d,
|
|
debug_ex_flush_id,
|
|
debug_ex_mem_read,
|
|
debug_ex_mem_write,
|
|
debug_ex_program_counter,
|
|
debug_ex_transfer_size,
|
|
|
|
debug_ex_dat_a,
|
debug_of_alu_op=0,
|
debug_ex_dat_b,
|
debug_of_alu_src_a=0,
|
debug_ex_instruction,
|
debug_of_alu_src_b=0,
|
debug_ex_reg_a,
|
debug_of_branch_cond=0,
|
debug_ex_reg_b,
|
debug_of_carry=0,
|
|
debug_of_carry_keep=0,
|
|
debug_of_delay=0,
|
|
debug_of_hazard=0,
|
|
debug_of_immediate=0,
|
|
debug_of_instruction=0,
|
|
debug_of_mem_read=0,
|
|
debug_of_mem_write=0,
|
|
debug_of_operation=0,
|
|
debug_of_program_counter=0,
|
|
debug_of_reg_a=0,
|
|
debug_of_reg_b=0,
|
|
debug_of_reg_d=0,
|
|
debug_of_reg_write=0,
|
|
debug_of_transfer_size=0,
|
|
|
|
debug_of_fwd_mem_result=0,
|
|
debug_of_fwd_reg_d=0,
|
|
debug_of_fwd_reg_write=0,
|
|
|
|
debug_gprf_dat_a=0,
|
|
debug_gprf_dat_b=0,
|
|
debug_gprf_dat_d=0,
|
|
|
|
debug_ex_alu_result=0,
|
|
debug_ex_reg_d=0,
|
|
debug_ex_reg_write=0,
|
|
|
|
debug_ex_branch=0,
|
|
debug_ex_dat_d=0,
|
|
debug_ex_flush_id=0,
|
|
debug_ex_mem_read=0,
|
|
debug_ex_mem_write=0,
|
|
debug_ex_program_counter=0,
|
|
debug_ex_transfer_size=0,
|
|
|
|
debug_ex_dat_a=0,
|
|
debug_ex_dat_b=0,
|
|
debug_ex_instruction=0,
|
|
debug_ex_reg_a=0,
|
|
debug_ex_reg_b=0,
|
|
|
|
debug_mm_alu_result=0,
|
|
debug_mm_mem_read=0,
|
|
debug_mm_reg_d=0,
|
|
debug_mm_reg_write=0,
|
|
debug_mm_transfer_size=0,
|
|
|
|
debug_dmem_ena_in=0,
|
|
debug_dmem_data_in=0,
|
|
debug_dmem_data_out=0,
|
|
debug_dmem_sel_out=0,
|
|
debug_dmem_we_out=0,
|
|
debug_dmem_addr_out=0,
|
|
debug_dmem_ena_out=0,
|
|
debug_dmem_ena=0,
|
|
|
|
debug_imem_data_in=0,
|
|
debug_imem_data_out=0,
|
|
debug_imem_sel_out=0,
|
|
debug_imem_we_out=0,
|
|
debug_imem_addr_out=0,
|
|
debug_imem_ena=0,
|
|
debug_imem_ena_out=0,
|
|
|
debug_mm_alu_result,
|
size=4, DEBUG=True):
|
debug_mm_mem_read,
|
|
debug_mm_reg_d,
|
|
debug_mm_reg_write,
|
|
debug_mm_transfer_size,
|
|
|
|
debug_dmem_ena_in,
|
|
debug_dmem_data_in,
|
|
debug_dmem_data_out,
|
|
debug_dmem_sel_out,
|
|
debug_dmem_we_out,
|
|
debug_dmem_addr_out,
|
|
debug_dmem_ena_out,
|
|
debug_dmem_ena,
|
|
|
|
debug_imem_data_in,
|
|
debug_imem_data_out,
|
|
debug_imem_sel_out,
|
|
debug_imem_we_out,
|
|
debug_imem_addr_out,
|
|
debug_imem_ena,
|
|
debug_imem_ena_out,
|
|
|
|
size=4):
|
|
rx_data = Signal(intbv(0)[32:])
|
rx_data = Signal(intbv(0)[32:])
|
rx_avail = Signal(False)
|
rx_avail = Signal(False)
|
rx_error = Signal(False)
|
rx_error = Signal(False)
|
read_en = Signal(False)
|
read_en = Signal(False)
|
tx_data = Signal(intbv(0)[32:])
|
tx_data = Signal(intbv(0)[32:])
|
Line 182... |
Line 182... |
dmem_ena_out=dmem_ena_out,
|
dmem_ena_out=dmem_ena_out,
|
imem_data_in=imem_data_in,
|
imem_data_in=imem_data_in,
|
imem_addr_out=imem_addr_out,
|
imem_addr_out=imem_addr_out,
|
imem_ena_out=imem_ena_out,
|
imem_ena_out=imem_ena_out,
|
|
|
# if __debug__:
|
# Ports only for debug
|
debug_if_program_counter=debug_if_program_counter,
|
debug_if_program_counter=debug_if_program_counter,
|
|
|
debug_of_alu_op=debug_of_alu_op,
|
debug_of_alu_op=debug_of_alu_op,
|
debug_of_alu_src_a=debug_of_alu_src_a,
|
debug_of_alu_src_a=debug_of_alu_src_a,
|
debug_of_alu_src_b=debug_of_alu_src_b,
|
debug_of_alu_src_b=debug_of_alu_src_b,
|
Line 236... |
Line 236... |
debug_mm_alu_result=debug_mm_alu_result,
|
debug_mm_alu_result=debug_mm_alu_result,
|
debug_mm_mem_read=debug_mm_mem_read,
|
debug_mm_mem_read=debug_mm_mem_read,
|
debug_mm_reg_d=debug_mm_reg_d,
|
debug_mm_reg_d=debug_mm_reg_d,
|
debug_mm_reg_write=debug_mm_reg_write,
|
debug_mm_reg_write=debug_mm_reg_write,
|
debug_mm_transfer_size=debug_mm_transfer_size,
|
debug_mm_transfer_size=debug_mm_transfer_size,
|
|
|
|
DEBUG=DEBUG,
|
)
|
)
|
|
|
uart = UART(rx_data, rx_avail, rx_error, read_en,
|
uart = UART(rx_data, rx_avail, rx_error, read_en,
|
tx_data, tx_busy, write_en,
|
tx_data, tx_busy, write_en,
|
uart_rxd, uart_txd, reset, clock,
|
uart_rxd, uart_txd, reset, clock,
|
Line 258... |
Line 260... |
else:
|
else:
|
dmem_sel.next = 0
|
dmem_sel.next = 0
|
tx_data.next = dmem_data_out
|
tx_data.next = dmem_data_out
|
if dmem_addr_out < 2**size:
|
if dmem_addr_out < 2**size:
|
dmem_ena.next = dmem_ena_out
|
dmem_ena.next = dmem_ena_out
|
#dmem_ena_in.next = True
|
|
write_en.next = False
|
write_en.next = False
|
elif dmem_we_out and dmem_addr_out[28:] >= 0xfffffb0:
|
elif dmem_we_out and dmem_addr_out[28:] >= 0xfffffc0:
|
dmem_ena.next = False
|
dmem_ena.next = False
|
#dmem_ena_in.next = not tx_busy
|
dmem_ena_in.next = not tx_busy
|
write_en.next = True
|
write_en.next = True
|
else:
|
else:
|
write_en.next = False
|
write_en.next = False
|
dmem_ena.next = False
|
dmem_ena.next = False
|
#dmem_ena_in.next = True
|
|
|
|
#leds.next = concat(led_reg[4:], led_low[4:])
|
#leds.next = concat(led_reg[4:], led_low[4:])
|
leds.next = led_reg[8:]
|
leds.next = led_reg[8:]
|
|
|
count = Signal(intbv(0)[20:])
|
count = Signal(intbv(0)[20:])
|
Line 295... |
Line 295... |
uart_rxd.next = rxd_line
|
uart_rxd.next = rxd_line
|
txd_line2.next = uart_txd2
|
txd_line2.next = uart_txd2
|
uart_rxd2.next = rxd_line2
|
uart_rxd2.next = rxd_line2
|
read_en.next = False
|
read_en.next = False
|
count.next = (count+1)%(2**20)
|
count.next = (count+1)%(2**20)
|
if count == 0:
|
#if count == 0:
|
led_low.next = concat(led_low[31:], led_low[31])
|
#led_low.next = concat(led_low[31:], led_low[31])
|
|
|
#if write_en and not tx_busy:
|
#if write_en and not tx_busy:
|
#led_reg.next = concat(led_reg[31:], led_reg[31])
|
#led_reg.next = concat(led_reg[31:], led_reg[31])
|
#if dmem_we_out and dmem_addr_out[28:] == 0xFFFFFB0:
|
if dmem_we_out and dmem_addr_out[28:] == 0xFFFFFB0:
|
#led_reg.next = dmem_data_out
|
led_reg.next = dmem_data_out
|
#else:
|
else:
|
#led_reg.next = led_reg
|
led_reg.next = led_reg
|
#led_reg.next = concat(dmem_ena_in, dmem_we_out, dmem_ena_out,
|
#led_reg.next = concat(dmem_ena_in, dmem_we_out, dmem_ena_out,
|
#write_en,)
|
#write_en,)
|
if imem_addr_out == 0x244:
|
#if imem_addr_out == 0x244:
|
led_reg.next = 0xff
|
#led_reg.next = 0xff
|
|
|
|
|
@always_comb
|
@always_comb
|
def debug_output():
|
def debug_output():
|
debug_dmem_ena_in.next = dmem_ena_in
|
debug_dmem_ena_in.next = dmem_ena_in
|
Line 329... |
Line 329... |
debug_imem_we_out.next = imem_we_out
|
debug_imem_we_out.next = imem_we_out
|
debug_imem_addr_out.next = imem_addr_out
|
debug_imem_addr_out.next = imem_addr_out
|
debug_imem_ena.next = imem_ena
|
debug_imem_ena.next = imem_ena
|
debug_imem_ena_out.next = imem_ena_out
|
debug_imem_ena_out.next = imem_ena_out
|
|
|
return instances()
|
if DEBUG:
|
|
return imem, dmem, core, uart, uart2, glue, run, debug_output
|
|
|
|
return imem, dmem, core, uart, uart2, glue, run
|
|
|
import sys
|
import sys
|
from numpy import log2
|
from numpy import log2
|
|
|
def TopBench():
|
def TopBench():
|
Line 422... |
Line 425... |
debug_imem_ena = Signal(True)
|
debug_imem_ena = Signal(True)
|
debug_imem_ena_out = Signal(False)
|
debug_imem_ena_out = Signal(False)
|
|
|
top = SysTop(txd_line, rxd_line, txd_line2, rxd_line2, leds, reset, clock,
|
top = SysTop(txd_line, rxd_line, txd_line2, rxd_line2, leds, reset, clock,
|
|
|
# if __debug__:
|
# Ports only for debug
|
debug_if_program_counter,
|
debug_if_program_counter,
|
|
|
debug_of_alu_op,
|
debug_of_alu_op,
|
debug_of_alu_src_a,
|
debug_of_alu_src_a,
|
debug_of_alu_src_b,
|
debug_of_alu_src_b,
|
Line 511... |
Line 514... |
reset.next = False
|
reset.next = False
|
yield delay(37)
|
yield delay(37)
|
reset.next = True
|
reset.next = True
|
yield delay(53)
|
yield delay(53)
|
reset.next = False
|
reset.next = False
|
for i in range(2000):
|
for i in range(3000):
|
yield clock.negedge
|
yield clock.negedge
|
reset.next = False
|
reset.next = False
|
yield delay(37)
|
yield delay(37)
|
reset.next = True
|
reset.next = True
|
yield delay(53)
|
yield delay(53)
|
reset.next = False
|
reset.next = False
|
for i in range(2000):
|
for i in range(3000):
|
yield clock.negedge
|
yield clock.negedge
|
|
|
raise StopSimulation
|
raise StopSimulation
|
|
|
@instance
|
@instance
|
Line 537... |
Line 540... |
#if debug_ex_program_counter == 0x244:
|
#if debug_ex_program_counter == 0x244:
|
#print 'reach the second xil_print call'
|
#print 'reach the second xil_print call'
|
if debug_dmem_addr_out == 0xffffffc0:
|
if debug_dmem_addr_out == 0xffffffc0:
|
#if debug_dmem_sel_out == 0b1000:
|
#if debug_dmem_sel_out == 0b1000:
|
if debug_dmem_we_out:
|
if debug_dmem_we_out:
|
#sys.stdout.write(chr(int(debug_dmem_data_out[8:])))
|
sys.stdout.write(chr(int(debug_dmem_data_out[8:])))
|
#sys.stdout.flush()
|
sys.stdout.flush()
|
print int(debug_dmem_data_out[8:])
|
#print int(debug_dmem_data_out[8:])
|
#print 'output: %d' % debug_dmem_data_out[8:]
|
#print 'output: %d' % debug_dmem_data_out[8:]
|
|
|
|
|
|
|
|
|
Line 599... |
Line 602... |
|
|
|
|
return instances()
|
return instances()
|
|
|
if __name__ == '__main__':
|
if __name__ == '__main__':
|
if 1:
|
if 0:
|
#tb = traceSignals(TopBench)
|
tb = traceSignals(TopBench)
|
#Simulation(tb).run()
|
Simulation(tb).run()
|
conversion.verify.simulator = 'icarus'
|
#conversion.verify.simulator = 'icarus'
|
conversion.verify(TopBench)
|
#conversion.verify(TopBench)
|
else:
|
else:
|
prepare()
|
prepare()
|
txd_line = Signal(False)
|
txd_line = Signal(False)
|
rxd_line = Signal(False)
|
rxd_line = Signal(False)
|
txd_line2 = Signal(False)
|
txd_line2 = Signal(False)
|
Line 616... |
Line 619... |
reset = Signal(False)
|
reset = Signal(False)
|
clock = Signal(False)
|
clock = Signal(False)
|
size = int(log2(int(sys.argv[1]))) if len(sys.argv) > 1 else 4
|
size = int(log2(int(sys.argv[1]))) if len(sys.argv) > 1 else 4
|
print 'size=%s' % size
|
print 'size=%s' % size
|
#toVHDL(uart_test_top, txd_line, rxd_line, leds, reset, clock)
|
#toVHDL(uart_test_top, txd_line, rxd_line, leds, reset, clock)
|
toVerilog(SysTop, txd_line, rxd_line, txd_line2, rxd_line2, leds, reset, clock, size=size)
|
toVerilog(SysTop, txd_line, rxd_line, txd_line2, rxd_line2, leds, reset,
|
|
clock, size=size, DEBUG=False)
|
|
|
|
|
|
|
### 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:
|
|
|