diff --git a/tools/oneclick/components/bf_unit.py b/tools/oneclick/components/bf_unit.py index 83d4b9fe898a518df5d0129c1607ede5aab35126..254964ce28f4b12090ab515d8de3e65362e9f087 100644 --- a/tools/oneclick/components/bf_unit.py +++ b/tools/oneclick/components/bf_unit.py @@ -62,11 +62,11 @@ class bf_unit(Component): self.vhdl_file_name = None self.set_vhdl_strings(self, VHDL_INST, VHDL_CONSTANTS, VHDL_SIGNALS, VHDL_LIB) - - self.mm_regs = [ ('bf_unit_ram_ss_ss_wide', 4), \ - ('bf_unit_ram_bf_weights', 5), \ - ('bf_unit_ram_st_sst' , 3), \ - ('bf_unit_reg_st_sst' , 6) ] # FIXME These address spans should be derived from parameters + #name, addr_w, RL, force base addr + self.mm_regs = [ ('bf_unit_ram_ss_ss_wide', 4, 1, None), \ + ('bf_unit_ram_bf_weights', 5, 1, None), \ + ('bf_unit_ram_st_sst' , 3, 1, None), \ + ('bf_unit_reg_st_sst' , 6, 1, None) ] # FIXME These address spans should be derived from parameters # self.set_output('snk_in_arr', (nof_streams, data_width)) # self.set_output('src_out', (data_width)) diff --git a/tools/oneclick/components/component.py b/tools/oneclick/components/component.py index 611350ea0d4b26e1ff99ddaccba0f1c434ff7593..37acdd2ba3f26037e1f32924a721f8ab35f95498 100644 --- a/tools/oneclick/components/component.py +++ b/tools/oneclick/components/component.py @@ -355,7 +355,7 @@ class Component(mp.Process): self.terminate_components() def generate(self, target_vhdl_file=None): - if self.components != []: + if self.components != []: # Sub-components determine the contents of this generated file (e.g. top level) target_vhdl_file = open(self.vhdl_file_name, "w") ############################################################################### # ASTRON HEADER, INFO @@ -441,7 +441,6 @@ class Component(mp.Process): ############################################################################### # Iterate through internal components for component in self.components: - component.generate() target_vhdl_file.write(component.vhdl_name_comment_block) @@ -464,10 +463,10 @@ class Component(mp.Process): hdllib_file.write('synth_files =\n') for component in self.components: if component.vhdl_file_name != None: - hdllib_file.write(' %s\n' %component.vhdl_file_name) - hdllib_file.write(' %s\n' %self.vhdl_file_name) + hdllib_file.write(' ../%s\n' %component.vhdl_file_name) + hdllib_file.write(' ../%s\n' %self.vhdl_file_name) hdllib_file.write('test_bench_files =\n') - hdllib_file.write(' generated/tb_%s.vhd\n' %self.name) + hdllib_file.write(' tb_%s.vhd\n' %self.name) hdllib_file.write('quartus_copy_files =\n') hdllib_file.write(' qsys_mm_master.qsys .\n') @@ -496,6 +495,9 @@ class Component(mp.Process): pin_file.write('source $::env(UNB)/Firmware/designs/unb_common/src/tcl/COMMON_NODE_sensor_pins.tcl\n') pin_file.close() + for component in self.components: # Chance for subcomponents to run their own overloaded generate() + component.generate() + def get_vhdl_instance(self): # Only base components have a pre-declared VHDL instance. Composites do not. if hasattr(self, 'vhdl_instance'): diff --git a/tools/oneclick/components/ctrl_unb1_board.py b/tools/oneclick/components/ctrl_unb1_board.py index e16018a75ad7c5b492cf39fd84d45456c0552542..fea59af5579bfcf532571d09797d390aa03a93c4 100644 --- a/tools/oneclick/components/ctrl_unb1_board.py +++ b/tools/oneclick/components/ctrl_unb1_board.py @@ -170,7 +170,17 @@ class ctrl_unb1_board(Component): self.set_vhdl_strings(self, VHDL_INST, VHDL_CONSTANTS, VHDL_SIGNALS, VHDL_LIB) self.vhdl_port_declarations = VHDL_PORT_DECLARATIONS - + #name, addr_w, RL, force base addr + self.mm_regs = [ ('eth1g_tse', 10, 0, None), \ + ('eth1g_reg', 4, 1, None), \ + ('eth1g_ram', 10, 1, None), \ + ('reg_unb_sens', 3, 1, None), \ + ('reg_epcs', 3, 1, None), \ + ('reg_remu', 3, 1, None), \ + ('reg_ppsh', 1, 1, None), \ + ('reg_unb_system_info', 5, 1, 0x0), \ + ('rom_unb_system_info', 10, 1, 0x1000), \ + ('reg_wdi', 1, 1, None)] # self.set_output('snk_in_arr', (nof_streams, data_width)) # UDP offload # self.set_output('src_out_arr', (data_width)) # UDP offload diff --git a/tools/oneclick/components/mm_master.py b/tools/oneclick/components/mm_master.py index 9f3cf7cf8e791bddf5828e638ec283c8a42512b8..4dc2844ef4ac9ca38cf88b5e53af625f5e0477dc 100644 --- a/tools/oneclick/components/mm_master.py +++ b/tools/oneclick/components/mm_master.py @@ -8,15 +8,84 @@ VHDL_INST_TOP = """ u_mm_master : ENTITY work.mm_master ) PORT MAP( mm_rst => mm_rst, - mm_clk => mm_clk, -""" + mm_clk => mm_clk, + eth1g_mm_rst => eth1g_mm_rst, + eth1g_reg_interrupt => eth1g_reg_interrupt, + pout_wdi => pout_wdi""" VHDL_INST_BOTTOM = """ - -- PIOs - pout_wdi => pout_wdi ); """ +VHDL_ENTITY_TOP = """ +ENTITY DESIGN_NAME IS + GENERIC ( + g_sim : BOOLEAN := FALSE; --FALSE: use QSYS; TRUE: use mm_file I/O + g_sim_unb_nr : NATURAL := 0; + g_sim_node_nr : NATURAL := 0 + ); + PORT ( + mm_rst : IN STD_LOGIC; + mm_clk : IN STD_LOGIC; + eth1g_mm_rst : OUT STD_LOGIC; + eth1g_reg_interrupt : IN STD_LOGIC; + pout_wdi : OUT STD_LOGIC""" + +VHDL_ENTITY_BOTTOM = """ + ); +END DESIGN_NAME; +""" + +# FIXME - The coe_* should all be renamed to new style as it makes automation impossible. +QSYS_INST_BEGIN = """ + mm_rst_n <= NOT mm_rst; + + gen_qsys_mm_master : IF g_sim = FALSE GENERATE + u_qsys_mm_master : qsys_mm_master + PORT MAP ( + clk_0 => mm_clk, + reset_n => mm_rst_n, + + eth1g_mm_rst => eth1g_mm_rst, + eth1g_irq => eth1g_reg_interrupt, + out_port_from_the_pio_wdi => pout_wdi""" + +QSYS_EXPORT_PORT_MAP = """ $name_address_export => $name_mosi.address($addr_width-1 DOWNTO 0), + $name_clk_export => OPEN, + $name_read_export => $name_mosi.rd, + $name_readdata_export => $name_miso.rddata(c_word_w-1 DOWNTO 0), + $name_reset_export => OPEN, + $name_write_export => $name_mosi.wr, + $name_writedata_export => $name_mosi.wrdata(c_word_w-1 DOWNTO 0)""" + +QSYS_INST_END = """ + ); + END GENERATE; + +""" + +QSYS_COMPONENT_DECLARATION_BEGIN = """ + COMPONENT QSYS_MM_MASTER IS + PORT ( + clk_0 : IN STD_LOGIC; + reset_n : IN STD_LOGIC; + + eth1g_mm_rst : OUT STD_LOGIC; + eth1g_irq : IN STD_LOGIC; + out_port_from_the_pio_wdi : OUT STD_LOGIC""" + +QSYS_COMPONENT_DECLARATION_PORT_MAP = """ $name_address_export : OUT STD_LOGIC_VECTOR($addr_width-1 DOWNTO 0); + $name_clk_export : OUT STD_LOGIC; + $name_read_export : OUT STD_LOGIC; + $name_readdata_export : IN STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); + $name_reset_export : OUT STD_LOGIC; + $name_write_export : OUT STD_LOGIC; + $name_writedata_export : OUT STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0)""" + +QSYS_COMPONENT_DECLARATION_END = """ + ); + END COMPONENT QSYS_MM_MASTER; +""" class mm_master(Component): """ @@ -27,6 +96,8 @@ class mm_master(Component): def __init__(self, slave_components): Component.__init__(self, name='mm_master') + self.slave_components = slave_components + # Create a list of peripherals to pass to QSYS generator peripheral_list = [] base_address = 0x5000 @@ -54,16 +125,104 @@ class mm_master(Component): # Create MMM wrapper for the generated QSYS # . No Python function to call, so we need to execute the mmm_gen.py script on the command line? - # FIXME - mmm_gen.py errors out. - -# # Create the correct port mapping -# self.vhdl_inst_mid = '' -# for slave_component in slave_components: -# print slave_component.vhdl_signals + # FIXME - mmm_gen.py errors out and is difficult to integrate. Using self.generate() isntead. -# self.vhdl_instance = VHDL_INST_TOP+self.vhdl_inst_mid+VHDL_INST_BOTTOM + # Create this (mm_master.vhd) VHDL instance + vhdl_inst_mid = '' + for slave_component in slave_components: + for mm_reg in slave_component.mm_regs: +# print mm_reg + name = mm_reg[0] + vhdl_inst_mid+=',\n %s_mosi => %s_mosi,\n %s_miso => %s_miso' %(name,name,name,name) +# print vhdl_inst_mid + self.vhdl_instance = VHDL_INST_TOP+vhdl_inst_mid+VHDL_INST_BOTTOM self.vhdl_lib = '' + + def generate(self): + target_vhdl_file = open(self.vhdl_file_name, "w") + ############################################################################### + # ASTRON HEADER, INFO + ############################################################################### + target_vhdl_file.write(ASTRON_HEADER) + target_vhdl_file.write('\n') + + ############################################################################### + # USED LIBRARIES + ############################################################################### + target_vhdl_file.write(STANDARD_LIBS) + + ############################################################################### + # ENTITY DECLARATION + ############################################################################### + target_vhdl_file.write(VHDL_ENTITY_TOP.replace('DESIGN_NAME', self.name)) + + vhdl_entity_mid = '' + for slave_component in self.slave_components: + for mm_reg in slave_component.mm_regs: +# print mm_reg + name = mm_reg[0] + vhdl_entity_mid+=';\n %s_mosi : OUT t_mem_mosi;\n %s_miso : IN t_mem_miso' %(name,name) + target_vhdl_file.write(vhdl_entity_mid) + + target_vhdl_file.write(VHDL_ENTITY_BOTTOM.replace('DESIGN_NAME', self.name)) + + ############################################################################### + # ARCHITECTURE DECLARATION + ############################################################################### + target_vhdl_file.write('ARCHITECTURE str OF %s IS\n\n' %self.name) + + ############################################################################### + # CONSTANT, SIGNAL, COMPONENT DECLARATIONS + ############################################################################### + target_vhdl_file.write(QSYS_COMPONENT_DECLARATION_BEGIN) + + qsys_comp_decl = '' + for slave_component in self.slave_components: + for mm_reg in slave_component.mm_regs: +# print mm_reg + name = mm_reg[0] + addr_width = mm_reg[1] + rl=mm_reg[2] + qsys_comp_decl+=';\n\n'+QSYS_COMPONENT_DECLARATION_PORT_MAP.replace('$name', name).replace('$addr_width', str(addr_width)) + if rl==0: + qsys_comp_decl+=';\n\n %s_waitrequest : IN STD_LOGIC' %(name) + target_vhdl_file.write(qsys_comp_decl) + + target_vhdl_file.write(QSYS_COMPONENT_DECLARATION_END) + + target_vhdl_file.write(' SIGNAL mm_rst_n : STD_LOGIC;\n') + + ############################################################################### + # ARCHITECTURE BEGIN + ############################################################################### + target_vhdl_file.write('BEGIN\n') + + ############################################################################### + # QSYS INSTANCE + ############################################################################### + target_vhdl_file.write(QSYS_INST_BEGIN) + + qsys_inst_mid = '' + for slave_component in self.slave_components: + for mm_reg in slave_component.mm_regs: +# print mm_reg + name = mm_reg[0] + addr_width = mm_reg[1] + rl=mm_reg[2] + qsys_inst_mid+=',\n\n'+QSYS_EXPORT_PORT_MAP.replace('$name', name).replace('$addr_width', str(addr_width)) + if rl==0: + qsys_inst_mid+=',\n\n %s_waitrequest => %s_miso.waitrequest' %(name,name) + target_vhdl_file.write(qsys_inst_mid) + + target_vhdl_file.write(QSYS_INST_END) + + ############################################################################### + # ARCHITECTURE END + ############################################################################### + target_vhdl_file.write('\nEND str;\n') + target_vhdl_file.close() + def run(self): # No model pass