diff --git a/.gitignore b/.gitignore index aecc6f43dfbc1cef30b707c7ced4a2f183a62808..d48ca2f74566bc9d4bf5aef62c990c1321349ac5 100644 --- a/.gitignore +++ b/.gitignore @@ -56,7 +56,6 @@ simulation/VUnit/*.mem *.cf **vivado_libs** .* -simulation/VUnit/** *.qdb *.qtl diff --git a/scripts/filesets/felig_fileset.tcl b/scripts/filesets/felig_fileset.tcl index 0f9157bea4c9efd9acae9050d082abb740e1e7a2..dc6c7763198e2b8a55785220950e5cdd7863447b 100644 --- a/scripts/filesets/felig_fileset.tcl +++ b/scripts/filesets/felig_fileset.tcl @@ -134,11 +134,21 @@ set XDC_FILES_BNL712 [concat $XDC_FILES_BNL712 \ # felig_top_BNL712_v2.0.xdc \ set SIM_FILES [concat $SIM_FILES \ - FELIG/felig_sim_top_bnl712.vhd \ - FELIG/felig_sim_64b66b_decoding.vhd] + FELIG/felig_sim_top_bnl712.vhd\ + FELIG/felig_sim_64b66b_decoding.vhd\ + FELIG/felig_lpgbt_sim.vhd\ + UVVMtests/tb/FELIGemulator_tb.vhd\ + UVVMtests/tb/FELIGlinkwrapperLPGBT_tb.vhd\ + UVVMtests/tb/FELIGexternaltrigger_tb.vhd\ +] set WCFG_FILES [concat $WCFG_FILES \ - FELIG/waveforms/FELIG_phase2_behav.wcfg] + FELIG/waveforms/FELIGemulator_tb_behav.wcfg\ + FELIG/waveforms/FELIGexternaltrigger_tb_behav.wcfg\ + FELIG/waveforms/FELIGlinkwrapperLPGBT_tb_behav.wcfg\ + FELIG/waveforms/felig_lpgbt_sim.wcfg\ + FELIG/waveforms/FELIG_phase2_behav.wcfg\ + ] diff --git a/simulation/FELIG/add_felig_sim_files.tcl b/simulation/FELIG/add_felig_sim_files.tcl new file mode 100644 index 0000000000000000000000000000000000000000..5a75d248bbd23415cfd17cdc674c9a52aedd8e98 --- /dev/null +++ b/simulation/FELIG/add_felig_sim_files.tcl @@ -0,0 +1,20 @@ +#NEEDS TO BE RUN in scripts/FELIX_top/ +source ../helper/clear_filesets.tcl + +source ../filesets/felig_fileset.tcl + +#set VHDL_FILES [concat $VHDL_FILES $VHDL_FILES_KU] +set SIM_FILES [concat $SIM_FILES $SIM_FILES_KU] + +set scriptdir [pwd] +set firmware_dir $scriptdir/../../ + +foreach SIM_FILE $SIM_FILES { + add_files -fileset sim_1 -force -norecurse ${firmware_dir}/simulation/$SIM_FILE + set_property library work [get_files ${firmware_dir}/simulation/$SIM_FILE] + set_property file_type {VHDL 2008} [get_files ${firmware_dir}/simulation/$SIM_FILE] +} + +foreach WCFG_FILE $WCFG_FILES { + add_files -fileset sim_1 -force -norecurse ${firmware_dir}/simulation/$WCFG_FILE +} diff --git a/simulation/FELIG/add_lpgbt_files.tcl b/simulation/FELIG/add_lpgbt_files.tcl new file mode 100644 index 0000000000000000000000000000000000000000..94774a30cc3131db9dce809fac0b7a4a1d397e2d --- /dev/null +++ b/simulation/FELIG/add_lpgbt_files.tcl @@ -0,0 +1,18 @@ +#NEEDS TO BE RUN in scripts/FELIX_top/ +source ../helper/clear_filesets.tcl + +source ../filesets/lpgbt_core_fileset.tcl + +set VHDL_FILES [concat $VHDL_FILES $VHDL_FILES_KU] + +set scriptdir [pwd] +set firmware_dir $scriptdir/../../ + +foreach VHDL_FILE $VHDL_FILES { + set file_path [file normalize ${firmware_dir}/sources/${VHDL_FILE}] + + read_vhdl -library work $file_path + set_property FILE_TYPE {VHDL 2008} [get_files ${file_path}] + add_file $file_path +} + diff --git a/simulation/FELIG/add_ttcemu_files.tcl b/simulation/FELIG/add_ttcemu_files.tcl new file mode 100644 index 0000000000000000000000000000000000000000..cdafae05c5a7286076d6a5340cc77eca645d08b3 --- /dev/null +++ b/simulation/FELIG/add_ttcemu_files.tcl @@ -0,0 +1,18 @@ +#NEEDS TO BE RUN in scripts/FELIX_top/ +source ../helper/clear_filesets.tcl + +source ../filesets/ttc_emulator_fileset.tcl + +set VHDL_FILES [concat $VHDL_FILES $VHDL_FILES_KU] + +set scriptdir [pwd] +set firmware_dir $scriptdir/../../ + +foreach VHDL_FILE $VHDL_FILES { + set file_path [file normalize ${firmware_dir}/sources/${VHDL_FILE}] + + read_vhdl -library work $file_path + set_property FILE_TYPE {VHDL 2008} [get_files ${file_path}] + add_file $file_path +} + diff --git a/simulation/FELIG/felig_lpgbt_sim.vhd b/simulation/FELIG/felig_lpgbt_sim.vhd index 2239a7bc4919815e65a3a3bf3a9d850450718807..b177087690da18cef1aceda4b5ec08108dea23a3 100644 --- a/simulation/FELIG/felig_lpgbt_sim.vhd +++ b/simulation/FELIG/felig_lpgbt_sim.vhd @@ -1,3 +1,4 @@ +--ricardo luz, argonne library IEEE; use IEEE.STD_LOGIC_1164.ALL; @@ -23,7 +24,7 @@ end felig_lpgbt_sim; architecture Behavioral of felig_lpgbt_sim is - component clk_wiz_40_0 -- @suppress "Component declaration is not equal to its matching entity" + component clk_wiz_40_0 -- @suppress "Component declaratiechoon is not equal to its matching entity" port( clk_in2 : in STD_LOGIC; clk_in_sel : in STD_LOGIC; @@ -151,7 +152,7 @@ begin downlinkUserData_i => downlinkUserData_i, --in downlinkEcData_i => downlinkEcData_i, --in downlinkIcData_i => downlinkIcData_i, --in - TXCLK40 => TXCLK40, --in + TXCLK40 => clk40, --in TXCLK320 => GT_TX_WORD_CLK, --in RXCLK320m => GT_RX_WORD_CLK, --in uplinkSelectFEC_i => CTRL_FECMODE, --in @@ -224,16 +225,12 @@ begin Port map ( clk40_in => rxrecclk40m, - --TXCLK40 => txclk40m,--clk40_in, --in - --RXCLK40 => rxrecclk40m, --in TXCLK320 => GT_TX_WORD_CLK, --in RXCLK320 => GT_RX_WORD_CLK, --in rst_uplink_i => TX_RESET_i, --in ctr_clkSlip_s => RxSlide_FE(i), --out aligned => alignment_done_f_FE(i), --out sta_headerFlag_o => sta_headerFlag_out_FE(i), --out - sta_headerFlag_shift => open, --out - clk_dataFlag_rxGb_s_o => open, --out dat_upLinkWord_fromGb_s => TX_DATA_FE(i), --out dat_downLinkWord_fromMgt_s16 => RX_DATA_16b, --in rst_dnlink_i => rst_dnlink,--RL --in @@ -294,9 +291,9 @@ begin if timeout then exit; end if; - data_to_back_end <= data_to_back_end + "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"; - data_to_front_end <= data_to_front_end + "00000000000000000000000000000001"; - wait for 3 us; + data_to_back_end <= data_to_back_end + x"1"; + data_to_front_end <= data_to_front_end + x"1"; + wait for 25 ns; end loop; wait for 1000 us; end process; diff --git a/simulation/FELIG/felig_sim_top_bnl712.vhd b/simulation/FELIG/felig_sim_top_bnl712.vhd index f5100041e0f2a594037979d395666b5101cc5e0d..e8f20d1989686af1df9d0278021bf94fb16925c8 100644 --- a/simulation/FELIG/felig_sim_top_bnl712.vhd +++ b/simulation/FELIG/felig_sim_top_bnl712.vhd @@ -269,7 +269,7 @@ begin lane_control(i).global.FEC <= '0';--register_map_control.LPGBT_FEC(0) lane_control(i).global.DATARATE <= '1';-- not register_map_control.LPGBT_DATARATE(0) lane_control(i).global.aligned <= linkValid_array(i); - lane_control(i).fmemu_random.SELECT_RANDOM <= pcie0_register_map_40_control.FMEMU_RANDOM_CONTROL.SELECT_RANDOM; + --lane_control(i).fmemu_random.SELECT_RANDOM <= pcie0_register_map_40_control.FMEMU_RANDOM_CONTROL.SELECT_RANDOM; lane_control(i).fmemu_random.FMEMU_RANDOM_RAM_ADDR <= pcie0_register_map_40_control.FMEMU_RANDOM_RAM_ADDR; lane_control(i).fmemu_random.FMEMU_RANDOM_RAM <= pcie0_register_map_40_control.FMEMU_RANDOM_RAM; lane_control(i).fmemu_random.FMEMU_RANDOM_CONTROL <= pcie0_register_map_40_control.FMEMU_RANDOM_CONTROL; @@ -585,6 +585,8 @@ begin link_tx_flag_in => link_tx_flag_i, --gbt_tx_flag_i, link_rx_flag_in => link_rx_flag_i, -- gbt_rx_flag_i, + l1a_int_trigger_out => open, --sim + lane_control => lane_control, lane_monitor => open --lane_monitor, -- register_map_control_40xtal => pcie0_register_map_40_control, diff --git a/simulation/FELIG/waveforms/FELIGemulator_tb_behav.wcfg b/simulation/FELIG/waveforms/FELIGemulator_tb_behav.wcfg new file mode 100644 index 0000000000000000000000000000000000000000..b27d4e6d2e58a1f7cc634accedf3771966f0b148 --- /dev/null +++ b/simulation/FELIG/waveforms/FELIGemulator_tb_behav.wcfg @@ -0,0 +1,302 @@ +<?xml version="1.0" encoding="UTF-8"?> +<wave_config> + <wave_state> + </wave_state> + <db_ref_list> + <db_ref path="FELIGemulator_tb_behav.wdb" id="1"> + <top_modules> + <top_module name="FELIGemulator_tb" /> + <top_module name="axi_stream_package" /> + <top_module name="centralrouter_package" /> + <top_module name="felix_package" /> + <top_module name="glbl" /> + <top_module name="ip_lib" /> + <top_module name="pcie_package" /> + <top_module name="type_lib" /> + <top_module name="vcomponents" /> + </top_modules> + </db_ref> + </db_ref_list> + <zoom_setting> + <ZoomStartTime time="0.000000 us"></ZoomStartTime> + <ZoomEndTime time="171.908068 us"></ZoomEndTime> + <Cursor1Time time="171.908067 us"></Cursor1Time> + </zoom_setting> + <column_width_setting> + <NameColumnWidth column_width="206"></NameColumnWidth> + <ValueColumnWidth column_width="150"></ValueColumnWidth> + </column_width_setting> + <WVObjectSize size="66" /> + <wvobject type="logic" fp_name="/FELIGemulator_tb/clk40"> + <obj_property name="ElementShortName">clk40</obj_property> + <obj_property name="ObjectShortName">clk40</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGemulator_tb/clk160"> + <obj_property name="ElementShortName">clk160</obj_property> + <obj_property name="ObjectShortName">clk160</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGemulator_tb/clk240"> + <obj_property name="ElementShortName">clk240</obj_property> + <obj_property name="ObjectShortName">clk240</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGemulator_tb/clk320"> + <obj_property name="ElementShortName">clk320</obj_property> + <obj_property name="ObjectShortName">clk320</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/clkTX"> + <obj_property name="ElementShortName">clkTX[0:0]</obj_property> + <obj_property name="ObjectShortName">clkTX[0:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/clkRX"> + <obj_property name="ElementShortName">clkRX[0:0]</obj_property> + <obj_property name="ObjectShortName">clkRX[0:0]</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGemulator_tb/m_axis_aclk"> + <obj_property name="ElementShortName">m_axis_aclk</obj_property> + <obj_property name="ObjectShortName">m_axis_aclk</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGemulator_tb/clk_prcss"> + <obj_property name="ElementShortName">clk_prcss</obj_property> + <obj_property name="ObjectShortName">clk_prcss</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/link_tx_flag"> + <obj_property name="ElementShortName">link_tx_flag[0:0]</obj_property> + <obj_property name="ObjectShortName">link_tx_flag[0:0]</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGemulator_tb/reset"> + <obj_property name="ElementShortName">reset</obj_property> + <obj_property name="ObjectShortName">reset</obj_property> + </wvobject> + <wvobject fp_name="divider667" type="divider"> + <obj_property name="label">Emulator</obj_property> + <obj_property name="DisplayName">label</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGemulator_tb/FELIG_emu/\emulator_inst(0)\/gbt/\dgen_group(0)\/emu_0/l1a_trig"> + <obj_property name="ElementShortName">l1a_trig</obj_property> + <obj_property name="ObjectShortName">l1a_trig</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/FELIG_emu/\emulator_inst(0)\/gbt/\dgen_group(0)\/emu_0/l1a_id"> + <obj_property name="ElementShortName">l1a_id[15:0]</obj_property> + <obj_property name="ObjectShortName">l1a_id[15:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/FELIG_emu/\emulator_inst(0)\/gbt/elink_data_in"> + <obj_property name="ElementShortName">elink_data_in[0:111][9:0]</obj_property> + <obj_property name="ObjectShortName">elink_data_in[0:111][9:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/FELIG_emu/\emulator_inst(0)\/gbt/\dgen_group(0)\/emu_0/def_data_gen/elinkdata_o"> + <obj_property name="ElementShortName">elinkdata_o[17:0]</obj_property> + <obj_property name="ObjectShortName">elinkdata_o[17:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/FELIG_emu/\emulator_inst(0)\/gbt/\dgen_group(1)\/emu_0/def_data_gen/elinkdata_o"> + <obj_property name="ElementShortName">elinkdata_o[17:0]</obj_property> + <obj_property name="ObjectShortName">elinkdata_o[17:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/FELIG_emu/\emulator_inst(0)\/gbt/\dgen_group(2)\/emu_0/def_data_gen/elinkdata_o"> + <obj_property name="ElementShortName">elinkdata_o[17:0]</obj_property> + <obj_property name="ObjectShortName">elinkdata_o[17:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/FELIG_emu/\emulator_inst(0)\/gbt/\dgen_group(3)\/emu_0/def_data_gen/elinkdata_o"> + <obj_property name="ElementShortName">elinkdata_o[17:0]</obj_property> + <obj_property name="ObjectShortName">elinkdata_o[17:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/FELIG_emu/\emulator_inst(0)\/gbt/\dgen_group(4)\/emu_0/def_data_gen/elinkdata_o"> + <obj_property name="ElementShortName">elinkdata_o[17:0]</obj_property> + <obj_property name="ObjectShortName">elinkdata_o[17:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/FELIG_emu/\emulator_inst(0)\/gbt/\dgen_group(5)\/emu_0/def_data_gen/elinkdata_o"> + <obj_property name="ElementShortName">elinkdata_o[17:0]</obj_property> + <obj_property name="ObjectShortName">elinkdata_o[17:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/FELIG_emu/\emulator_inst(0)\/gbt/\dgen_group(6)\/emu_0/def_data_gen/elinkdata_o"> + <obj_property name="ElementShortName">elinkdata_o[17:0]</obj_property> + <obj_property name="ObjectShortName">elinkdata_o[17:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/FELIG_emu/\emulator_inst(0)\/gbt/\dgen_group(0)\/emu_0/enc8b10bx/dataIN"> + <obj_property name="ElementShortName">dataIN[7:0]</obj_property> + <obj_property name="ObjectShortName">dataIN[7:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/FELIG_emu/\emulator_inst(0)\/gbt/\dgen_group(1)\/emu_0/enc8b10bx/dataIN"> + <obj_property name="ElementShortName">dataIN[7:0]</obj_property> + <obj_property name="ObjectShortName">dataIN[7:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/FELIG_emu/\emulator_inst(0)\/gbt/\dgen_group(2)\/emu_0/enc8b10bx/dataIN"> + <obj_property name="ElementShortName">dataIN[7:0]</obj_property> + <obj_property name="ObjectShortName">dataIN[7:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/FELIG_emu/\emulator_inst(0)\/gbt/\dgen_group(3)\/emu_0/enc8b10bx/dataIN"> + <obj_property name="ElementShortName">dataIN[7:0]</obj_property> + <obj_property name="ObjectShortName">dataIN[7:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/FELIG_emu/\emulator_inst(0)\/gbt/\dgen_group(4)\/emu_0/enc8b10bx/dataIN"> + <obj_property name="ElementShortName">dataIN[7:0]</obj_property> + <obj_property name="ObjectShortName">dataIN[7:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/FELIG_emu/\emulator_inst(0)\/gbt/\dgen_group(5)\/emu_0/enc8b10bx/dataIN"> + <obj_property name="ElementShortName">dataIN[7:0]</obj_property> + <obj_property name="ObjectShortName">dataIN[7:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/FELIG_emu/\emulator_inst(0)\/gbt/\dgen_group(6)\/emu_0/enc8b10bx/dataIN"> + <obj_property name="ElementShortName">dataIN[7:0]</obj_property> + <obj_property name="ObjectShortName">dataIN[7:0]</obj_property> + </wvobject> + <wvobject fp_name="divider668" type="divider"> + <obj_property name="label">GBT/LPGBT out</obj_property> + <obj_property name="DisplayName">label</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/link_tx_data"> + <obj_property name="ElementShortName">link_tx_data[0:0][227:0]</obj_property> + <obj_property name="ObjectShortName">link_tx_data[0:0][227:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/link_tx_valid"> + <obj_property name="ElementShortName">link_tx_valid[0:0]</obj_property> + <obj_property name="ObjectShortName">link_tx_valid[0:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/l1id"> + <obj_property name="ElementShortName">l1id[15:0]</obj_property> + <obj_property name="ObjectShortName">l1id[15:0]</obj_property> + </wvobject> + <wvobject fp_name="divider859" type="divider"> + <obj_property name="label">maxis</obj_property> + <obj_property name="DisplayName">label</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/m_axis"> + <obj_property name="ElementShortName">m_axis[0:0,0:41]</obj_property> + <obj_property name="ObjectShortName">m_axis[0:0,0:41]</obj_property> + <obj_property name="isExpanded"></obj_property> + </wvobject> + <wvobject fp_name="divider859" type="divider"> + <obj_property name="label">decoder out</obj_property> + <obj_property name="DisplayName">label</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/\g_checking_data(0)\/\g_Streams(24)\/data"> + <obj_property name="ElementShortName">data[31:0]</obj_property> + <obj_property name="ObjectShortName">data[31:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/\g_checking_data(0)\/\g_Streams(24)\/data10b"> + <obj_property name="ElementShortName">data10b[9:0]</obj_property> + <obj_property name="ObjectShortName">data10b[9:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/\g_checking_data(0)\/\g_Streams(24)\/count8b"> + <obj_property name="ElementShortName">count8b[1:0]</obj_property> + <obj_property name="ObjectShortName">count8b[1:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/\g_checking_data(0)\/\g_Streams(24)\/count_chunks"> + <obj_property name="ElementShortName">count_chunks[6:0]</obj_property> + <obj_property name="ObjectShortName">count_chunks[6:0]</obj_property> + <obj_property name="Radix">UNSIGNEDDECRADIX</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGemulator_tb/\g_checking_data(0)\/\g_Streams(24)\/checked"> + <obj_property name="ElementShortName">checked</obj_property> + <obj_property name="ObjectShortName">checked</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGemulator_tb/\g_checking_data(0)\/\g_Streams(24)\/check_words"> + <obj_property name="ElementShortName">check_words</obj_property> + <obj_property name="ObjectShortName">check_words</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGemulator_tb/\g_checking_data(0)\/\g_Streams(24)\/check_length"> + <obj_property name="ElementShortName">check_length</obj_property> + <obj_property name="ObjectShortName">check_length</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGemulator_tb/\g_checking_data(0)\/\g_Streams(24)\/last"> + <obj_property name="ElementShortName">last</obj_property> + <obj_property name="ObjectShortName">last</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/\g_checking_data(0)\/\g_Streams(24)\/keep"> + <obj_property name="ElementShortName">keep[3:0]</obj_property> + <obj_property name="ObjectShortName">keep[3:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/\g_checking_data(0)\/\g_Streams(24)\/exp_checks"> + <obj_property name="ElementShortName">exp_checks[6:0]</obj_property> + <obj_property name="ObjectShortName">exp_checks[6:0]</obj_property> + <obj_property name="Radix">UNSIGNEDDECRADIX</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGemulator_tb/\g_checking_data(0)\/\g_Streams(24)\/reset_v_ch"> + <obj_property name="ElementShortName">reset_v_ch</obj_property> + <obj_property name="ObjectShortName">reset_v_ch</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/\g_checking_data(0)\/\g_Streams(24)\/cnt_checks"> + <obj_property name="ElementShortName">cnt_checks[6:0]</obj_property> + <obj_property name="ObjectShortName">cnt_checks[6:0]</obj_property> + <obj_property name="Radix">UNSIGNEDDECRADIX</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/epath_aligned"> + <obj_property name="ElementShortName">epath_aligned[0:0,39:0]</obj_property> + <obj_property name="ObjectShortName">epath_aligned[0:0,39:0]</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGemulator_tb/\g_checking_data(0)\/\g_Streams(24)\/good"> + <obj_property name="ElementShortName">good</obj_property> + <obj_property name="ObjectShortName">good</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGemulator_tb/l1a"> + <obj_property name="ElementShortName">l1a</obj_property> + <obj_property name="ObjectShortName">l1a</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/data_good"> + <obj_property name="ElementShortName">data_good[0:0,39:0]</obj_property> + <obj_property name="ObjectShortName">data_good[0:0,39:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/epath_enabled"> + <obj_property name="ElementShortName">epath_enabled[0:0,39:0]</obj_property> + <obj_property name="ObjectShortName">epath_enabled[0:0,39:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/epath_aligned"> + <obj_property name="ElementShortName">epath_aligned[0:0,39:0]</obj_property> + <obj_property name="ObjectShortName">epath_aligned[0:0,39:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/count_final"> + <obj_property name="ElementShortName">count_final[4:0]</obj_property> + <obj_property name="ObjectShortName">count_final[4:0]</obj_property> + <obj_property name="Radix">HEXRADIX</obj_property> + <obj_property name="CustomSignalColor">#FAAFBE</obj_property> + <obj_property name="UseCustomSignalColor">true</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/FELIG_emu/\emulator_inst(0)\/gbt/\dgen_group(0)\/emu_0/l1a_id"> + <obj_property name="ElementShortName">l1a_id[15:0]</obj_property> + <obj_property name="ObjectShortName">l1a_id[15:0]</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGemulator_tb/l1a"> + <obj_property name="ElementShortName">l1a</obj_property> + <obj_property name="ObjectShortName">l1a</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/epath_enabled_slv"> + <obj_property name="ElementShortName">epath_enabled_slv[39:0]</obj_property> + <obj_property name="ObjectShortName">epath_enabled_slv[39:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/epath_aligned_slv"> + <obj_property name="ElementShortName">epath_aligned_slv[39:0]</obj_property> + <obj_property name="ObjectShortName">epath_aligned_slv[39:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/epath_aligned_d_slv"> + <obj_property name="ElementShortName">epath_aligned_d_slv[39:0]</obj_property> + <obj_property name="ObjectShortName">epath_aligned_d_slv[39:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/epath_aligned_dd_slv"> + <obj_property name="ElementShortName">epath_aligned_dd_slv[39:0]</obj_property> + <obj_property name="ObjectShortName">epath_aligned_dd_slv[39:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/data_good_slv"> + <obj_property name="ElementShortName">data_good_slv[39:0]</obj_property> + <obj_property name="ObjectShortName">data_good_slv[39:0]</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGemulator_tb/reset"> + <obj_property name="ElementShortName">reset</obj_property> + <obj_property name="ObjectShortName">reset</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGemulator_tb/reset_d"> + <obj_property name="ElementShortName">reset_d</obj_property> + <obj_property name="ObjectShortName">reset_d</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGemulator_tb/FELIG_emu/l1a_int_trigger"> + <obj_property name="ElementShortName">l1a_int_trigger</obj_property> + <obj_property name="ObjectShortName">l1a_int_trigger</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/enabled_aligned"> + <obj_property name="ElementShortName">enabled_aligned[15:0][1:0]</obj_property> + <obj_property name="ObjectShortName">enabled_aligned[15:0][1:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGemulator_tb/\g_checking_data(0)\/\g_Streams(24)\/exp_checks"> + <obj_property name="ElementShortName">exp_checks[6:0]</obj_property> + <obj_property name="ObjectShortName">exp_checks[6:0]</obj_property> + <obj_property name="Radix">UNSIGNEDDECRADIX</obj_property> + </wvobject> +</wave_config> diff --git a/simulation/FELIG/waveforms/FELIGexternaltrigger_tb_behav.wcfg b/simulation/FELIG/waveforms/FELIGexternaltrigger_tb_behav.wcfg new file mode 100644 index 0000000000000000000000000000000000000000..52cc8eb5e3c0925f0856052ba4d6e1fca9bcf1e7 --- /dev/null +++ b/simulation/FELIG/waveforms/FELIGexternaltrigger_tb_behav.wcfg @@ -0,0 +1,250 @@ +<?xml version="1.0" encoding="UTF-8"?> +<wave_config> + <wave_state> + </wave_state> + <db_ref_list> + <db_ref path="FELIGexternaltrigger_tb_behav.wdb" id="1"> + <top_modules> + <top_module name="FELIGexternaltrigger_tb" /> + <top_module name="axi_stream_package" /> + <top_module name="centralrouter_package" /> + <top_module name="felix_package" /> + <top_module name="glbl" /> + <top_module name="ip_lib" /> + <top_module name="pcie_package" /> + <top_module name="type_lib" /> + <top_module name="vcomponents" /> + </top_modules> + </db_ref> + </db_ref_list> + <zoom_setting> + <ZoomStartTime time="0.000000 us"></ZoomStartTime> + <ZoomEndTime time="60.000001 us"></ZoomEndTime> + <Cursor1Time time="57.542518 us"></Cursor1Time> + </zoom_setting> + <column_width_setting> + <NameColumnWidth column_width="189"></NameColumnWidth> + <ValueColumnWidth column_width="66"></ValueColumnWidth> + </column_width_setting> + <WVObjectSize size="54" /> + <wvobject type="logic" fp_name="/FELIGexternaltrigger_tb/clk40"> + <obj_property name="ElementShortName">clk40</obj_property> + <obj_property name="ObjectShortName">clk40</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGexternaltrigger_tb/clk320"> + <obj_property name="ElementShortName">clk320</obj_property> + <obj_property name="ObjectShortName">clk320</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGexternaltrigger_tb/reset"> + <obj_property name="ElementShortName">reset</obj_property> + <obj_property name="ObjectShortName">reset</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGexternaltrigger_tb/L1A"> + <obj_property name="ElementShortName">L1A</obj_property> + <obj_property name="ObjectShortName">L1A</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGexternaltrigger_tb/L1A_count"> + <obj_property name="ElementShortName">L1A_count[7:0]</obj_property> + <obj_property name="ObjectShortName">L1A_count[7:0]</obj_property> + <obj_property name="isExpanded"></obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGexternaltrigger_tb/TTCEmu/TTCout"> + <obj_property name="ElementShortName">TTCout[9:0]</obj_property> + <obj_property name="ObjectShortName">TTCout[9:0]</obj_property> + </wvobject> + <wvobject fp_name="divider20" type="divider"> + <obj_property name="label">emul</obj_property> + <obj_property name="DisplayName">label</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGexternaltrigger_tb/felig_emulator/TTC_out"> + <obj_property name="ElementShortName">TTC_out[9:0]</obj_property> + <obj_property name="ObjectShortName">TTC_out[9:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGexternaltrigger_tb/felig_emulator/ttc_fifo_din"> + <obj_property name="ElementShortName">ttc_fifo_din[9:0]</obj_property> + <obj_property name="ObjectShortName">ttc_fifo_din[9:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGexternaltrigger_tb/felig_emulator/ttc_fifo_dout"> + <obj_property name="ElementShortName">ttc_fifo_dout[9:0]</obj_property> + <obj_property name="ObjectShortName">ttc_fifo_dout[9:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGexternaltrigger_tb/felig_emulator/TTC_out_fifo"> + <obj_property name="ElementShortName">TTC_out_fifo[9:0]</obj_property> + <obj_property name="ObjectShortName">TTC_out_fifo[9:0]</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGexternaltrigger_tb/felig_emulator/link_aligned"> + <obj_property name="ElementShortName">link_aligned</obj_property> + <obj_property name="ObjectShortName">link_aligned</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGexternaltrigger_tb/felig_emulator/ttc_fifo_rst"> + <obj_property name="ElementShortName">ttc_fifo_rst</obj_property> + <obj_property name="ObjectShortName">ttc_fifo_rst</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGexternaltrigger_tb/felig_emulator/lane_reset"> + <obj_property name="ElementShortName">lane_reset</obj_property> + <obj_property name="ObjectShortName">lane_reset</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGexternaltrigger_tb/felig_emulator/ext_l1a_trigger"> + <obj_property name="ElementShortName">ext_l1a_trigger</obj_property> + <obj_property name="ObjectShortName">ext_l1a_trigger</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGexternaltrigger_tb/felig_emulator/ext_l1a_id"> + <obj_property name="ElementShortName">ext_l1a_id[15:0]</obj_property> + <obj_property name="ObjectShortName">ext_l1a_id[15:0]</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGexternaltrigger_tb/felig_emulator/l1a_trigger"> + <obj_property name="ElementShortName">l1a_trigger</obj_property> + <obj_property name="ObjectShortName">l1a_trigger</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGexternaltrigger_tb/felig_emulator/l1a_id"> + <obj_property name="ElementShortName">l1a_id[15:0]</obj_property> + <obj_property name="ObjectShortName">l1a_id[15:0]</obj_property> + </wvobject> + <wvobject fp_name="divider109" type="divider"> + <obj_property name="label">top</obj_property> + <obj_property name="DisplayName">label</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGexternaltrigger_tb/emu_l1a_id"> + <obj_property name="ElementShortName">emu_l1a_id[15:0]</obj_property> + <obj_property name="ObjectShortName">emu_l1a_id[15:0]</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGexternaltrigger_tb/emu_l1a"> + <obj_property name="ElementShortName">emu_l1a</obj_property> + <obj_property name="ObjectShortName">emu_l1a</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGexternaltrigger_tb/tx_data"> + <obj_property name="ElementShortName">tx_data[227:0]</obj_property> + <obj_property name="ObjectShortName">tx_data[227:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGexternaltrigger_tb/tx_eg_data"> + <obj_property name="ElementShortName">tx_eg_data[6:0][31:0]</obj_property> + <obj_property name="ObjectShortName">tx_eg_data[6:0][31:0]</obj_property> + </wvobject> + <wvobject fp_name="divider1892" type="divider"> + <obj_property name="label">data_valid</obj_property> + <obj_property name="DisplayName">label</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGexternaltrigger_tb/aligned"> + <obj_property name="ElementShortName">aligned</obj_property> + <obj_property name="ObjectShortName">aligned</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGexternaltrigger_tb/data_to_be_checked"> + <obj_property name="ElementShortName">data_to_be_checked[7:0]</obj_property> + <obj_property name="ObjectShortName">data_to_be_checked[7:0]</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGexternaltrigger_tb/felig_emulator/data_ready_tx_out"> + <obj_property name="ElementShortName">data_ready_tx_out</obj_property> + <obj_property name="ObjectShortName">data_ready_tx_out</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGexternaltrigger_tb/data_delay"> + <obj_property name="ElementShortName">data_delay[7:0]</obj_property> + <obj_property name="ObjectShortName">data_delay[7:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGexternaltrigger_tb/data_count"> + <obj_property name="ElementShortName">data_count[31:0]</obj_property> + <obj_property name="ObjectShortName">data_count[31:0]</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGexternaltrigger_tb/valid_delay"> + <obj_property name="ElementShortName">valid_delay</obj_property> + <obj_property name="ObjectShortName">valid_delay</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGexternaltrigger_tb/data_size"> + <obj_property name="ElementShortName">data_size[31:0]</obj_property> + <obj_property name="ObjectShortName">data_size[31:0]</obj_property> + <obj_property name="Radix">UNSIGNEDDECRADIX</obj_property> + </wvobject> + <wvobject fp_name="divider2164" type="divider"> + <obj_property name="label">check word</obj_property> + <obj_property name="DisplayName">label</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGexternaltrigger_tb/emu_l1a"> + <obj_property name="ElementShortName">emu_l1a</obj_property> + <obj_property name="ObjectShortName">emu_l1a</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGexternaltrigger_tb/exp_checks"> + <obj_property name="ElementShortName">exp_checks[6:0]</obj_property> + <obj_property name="ObjectShortName">exp_checks[6:0]</obj_property> + <obj_property name="Radix">UNSIGNEDDECRADIX</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGexternaltrigger_tb/cnt_checks"> + <obj_property name="ElementShortName">cnt_checks[6:0]</obj_property> + <obj_property name="ObjectShortName">cnt_checks[6:0]</obj_property> + <obj_property name="Radix">UNSIGNEDDECRADIX</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGexternaltrigger_tb/data_delay"> + <obj_property name="ElementShortName">data_delay[7:0]</obj_property> + <obj_property name="ObjectShortName">data_delay[7:0]</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGexternaltrigger_tb/check_words"> + <obj_property name="ElementShortName">check_words</obj_property> + <obj_property name="ObjectShortName">check_words</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGexternaltrigger_tb/clk40"> + <obj_property name="ElementShortName">clk40</obj_property> + <obj_property name="ObjectShortName">clk40</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGexternaltrigger_tb/emu_l1a"> + <obj_property name="ElementShortName">emu_l1a</obj_property> + <obj_property name="ObjectShortName">emu_l1a</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGexternaltrigger_tb/emu_l1a_40"> + <obj_property name="ElementShortName">emu_l1a_40</obj_property> + <obj_property name="ObjectShortName">emu_l1a_40</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGexternaltrigger_tb/clk320"> + <obj_property name="ElementShortName">clk320</obj_property> + <obj_property name="ObjectShortName">clk320</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGexternaltrigger_tb/good"> + <obj_property name="ElementShortName">good</obj_property> + <obj_property name="ObjectShortName">good</obj_property> + </wvobject> + <wvobject fp_name="divider2466" type="divider"> + <obj_property name="label">triggers</obj_property> + <obj_property name="DisplayName">label</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGexternaltrigger_tb/felig_emulator/ext_l1a_trigger"> + <obj_property name="ElementShortName">ext_l1a_trigger</obj_property> + <obj_property name="ObjectShortName">ext_l1a_trigger</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGexternaltrigger_tb/felig_emulator/ext_l1a_id"> + <obj_property name="ElementShortName">ext_l1a_id[15:0]</obj_property> + <obj_property name="ObjectShortName">ext_l1a_id[15:0]</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGexternaltrigger_tb/single_ecr_long"> + <obj_property name="ElementShortName">single_ecr_long</obj_property> + <obj_property name="ObjectShortName">single_ecr_long</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGexternaltrigger_tb/felig_emulator/ECR"> + <obj_property name="ElementShortName">ECR</obj_property> + <obj_property name="ObjectShortName">ECR</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGexternaltrigger_tb/l1a_id_register_rst"> + <obj_property name="ElementShortName">l1a_id_register_rst</obj_property> + <obj_property name="ObjectShortName">l1a_id_register_rst</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGexternaltrigger_tb/next_l1a_id"> + <obj_property name="ElementShortName">next_l1a_id[15:0]</obj_property> + <obj_property name="ObjectShortName">next_l1a_id[15:0]</obj_property> + </wvobject> + <wvobject fp_name="divider2779" type="divider"> + <obj_property name="label">checks</obj_property> + <obj_property name="DisplayName">label</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGexternaltrigger_tb/count_triggers"> + <obj_property name="ElementShortName">count_triggers[7:0]</obj_property> + <obj_property name="ObjectShortName">count_triggers[7:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGexternaltrigger_tb/count_good_ids"> + <obj_property name="ElementShortName">count_good_ids[7:0]</obj_property> + <obj_property name="ObjectShortName">count_good_ids[7:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGexternaltrigger_tb/count_good_data"> + <obj_property name="ElementShortName">count_good_data[7:0]</obj_property> + <obj_property name="ObjectShortName">count_good_data[7:0]</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGexternaltrigger_tb/test"> + <obj_property name="ElementShortName">test</obj_property> + <obj_property name="ObjectShortName">test</obj_property> + </wvobject> +</wave_config> diff --git a/simulation/FELIG/waveforms/FELIGlinkwrapperLPGBT_tb_behav.wcfg b/simulation/FELIG/waveforms/FELIGlinkwrapperLPGBT_tb_behav.wcfg new file mode 100644 index 0000000000000000000000000000000000000000..564b986b2bfc4e217c8a1efc0950efe5d20e0dcf --- /dev/null +++ b/simulation/FELIG/waveforms/FELIGlinkwrapperLPGBT_tb_behav.wcfg @@ -0,0 +1,82 @@ +<?xml version="1.0" encoding="UTF-8"?> +<wave_config> + <wave_state> + </wave_state> + <db_ref_list> + <db_ref path="FELIGlinkwrapperLPGBT_tb_behav.wdb" id="1"> + <top_modules> + <top_module name="FELIGlinkwrapperLPGBT_tb" /> + <top_module name="axi_stream_package" /> + <top_module name="centralrouter_package" /> + <top_module name="felix_package" /> + <top_module name="glbl" /> + <top_module name="lpgbtfpga_package" /> + <top_module name="pcie_package" /> + <top_module name="type_lib" /> + <top_module name="vcomponents" /> + </top_modules> + </db_ref> + </db_ref_list> + <zoom_setting> + <ZoomStartTime time="16,107.414 ns"></ZoomStartTime> + <ZoomEndTime time="16,343.285 ns"></ZoomEndTime> + <Cursor1Time time="21,000.000 ns"></Cursor1Time> + </zoom_setting> + <column_width_setting> + <NameColumnWidth column_width="203"></NameColumnWidth> + <ValueColumnWidth column_width="152"></ValueColumnWidth> + </column_width_setting> + <WVObjectSize size="13" /> + <wvobject type="logic" fp_name="/FELIGlinkwrapperLPGBT_tb/clk40"> + <obj_property name="ElementShortName">clk40</obj_property> + <obj_property name="ObjectShortName">clk40</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGlinkwrapperLPGBT_tb/clk320"> + <obj_property name="ElementShortName">clk320</obj_property> + <obj_property name="ObjectShortName">clk320</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGlinkwrapperLPGBT_tb/reset_clk40"> + <obj_property name="ElementShortName">reset_clk40</obj_property> + <obj_property name="ObjectShortName">reset_clk40</obj_property> + </wvobject> + <wvobject type="logic" fp_name="/FELIGlinkwrapperLPGBT_tb/reset_done_clk40"> + <obj_property name="ElementShortName">reset_done_clk40</obj_property> + <obj_property name="ObjectShortName">reset_done_clk40</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGlinkwrapperLPGBT_tb/alignment_done_BE"> + <obj_property name="ElementShortName">alignment_done_BE[0:0]</obj_property> + <obj_property name="ObjectShortName">alignment_done_BE[0:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGlinkwrapperLPGBT_tb/alignment_done_FE"> + <obj_property name="ElementShortName">alignment_done_FE[0:0]</obj_property> + <obj_property name="ObjectShortName">alignment_done_FE[0:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGlinkwrapperLPGBT_tb/TX_DATA_BE"> + <obj_property name="ElementShortName">TX_DATA_BE[0:0][15:0]</obj_property> + <obj_property name="ObjectShortName">TX_DATA_BE[0:0][15:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGlinkwrapperLPGBT_tb/TX_DATA_FE"> + <obj_property name="ElementShortName">TX_DATA_FE[0:0][31:0]</obj_property> + <obj_property name="ObjectShortName">TX_DATA_FE[0:0][31:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGlinkwrapperLPGBT_tb/data_to_be_clk40"> + <obj_property name="ElementShortName">data_to_be_clk40[223:0]</obj_property> + <obj_property name="ObjectShortName">data_to_be_clk40[223:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGlinkwrapperLPGBT_tb/uplinkData_i_BE"> + <obj_property name="ElementShortName">uplinkData_i_BE[0:0][233:0]</obj_property> + <obj_property name="ObjectShortName">uplinkData_i_BE[0:0][233:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGlinkwrapperLPGBT_tb/data_to_fe_clk40"> + <obj_property name="ElementShortName">data_to_fe_clk40[31:0]</obj_property> + <obj_property name="ObjectShortName">data_to_fe_clk40[31:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGlinkwrapperLPGBT_tb/downLinkData_i_FE"> + <obj_property name="ElementShortName">downLinkData_i_FE[0:0][35:0]</obj_property> + <obj_property name="ObjectShortName">downLinkData_i_FE[0:0][35:0]</obj_property> + </wvobject> + <wvobject type="array" fp_name="/FELIGlinkwrapperLPGBT_tb/data_rdy_BE"> + <obj_property name="ElementShortName">data_rdy_BE[0:0]</obj_property> + <obj_property name="ObjectShortName">data_rdy_BE[0:0]</obj_property> + </wvobject> +</wave_config> diff --git a/simulation/FELIG/felig_lpgbt_sim.wcfg b/simulation/FELIG/waveforms/felig_lpgbt_sim.wcfg similarity index 97% rename from simulation/FELIG/felig_lpgbt_sim.wcfg rename to simulation/FELIG/waveforms/felig_lpgbt_sim.wcfg index 693d91c8c58801bb51520872a247e72fa229d779..f4a5c3fe33fff60a5ca8c0f0131159046da5febb 100644 --- a/simulation/FELIG/felig_lpgbt_sim.wcfg +++ b/simulation/FELIG/waveforms/felig_lpgbt_sim.wcfg @@ -16,13 +16,13 @@ </db_ref> </db_ref_list> <zoom_setting> - <ZoomStartTime time="977.931 ns"></ZoomStartTime> - <ZoomEndTime time="1,004.414 ns"></ZoomEndTime> - <Cursor1Time time="1,000.000 ns"></Cursor1Time> + <ZoomStartTime time="0.000000 us"></ZoomStartTime> + <ZoomEndTime time="21.000001 us"></ZoomEndTime> + <Cursor1Time time="9.793750 us"></Cursor1Time> </zoom_setting> <column_width_setting> <NameColumnWidth column_width="203"></NameColumnWidth> - <ValueColumnWidth column_width="160"></ValueColumnWidth> + <ValueColumnWidth column_width="156"></ValueColumnWidth> </column_width_setting> <WVObjectSize size="56" /> <wvobject fp_name="divider1259" type="divider"> @@ -93,6 +93,7 @@ <wvobject type="array" fp_name="/felig_lpgbt_sim/\limk_loop_FE(0)\/FE_UPLINK_USER_DATA"> <obj_property name="ElementShortName">FE_UPLINK_USER_DATA[223:0]</obj_property> <obj_property name="ObjectShortName">FE_UPLINK_USER_DATA[223:0]</obj_property> + <obj_property name="Radix">HEXRADIX</obj_property> </wvobject> <wvobject type="array" fp_name="/felig_lpgbt_sim/\limk_loop_FE(0)\/FE_UPLINK_IC_DATA"> <obj_property name="ElementShortName">FE_UPLINK_IC_DATA[1:0]</obj_property> @@ -105,6 +106,7 @@ <wvobject type="array" fp_name="/felig_lpgbt_sim/\limk_loop_BE(0)\/uplinkDATA"> <obj_property name="ElementShortName">uplinkDATA[223:0]</obj_property> <obj_property name="ObjectShortName">uplinkDATA[223:0]</obj_property> + <obj_property name="Radix">HEXRADIX</obj_property> </wvobject> <wvobject type="array" fp_name="/felig_lpgbt_sim/\limk_loop_BE(0)\/uplinkIC"> <obj_property name="ElementShortName">uplinkIC[1:0]</obj_property> @@ -117,6 +119,8 @@ <wvobject type="array" fp_name="/felig_lpgbt_sim/uplinkData_i_BE"> <obj_property name="ElementShortName">uplinkData_i_BE[3:0][233:0]</obj_property> <obj_property name="ObjectShortName">uplinkData_i_BE[3:0][233:0]</obj_property> + <obj_property name="Radix">HEXRADIX</obj_property> + <obj_property name="isExpanded"></obj_property> </wvobject> <wvobject type="logic" fp_name="/felig_lpgbt_sim/\limk_loop_BE(3)\/lpgbt_BE/lpgbtfpga_uplink_fec5_inst/rst_pattsearch_s"> <obj_property name="ElementShortName">rst_pattsearch_s</obj_property> diff --git a/simulation/UVVMtests/tb/FELIGemulator_tb.vhd b/simulation/UVVMtests/tb/FELIGemulator_tb.vhd new file mode 100644 index 0000000000000000000000000000000000000000..d39becd89e2b902ef41be2ecc7de3bcd7611d95e --- /dev/null +++ b/simulation/UVVMtests/tb/FELIGemulator_tb.vhd @@ -0,0 +1,701 @@ +--ricardo luz, argonne +--based on simulation/FELIG/felig_sim_top_bnl712.vhd + +library IEEE; + use IEEE.std_logic_1164.all; + use IEEE.numeric_std.all; + use IEEE.numeric_std_unsigned.all; + use IEEE.std_logic_textio.all; + + use std.env.all; + use std.textio.all; + + use work.FELIX_package.all; + use work.pcie_package.all; + use work.axi_stream_package.all; + use work.centralRouter_package.all; + use work.type_lib.ALL; + +library xpm; + use xpm.vcomponents.all; + +library uvvm_util; + context uvvm_util.uvvm_util_context; + +entity FELIGemulator_tb is + generic( + use_vunit : boolean := false; + FIRMWARE_MODE : integer := 11 --6 GBT, 11 LPGBT + ); + port( + uvvm_completed: out std_logic := '0' + ); +end FELIGemulator_tb; + +architecture tb of FELIGemulator_tb is + function FM_TO_STREAMS (FIRMWARE_MODE:integer) + return integer is + begin + if FIRMWARE_MODE = 11 then + return 30; + elsif FIRMWARE_MODE = 6 then + return 42; + else + return 0; + end if; + end function; + + constant GBT_NUM : integer := 1; + constant NUMELINKmax : integer := 112; --name number of epahts per egroup (theoretically 2b epath * 112=224, but never happens) + constant NUMEGROUPmax : integer := 7; --name number of egroups + constant STREAMS_TOHOST : integer := FM_TO_STREAMS(FIRMWARE_MODE); + + constant clk40_period : time := 25 ns; + signal clk_en : boolean := false; + signal clk40 : std_logic; + signal clk40_tmp : std_logic := '0'; + signal clk240 : std_logic; + signal clk240_tmp : std_logic := '0'; + signal clk160 : std_logic; + signal clk160_tmp : std_logic := '0'; + signal clk320 : std_logic; + signal clk320_tmp : std_logic := '0'; + signal clk_prcss : std_logic := '0'; + signal clkTX : std_logic_vector(GBT_NUM-1 downto 0); + signal clkRX : std_logic_vector(GBT_NUM-1 downto 0); + signal cnt_div : std_logic_vector(1 downto 0) := (others => '0'); + signal cnt_div_max : std_logic_vector(1 downto 0) := (others => '0'); + + signal reset : std_logic; + signal reset_d : std_logic; + + signal lane_control : array_of_lane_control_type(GBT_NUM-1 downto 0); + signal lane_monitor : array_of_lane_monitor_type(GBT_NUM-1 downto 0); + signal select_random : std_logic_vector(0 downto 0) := "0"; + + signal link_tx_data : txrx228b_type(0 to GBT_NUM-1); + --signal link_rx_data : txrx120b_type(0 to GBT_NUM-1); + signal link_tx_valid : std_logic_vector(0 to GBT_NUM-1); + signal link_tx_flag : std_logic_vector(GBT_NUM-1 downto 0); + --signal link_rx_flag : std_logic_vector(GBT_NUM-1 downto 0); + + signal l1id : std_logic_vector(15 downto 0) := (others => '0'); + signal l1id_buf : std_logic_vector(15 downto 0) := (others => '0'); + signal l1a, l1a_d : std_logic := '0'; + signal l1a_int_trigger : std_logic := '0'; + signal l1a_int_trigger_d : std_logic := '0'; + + signal m_axis : axis_32_2d_array_type(0 to GBT_NUM-1, 0 to STREAMS_TOHOST-1); + signal m_axis_aclk : std_logic; + type array_2d_8b is array (natural range <>, natural range <>) of std_logic_vector(7 downto 0); + type array_2d_3b is array (natural range <>, natural range <>) of std_logic_vector(2 downto 0); + type array_2d_1b is array (natural range <>, natural range <>) of std_logic; + signal epath_enabled : array_2d_1b(GBT_NUM-1 downto 0, STREAMS_TOHOST-3 downto 0); + signal epath_aligned : array_2d_1b(GBT_NUM-1 downto 0, STREAMS_TOHOST-3 downto 0); + signal epath_width : array_2d_3b(GBT_NUM-1 downto 0, STREAMS_TOHOST-3 downto 0); + signal data_good : array_2d_1b(GBT_NUM-1 downto 0, STREAMS_TOHOST-3 downto 0); + + signal epath_enabled_slv : std_logic_vector((STREAMS_TOHOST-2)*GBT_NUM-1 downto 0); + signal epath_aligned_slv : std_logic_vector((STREAMS_TOHOST-2)*GBT_NUM-1 downto 0); + signal epath_aligned_d_slv : std_logic_vector((STREAMS_TOHOST-2)*GBT_NUM-1 downto 0) := (others => '0'); + signal epath_aligned_dd_slv : std_logic_vector((STREAMS_TOHOST-2)*GBT_NUM-1 downto 0) := (others => '0'); + signal data_good_slv : std_logic_vector((STREAMS_TOHOST-2)*GBT_NUM-1 downto 0) := (others => '0'); + signal chunk_size : array_2d_8b(GBT_NUM-1 downto 0, STREAMS_TOHOST-3 downto 0); + + signal count_final : std_logic_vector(4 downto 0) := (others => '0'); + signal enabled_aligned : array_2b(15 downto 0) := (others => (others => '0')); + signal timeout : boolean := false; +begin + + --clocks + + clk160_tmp <= not clk160_tmp after clk40_period/8; --160 MHZ + clk160 <= clk160_tmp when clk_en else '0'; + clk240_tmp <= not clk240_tmp after clk40_period/12; --240 MHZ + clk240 <= clk240_tmp when clk_en else '0'; + clk320_tmp <= not clk320_tmp after clk40_period/16; --320 MHZ + clk320 <= clk320_tmp when clk_en else '0'; + + cnt_div_max <= "11" when FIRMWARE_MODE = 11 else "10" when FIRMWARE_MODE = 6 else "00"; + clk_prcss <= clk320 when FIRMWARE_MODE = 11 else clk240 when FIRMWARE_MODE = 6 else '0'; + clk40 <= clk40_tmp; + process(clk_prcss) --clk40 needs to be in sync with clk240 for GBT and clk320 for LPGBT + begin + if rising_edge(clk_prcss) then + if cnt_div = cnt_div_max then + cnt_div <= "00"; + clk40_tmp <= not clk40_tmp; + else + cnt_div <= cnt_div + "01"; + end if; + end if; + end process; + + + --Link Configuration + g_lane_control : for link in 0 to GBT_NUM-1 generate + signal elink_output_width : array_of_slv_2_0(NUMELINKmax-1 downto 0) := (others => "111"); + signal elink_enable : std_logic_vector(NUMELINKmax-1 downto 0) := (others => '1'); + signal data_format : std_logic_vector(1 downto 0); + begin + lane_control(link).global.framegen_reset <= '0'; + lane_control(link).global.elink_sync <= '0'; + lane_control(link).global.framegen_data_select <= '0'; + lane_control(link).global.emu_data_select <= '1'; + lane_control(link).global.l1a_source <= '0'; + lane_control(link).global.loopback_fifo_delay <= "00010"; + lane_control(link).global.loopback_fifo_reset <= '0'; + lane_control(link).global.a_ch_bit_sel <= "0000001"; + lane_control(link).global.b_ch_bit_sel <= "0000010"; + lane_control(link).global.MSB <= '1'; + lane_control(link).global.FEC <= '0'; + lane_control(link).global.DATARATE <= '1'; + lane_control(link).global.aligned <= '1'; + lane_control(link).global.l1a_max_count <= x"0000190"; + + lane_control(link).fmemu_random.FMEMU_RANDOM_CONTROL.SELECT_RANDOM <= select_random; + lane_control(link).fmemu_random.FMEMU_RANDOM_CONTROL.SEED <= "1000000000"; --0x200 + lane_control(link).fmemu_random.FMEMU_RANDOM_CONTROL.POLYNOMIAL <= "1001000000"; --0x240 + lane_control(link).fmemu_random.FMEMU_RANDOM_RAM_ADDR <= "0000000000"; + lane_control(link).fmemu_random.FMEMU_RANDOM_RAM.WE <= "0"; + lane_control(link).fmemu_random.FMEMU_RANDOM_RAM.CHANNEL_SELECT <= (others=>'0'); + lane_control(link).fmemu_random.FMEMU_RANDOM_RAM.DATA <= (others=>'0'); + + lane_control(link).emulator(0).output_width <= "010" when FIRMWARE_MODE = 11 else "000" when FIRMWARE_MODE = 6 else "000";-- 8b 2b + lane_control(link).emulator(1).output_width <= "010" when FIRMWARE_MODE = 11 else "000" when FIRMWARE_MODE = 6 else "000";-- 8b 2b + lane_control(link).emulator(2).output_width <= "011" when FIRMWARE_MODE = 11 else "001" when FIRMWARE_MODE = 6 else "000";--16b 4b + lane_control(link).emulator(3).output_width <= "011" when FIRMWARE_MODE = 11 else "001" when FIRMWARE_MODE = 6 else "000";--16b 4b + lane_control(link).emulator(4).output_width <= "100" when FIRMWARE_MODE = 11 else "010" when FIRMWARE_MODE = 6 else "000";--32b 8b + lane_control(link).emulator(5).output_width <= "100";--32b + lane_control(link).emulator(6).output_width <= "100";--32b + + data_format <= "01"; + + g_emu_control : for egroup in lane_control(link).emulator'range generate + lane_control(link).emulator(egroup).pattern_select <= "00"; + lane_control(link).emulator(egroup).data_format <= data_format; + lane_control(link).emulator(egroup).sw_busy <= '0'; + lane_control(link).emulator(egroup).reset <= '0';--emu_reset; + lane_control(link).emulator(egroup).chunk_length <= X"003C"; --60+8 + lane_control(link).emulator(egroup).userdata <= X"ABCD"; + + less_that_five : if egroup<5 generate + elink_enable(egroup*16+7 downto egroup*16) <= X"FF" when (lane_control(link).emulator(egroup).output_width <= "000") else + X"55" when (lane_control(link).emulator(egroup).output_width <= "001") else + X"11" when (lane_control(link).emulator(egroup).output_width <= "010") else + X"01" when (lane_control(link).emulator(egroup).output_width <= "011") else + X"01" when (lane_control(link).emulator(egroup).output_width <= "100"); + elink_enable(egroup*16+15 downto egroup*16+8) <= X"FF" when (lane_control(link).emulator(egroup).output_width <= "000" and FIRMWARE_MODE = 11 and lane_control(link).global.DATARATE = '1') else + X"55" when (lane_control(link).emulator(egroup).output_width <= "001" and FIRMWARE_MODE = 11 and lane_control(link).global.DATARATE = '1') else + X"11" when (lane_control(link).emulator(egroup).output_width <= "010" and FIRMWARE_MODE = 11 and lane_control(link).global.DATARATE = '1') else + X"01" when (lane_control(link).emulator(egroup).output_width <= "011" and FIRMWARE_MODE = 11 and lane_control(link).global.DATARATE = '1') else + X"00"; + end generate less_that_five; + five : if egroup=5 generate + elink_enable(egroup*16+7 downto egroup*16) <= X"FF" when (lane_control(link).emulator(egroup).output_width <= "000" and FIRMWARE_MODE = 11) else + X"55" when (lane_control(link).emulator(egroup).output_width <= "001" and FIRMWARE_MODE = 11) else + X"11" when (lane_control(link).emulator(egroup).output_width <= "010" and FIRMWARE_MODE = 11) else + X"01" when (lane_control(link).emulator(egroup).output_width <= "011" and FIRMWARE_MODE = 11) else + X"01" when (lane_control(link).emulator(egroup).output_width <= "100" and FIRMWARE_MODE = 11) else + X"00"; + elink_enable(egroup*16+15 downto egroup*16+8) <= X"FF" when (lane_control(link).emulator(egroup).output_width <= "000" and FIRMWARE_MODE = 11 and lane_control(link).global.DATARATE = '1') else + X"55" when (lane_control(link).emulator(egroup).output_width <= "001" and FIRMWARE_MODE = 11 and lane_control(link).global.DATARATE = '1') else + X"11" when (lane_control(link).emulator(egroup).output_width <= "010" and FIRMWARE_MODE = 11 and lane_control(link).global.DATARATE = '1') else + X"01" when (lane_control(link).emulator(egroup).output_width <= "011" and FIRMWARE_MODE = 11 and lane_control(link).global.DATARATE = '1') else + X"00"; + end generate five; + six : if egroup=6 generate + elink_enable(egroup*16+7 downto egroup*16) <= X"FF" when (lane_control(link).emulator(egroup).output_width <= "000" and FIRMWARE_MODE = 11 and lane_control(link).global.FEC = '0') else + X"55" when (lane_control(link).emulator(egroup).output_width <= "001" and FIRMWARE_MODE = 11 and lane_control(link).global.FEC = '0') else + X"11" when (lane_control(link).emulator(egroup).output_width <= "010" and FIRMWARE_MODE = 11 and lane_control(link).global.FEC = '0') else + X"01" when (lane_control(link).emulator(egroup).output_width <= "011" and FIRMWARE_MODE = 11 and lane_control(link).global.FEC = '0') else + X"01" when (lane_control(link).emulator(egroup).output_width <= "100" and FIRMWARE_MODE = 11 and lane_control(link).global.FEC = '0') else + X"00"; + elink_enable(egroup*16+15 downto egroup*16+8) <= X"FF" when (lane_control(link).emulator(egroup).output_width <= "000" and FIRMWARE_MODE = 11 and lane_control(link).global.DATARATE = '1' and lane_control(link).global.FEC = '0') else + X"55" when (lane_control(link).emulator(egroup).output_width <= "001" and FIRMWARE_MODE = 11 and lane_control(link).global.DATARATE = '1' and lane_control(link).global.FEC = '0') else + X"11" when (lane_control(link).emulator(egroup).output_width <= "010" and FIRMWARE_MODE = 11 and lane_control(link).global.DATARATE = '1' and lane_control(link).global.FEC = '0') else + X"01" when (lane_control(link).emulator(egroup).output_width <= "011" and FIRMWARE_MODE = 11 and lane_control(link).global.DATARATE = '1' and lane_control(link).global.FEC = '0') else + X"00"; + end generate six; + width : for k in 0 to 7 generate + elink_output_width(egroup*16+k) <= lane_control(link).emulator(egroup).output_width; + elink_output_width(egroup*16+k+8) <= lane_control(link).emulator(egroup).output_width when (FIRMWARE_MODE = 11 and lane_control(link).global.DATARATE = '1') else "111"; + end generate width; + + end generate g_emu_control; + + g_elink_control : for epath in lane_control(link).elink'range generate + lane_control(link).elink(epath).input_width <= '0' when data_format = "00" else '1'; + lane_control(link).elink(epath).endian_mode <= '0'; + lane_control(link).elink(epath).enable <= elink_enable(epath); + lane_control(link).elink(epath).output_width <= elink_output_width(epath); + end generate g_elink_control; + + end generate g_lane_control; + + --FELIG emulator wrapper + + g_lw_signals : for i in 0 to GBT_NUM-1 generate + signal count_max : std_logic_vector(2 downto 0); + signal count : std_logic_vector(2 downto 0) := "000"; + begin + clkTX(i) <= clk320 when FIRMWARE_MODE = 11 else clk240 when FIRMWARE_MODE = 6 else '0'; + count_max <= "111" when FIRMWARE_MODE = 11 else "101" when FIRMWARE_MODE = 6 else "000"; + process(clkTX(i)) + begin + if rising_edge(clkTX(i)) then + if count = count_max then + count <= "000"; + link_tx_flag(i) <= '1'; + else + count <= count + "001"; + link_tx_flag(i) <= '0'; + end if; + end if; + end process; + end generate g_lw_signals; + + clkRX <= clkTX; + --link_rx_flag <= link_tx_flag; + + FELIG_emu : entity work.EmulatorWrapper + generic map( + GBT_NUM => GBT_NUM, + NUMELINKmax => NUMELINKmax, + NUMEGROUPmax => NUMEGROUPmax, + FIRMWARE_MODE => FIRMWARE_MODE) + port map ( + clk40 => clk40, + gt_txusrclk_in => clkTX, + gt_rxusrclk_in => clkRX, + link_tx_data_228b_array_out => link_tx_data, + data_ready_tx_out => link_tx_valid, + link_rx_data_120b_array_in => (others => (others => '0')), + link_tx_flag_in => link_tx_flag, + link_rx_flag_in => (others => '0'),--link_rx_flag, + l1a_int_trigger_out => l1a_int_trigger, + lane_control => lane_control, + lane_monitor => lane_monitor + ); + + l1id <= lane_monitor(0).global.l1a_id(15 downto 0); + process(clk40) + begin + if rising_edge(clk40) then + l1id_buf <= l1id; + if l1id_buf /= l1id then + l1a <= '1'; + else + l1a <= '0'; + end if; + end if; + end process; + + --decoding lpgbt + g_dec_LPGBT: if FIRMWARE_MODE = 11 generate + signal lpGBT_UPLINK_USER_DATA : txrx224b_type(0 to GBT_NUM-1); + signal AlignmentPulseAlign : std_logic; + signal AlignmentPulseDeAlign : std_logic; + begin + m_axis_aclk <= clk240; + pulsegen0: entity work.AlignmentPulseGen + generic map( + MAX_VAL_DEALIGN => 2048, --2048 bytes at 8b10b / 80 Mb/s elink. + MAX_VAL_ALIGN => 20 --2 bytes at 8b10b / 80 Mb/s elink. + ) + port map( + clk40 => clk40, + AlignmentPulseAlign => AlignmentPulseAlign, + AlignmentPulseDeAlign => AlignmentPulseDeAlign + ); + g_Links : for link in 0 to GBT_NUM-1 generate + begin + process(clk40) + begin + if rising_edge(clk40) then + lpGBT_UPLINK_USER_DATA(link) <= link_tx_data(link)(223 downto 0); + end if; + end process; + g_Egroups: for egroup in 0 to 6 generate + signal ElinkWidth : std_logic_vector(2 downto 0); + signal PathEnable : std_logic_vector(3 downto 0); + signal ElinkAligned : std_logic_vector(3 downto 0); + signal m_axis_s : axis_32_array_type(0 to 3); + begin + g_axisindex: for i in 0 to 3 generate + m_axis(link,egroup*4+i) <= m_axis_s(i); + end generate; + ElinkWidth <= lane_control(link).emulator(egroup).output_width; + PathEnable <= "1111" when ElinkWidth = "010" else + "0101" when ElinkWidth = "011" else + "0001" when ElinkWidth = "100" else + "0000"; + + g_epaths : for epath in 0 to 3 generate + epath_width(link,egroup*4+epath) <= lane_control(link).emulator(egroup).output_width; + epath_enabled(link,egroup*4+epath) <= PathEnable(epath); + epath_aligned(link,egroup*4+epath) <= ElinkAligned(epath); + end generate; + --! Instantiate one Egroup. + eGroup0: entity work.DecEgroup_8b10b + generic map( + BLOCKSIZE => 1024, + Support32bWidth => '1', + Support16bWidth => '1', + Support8bWidth => '1', + IncludeElinks => "1111", + VERSAL => false + ) + port map( + clk40 => clk40, + daq_reset => reset, + daq_fifo_flush => '0', + DataIn => lpGBT_UPLINK_USER_DATA(link)(egroup*32+31 downto egroup*32), + EnableIn => PathEnable, + LinkAligned => lane_control(link).global.aligned, + ElinkWidth => ElinkWidth, + AlignmentPulseAlign => AlignmentPulseAlign, + AlignmentPulseDeAlign => AlignmentPulseDeAlign, + AutoRealign => '1', + RealignmentEvent => open, + PathEncoding => x"1111", --"0001" per epath. All 8b10b encoded + ElinkAligned => ElinkAligned, + DecodingErrors => open, + MsbFirst => '1', + ReverseInputBits => (others => '0'), + HGTD_ALTIROC_DECODING => '0', + FE_BUSY_out => open, + m_axis => m_axis_s, + m_axis_tready => (others => '1'), + m_axis_aclk => m_axis_aclk, + m_axis_prog_empty => open + ); + end generate g_Egroups; + end generate g_Links; + end generate g_dec_LPGBT; + + g_dec_GBT: if FIRMWARE_MODE = 6 generate + type txrx80b_type is array (natural range <>) of std_logic_vector(79 downto 0); + signal GBT_UPLINK_USER_DATA : txrx80b_type(0 to GBT_NUM-1); + signal AlignmentPulseAlign : std_logic; + signal AlignmentPulseDeAlign : std_logic; + begin + m_axis_aclk <= clk160; + pulsegen0: entity work.AlignmentPulseGen + generic map( + MAX_VAL_DEALIGN => 2048, --2048 bytes at 8b10b / 80 Mb/s elink. + MAX_VAL_ALIGN => 20 --2 bytes at 8b10b / 80 Mb/s elink. + ) + port map( + clk40 => clk40, + AlignmentPulseAlign => AlignmentPulseAlign, + AlignmentPulseDeAlign => AlignmentPulseDeAlign + ); + g_Links : for link in 0 to GBT_NUM-1 generate + begin + process(clk40) + begin + if rising_edge(clk40) then + GBT_UPLINK_USER_DATA(link) <= link_tx_data(link)(111 downto 32); + end if; + end process; + g_Egroups: for egroup in 0 to 4 generate + signal ReverseElinks : std_logic_vector(7 downto 0); + signal ElinkWidth : std_logic_vector(2 downto 0); + signal PathEnable : std_logic_vector(7 downto 0); + signal EnableEgroupTruncation : std_logic; + signal DecoderAligned : std_logic_vector(7 downto 0); + signal m_axis_s : axis_32_array_type(0 to 7); + begin + g_axisindex: for i in 0 to 7 generate + m_axis(link,egroup*8+i) <= m_axis_s(i); + end generate; + + ReverseElinks <= (others => '0'); + ElinkWidth <= lane_control(link).emulator(egroup).output_width; + PathEnable <= "11111111" when ElinkWidth = "000" else + "01010101" when ElinkWidth = "001" else + "00010001" when ElinkWidth = "010" else + "00000001" when ElinkWidth = "011" else + "00000000"; + EnableEgroupTruncation <= '0'; --to_sl(register_map_control.DECODING_EGROUP_CTRL(link mod 12)(egroup).ENABLE_TRUNCATION); + + g_epaths : for epath in 0 to 7 generate + epath_width(link,egroup*8+epath) <= lane_control(link).emulator(egroup).output_width; + epath_enabled(link,egroup*8+epath) <= PathEnable(epath); + epath_aligned(link,egroup*8+epath) <= DecoderAligned(epath); + end generate; + + eGroup0: entity work.DecodingEgroupGBT + generic map( + INCLUDE_16b => '1', + INCLUDE_8b => '1', + INCLUDE_4b => '1', + INCLUDE_2b => '1', + INCLUDE_8b10b => '1', + INCLUDE_HDLC => '0', + INCLUDE_DIRECT => '0', + BLOCKSIZE => 1024, + USE_BUILT_IN_FIFO => x"AA", + GENERATE_FEI4B => false, + VERSAL => false + ) + port map( + clk40 => clk40, + daq_reset => reset, + daq_fifo_flush => '0', + EpathEnable => PathEnable, + EpathEncoding => x"11111111", --"0001" per epath. All 8b10b encoded + ElinkWidth => ElinkWidth, + MsbFirst => '1', + ReverseInputBits => ReverseElinks, + EnableTruncation => EnableEgroupTruncation, + DecoderAligned => DecoderAligned, + EGroupData => GBT_UPLINK_USER_DATA(link)(egroup*16+15 downto egroup*16), + GBTAligned => lane_control(link).global.aligned, + FE_BUSY_out => open, + m_axis => m_axis_s, + m_axis_tready => (others => '1'), + m_axis_aclk => m_axis_aclk, + m_axis_prog_empty => open, + AlignmentPulseAlign => AlignmentPulseAlign, + AlignmentPulseDeAlign => AlignmentPulseDeAlign, + AutoRealign => '1', + RealignmentEvent => open + ); + + end generate g_Egroups; + end generate g_Links; + end generate g_dec_GBT; + + --checking data + g_checking_data : for link in 0 to GBT_NUM-1 generate + g_Streams: for stream in 0 to STREAMS_TOHOST-3 generate + signal data : std_logic_vector(31 downto 0); + signal data10b : std_logic_vector(9 downto 0); + signal valid : std_logic; + signal last : std_logic; + signal keep : std_logic_vector(3 downto 0); + signal count8b : std_logic_vector(1 downto 0) := "00"; + signal count_chunks : std_logic_vector(6 downto 0); + signal checked : std_logic := '0'; + signal check_words : std_logic := '0'; + signal check_length : std_logic := '0'; + signal reset_v_ch : std_logic := '0'; + signal width : std_logic_vector(7 downto 0); + signal exp_checks : std_logic_vector(6 downto 0) := (others => '0'); + signal cnt_checks : std_logic_vector(6 downto 0) := (others => '0'); + signal good : std_logic := '0'; + begin + data <= m_axis(link,stream).tdata when epath_aligned(link,stream) = '1' and epath_enabled(link,stream) = '1' else (others => '0'); + valid <= m_axis(link,stream).tvalid when epath_aligned(link,stream) = '1' and epath_enabled(link,stream) = '1' else '0'; + last <= m_axis(link,stream).tlast when epath_aligned(link,stream) = '1' and epath_enabled(link,stream) = '1' else '0'; + keep <= m_axis(link,stream).tkeep when epath_aligned(link,stream) = '1' and epath_enabled(link,stream) = '1' else (others => '0'); + width <= "00000010" when epath_width(link,stream) = "000" else + "00000100" when epath_width(link,stream) = "001" else + "00001000" when epath_width(link,stream) = "010" else + "00010000" when epath_width(link,stream) = "011" else + "00100000" when epath_width(link,stream) = "100" else + "00000000"; + --data_good(link,stream) <= '0' when stream = 24 else good; + data_good(link,stream) <= good; + + process(m_axis_aclk) + begin + if rising_edge(m_axis_aclk) then + if count8b = "00" and valid = '0' then + count8b <= count8b; + elsif count8b = "11" then + count8b <= "00"; + else + count8b <= count8b + "01"; + end if; + end if; + end process; + data10b <= "11" & data( 7 downto 0) when count8b = "00" and valid = '1' and keep(0) = '1' and keep(3 downto 1) = "000" and last = '1' else + "01" & data( 7 downto 0) when count8b = "00" and valid = '1' and keep(0) = '1' else + "11" & data(15 downto 8) when count8b = "01" and keep(1) = '1' and keep(3 downto 2) = "00" and last = '1' else + "01" & data(15 downto 8) when count8b = "01" and keep(1) = '1' else + "11" & data(23 downto 16) when count8b = "01" and keep(2) = '1' and keep(3) = '0' and last = '1' else + "01" & data(23 downto 16) when count8b = "10" and keep(2) = '1'else + last & "1" & data(31 downto 24) when count8b = "11" and keep(3) = '1'else + (others=> '0'); + process(m_axis_aclk) + variable v_chunks : integer := 0; + variable size : integer := 0; + variable next_w : integer := 0; + variable next_b : integer := 0; + begin + if rising_edge(m_axis_aclk) then + if data10b(9 downto 8) = "01" then + v_chunks := v_chunks + 1; + reset_v_ch <= '0'; + --check_length <= '0'; + elsif data10b(9 downto 8) = "11" then + v_chunks := v_chunks + 1; + reset_v_ch <= '1'; + if v_chunks = size + 8 then --size + header + check_length <= '1'; + --else + --check_length <= '0'; + end if; + elsif data10b(9 downto 8) = "00" then + --check_length <= '0'; + if reset_v_ch = '1' then + if v_chunks = 0 then + cnt_checks <= (others => '0'); + reset_v_ch <= '0'; + else + v_chunks := 0; + end if; + else + reset_v_ch <= '0'; + end if; + end if; + + count_chunks <= std_logic_vector(to_unsigned(v_chunks, count_chunks'length)); + exp_checks <= std_logic_vector(to_unsigned(5 + size/2, exp_checks'length)); + + if v_chunks = 1 and data10b(7 downto 0) = x"aa" and data10b(8) = '1' then --checks first byte + check_words <= '1'; + elsif v_chunks = 3 and data10b(8) = '1' then + size := to_integer(unsigned(data10b(7 downto 0))); + chunk_size(link,stream) <= data10b(7 downto 0); + elsif v_chunks = 5 and data10b(7 downto 0) = l1id(7 downto 0) and data10b(8) = '1' then + check_words <= '1'; + next_w := 10; + next_b := size - 2; + elsif v_chunks = 6 and data10b(7 downto 0) = x"bb" and data10b(8) = '1'then + check_words <= '1'; + elsif v_chunks = 7 and data10b(7 downto 0) = x"aa" and data10b(8) = '1'then + check_words <= '1'; + elsif v_chunks = 8 and data10b(7 downto 0) = width and data10b(8) = '1' then + check_words <= '1'; + elsif v_chunks = next_w and data10b(7 downto 0) = std_logic_vector(to_unsigned(next_b,8)) and data10b(8) = '1' then + check_words <= '1'; + next_w := next_w + 2; + if next_b > 1 then + next_b := next_b - 2; + end if; + else + check_words <= '0'; + end if; + + if check_words = '1' then + cnt_checks <= cnt_checks + '1'; + end if; + + if cnt_checks = exp_checks and check_length = '1' then + check_length <= '0'; + good <= '1'; + end if; + + if l1a = '1' then --new trigger + good <= '0'; + end if; + end if; + end process; + end generate g_Streams; + end generate g_checking_data; + + process(m_axis_aclk) + variable count_f : integer := 0; + begin + if rising_edge(m_axis_aclk) then + reset_d <= reset; + l1a_d <= l1a; + l1a_int_trigger_d <= l1a_int_trigger; + if l1a_int_trigger = '1' and l1a_int_trigger_d = '0' then + epath_aligned_d_slv <= epath_aligned_slv; + epath_aligned_dd_slv <= epath_aligned_d_slv; --delaying again because l1a_int_trigger comes before l1a so comparison wouldnt work + end if; + if l1a_d = '0' and l1a = '1'then + count_f := count_f + 1; + if data_good_slv = epath_aligned_dd_slv and count_f <= 16 then + count_final <= count_final + '1'; + if epath_aligned_dd_slv = epath_enabled_slv then + enabled_aligned(count_f-1) <= "11"; + else + enabled_aligned(count_f-1) <= "01"; + end if; + end if; + elsif l1a_d = '1' and l1a = '0' then + log(ID_MONITOR,"enabled_aligned value is "&to_string(enabled_aligned(count_f-1),HEX)&". 0: data bad, 1: data good but not all decoders aligned, 3: data goot and aligned", C_SCOPE); + end if; + end if; + end process; + + g_to_slv_link : for link in 0 to GBT_NUM-1 generate + g_to_slv_stream: for stream in 0 to STREAMS_TOHOST-3 generate + epath_enabled_slv(link*(STREAMS_TOHOST-2)+stream) <= epath_enabled(link,stream); + epath_aligned_slv(link*(STREAMS_TOHOST-2)+stream) <= epath_aligned(link,stream); + data_good_slv(link*(STREAMS_TOHOST-2)+stream) <= data_good(link,stream); + end generate g_to_slv_stream; + end generate g_to_slv_link; + + --sim process + mainproc : process + variable vcnt : std_logic_vector(4 downto 0); + begin + assert false + report "START SIMULATION" + severity NOTE; + clk_en <= true; + reset <= '0'; + select_random <= "0"; + wait for 2 ns; + reset <= '1'; + wait for 50 ns; + reset <= '0'; + log(ID_MONITOR,"chunk size fixed to "&to_string(lane_control(0).emulator(0).chunk_length,DEC), C_SCOPE); + while true loop + wait until l1a = '1' or timeout; + if l1id /= "0000000000000000" then + log(ID_MONITOR,"TRIGGER NUMBER "&to_string(l1id,DEC), C_SCOPE); + for link in 0 to GBT_NUM-1 loop + for stream in 0 to STREAMS_TOHOST-3 loop + if epath_enabled(link,stream) = '1' then + log(ID_MONITOR,"LINK "&to_string(link)& + " EPATH "&to_string(stream)& + " ENABLED "&to_string(epath_enabled(link,stream))& + " ALIGNED "&to_string(epath_aligned(link,stream))& + " SIZE "&to_string(chunk_size(link,stream),DEC)& + " DATA GOOD "&to_string(data_good(link,stream)) + , C_SCOPE); + end if; + end loop; + end loop; + end if; + wait for 1 ns; + if timeout or l1id = "0000000000010000" then + exit; + elsif l1id = "0000000000000111" then + select_random <= "1"; + end if; + end loop; + wait for 1 us; + + vcnt := count_final; + check_value(vcnt,l1id(4 downto 0), ERROR, "Verifying the number of triggers with good data",C_SCOPE); + check_value(timeout,false, ERROR, "Timeout check",C_SCOPE); + report_alert_counters(FINAL); -- Report final counters and print conclusion for simulation (Success/Fail) + log(ID_LOG_HDR, "SIMULATION COMPLETED", C_SCOPE); + + -- Finish the simulation + if use_vunit = false then + std.env.stop; + end if; + uvvm_completed <= '1'; + wait; -- to stop completely + finish; + wait for 1000 us; + end process; + + --timeout + timeoutproc : process + begin + wait for 1000 us; + timeout <= true; + end process; +end tb; + diff --git a/simulation/UVVMtests/tb/FELIGexternaltrigger_tb.vhd b/simulation/UVVMtests/tb/FELIGexternaltrigger_tb.vhd new file mode 100644 index 0000000000000000000000000000000000000000..a385fad8daebfe226a2fc9b433bc1c7349324210 --- /dev/null +++ b/simulation/UVVMtests/tb/FELIGexternaltrigger_tb.vhd @@ -0,0 +1,512 @@ +--ricardo luz, argonne + +library IEEE; + use IEEE.std_logic_1164.all; + use IEEE.numeric_std.all; + use IEEE.numeric_std_unsigned.all; + use IEEE.std_logic_textio.all; + + use std.env.all; + use std.textio.all; + + use work.FELIX_package.all; + use work.pcie_package.all; + use work.axi_stream_package.all; + use work.centralRouter_package.all; + use work.type_lib.ALL; + +library xpm; + use xpm.vcomponents.all; + +library uvvm_util; + context uvvm_util.uvvm_util_context; + +entity FELIGexternaltrigger_tb is + generic( + use_vunit : boolean := false + ); + port( + uvvm_completed: out std_logic := '0' + ); +end FELIGexternaltrigger_tb; + +architecture Behavioral of FELIGexternaltrigger_tb is + function FM_TO_PROTOCOL(FIRMWARE_MODE:integer) + return std_logic is + begin + if FIRMWARE_MODE = FIRMWARE_MODE_FELIG_GBT then + return '0'; + elsif FIRMWARE_MODE = FIRMWARE_MODE_FELIG_LPGBT then + return '1'; + else + return '0'; + end if; + end function; + constant GBT_NUM : integer := 1; + constant FIRMWARE_MODE : integer := 11; + constant NUMELINKmax : integer := 112; --name number of epahts per egroup (theoretically 2b epath * 112=224, but never happens) + constant NUMEGROUPmax : integer := 7; --name number of egroups + + constant clk40_period : time := 25 ns; + signal clk_en : boolean := false; + signal clk40 : std_logic; + signal clk40_tmp : std_logic := '0'; + signal clk320 : std_logic; + signal clk320_tmp : std_logic := '0'; + signal clk_prcss : std_logic := '0'; + signal clkTX : std_logic_vector(GBT_NUM-1 downto 0); + signal clkRX : std_logic_vector(GBT_NUM-1 downto 0); + signal cnt_div : std_logic_vector(1 downto 0) := (others => '0'); + signal cnt_div_max : std_logic_vector(1 downto 0) := (others => '0'); + + signal reset : std_logic; + signal reset_d : std_logic; + + signal register_map_control : register_map_control_type; +-- signal single_l1a_long : std_logic_vector(0 downto 0) := "0"; +-- signal single_ecr_long : std_logic_vector(0 downto 0) := "0"; +-- signal single_bcr_long : std_logic_vector(0 downto 0) := "0"; + signal single_l1a_long : std_logic := '0'; + signal single_ecr_long : std_logic := '0'; + signal single_bcr_long : std_logic := '0'; + signal enable_ttc : std_logic := '0'; + signal TTCout : std_logic_vector(9 downto 0) := (others => '0'); + signal TTCout320 : std_logic_vector(9 downto 0) := (others => '0'); + + signal lane_control : array_of_lane_control_type(GBT_NUM-1 downto 0); + signal lane_monitor : array_of_lane_monitor_type(GBT_NUM-1 downto 0); + signal aligned : std_logic := '0'; + + signal L1A : std_logic := '0'; + signal L1A_count : std_logic_vector(7 downto 0) := (others => '0'); + signal l1a_id_register_rst : std_logic := '0'; + signal txrx_flag : std_logic := '0'; + signal rx_data : std_logic_vector(119 downto 0) := (others => '0'); + signal tx_data : std_logic_vector(227 downto 0) := (others => '0'); + signal tx_eg_data : array_32b(NUMEGROUPmax-1 downto 0); + signal data_to_be_checked : std_logic_vector(7 downto 0) := (others => '0'); + signal tx_rdy : std_logic := '0'; + signal data_delay : std_logic_vector(7 downto 0) := (others => '0'); + signal valid_delay : std_logic := '0'; + signal data_count : std_logic_vector(31 downto 0) := (others => '0'); + signal data_size : std_logic_vector(31 downto 0) := (others => '0'); + + signal emu_l1a_id : std_logic_vector(15 downto 0) := (others => '0'); + signal emu_l1a_id_delay : std_logic_vector(15 downto 0) := (others => '0'); + signal emu_l1a : std_logic := '0'; + signal emu_l1a_40 : std_logic := '0'; + signal next_l1a_id : std_logic_vector(15 downto 0) := x"0001"; + + signal check_words : std_logic := '0'; + signal exp_checks : std_logic_vector(6 downto 0) := (others => '0'); + signal cnt_checks : std_logic_vector(6 downto 0) := (others => '0'); + signal good : std_logic := '0'; + + signal count_good_ids : std_logic_vector(7 downto 0) := (others => '0'); + signal count_good_data : std_logic_vector(7 downto 0) := (others => '0'); + signal count_triggers : std_logic_vector(7 downto 0) := (others => '0'); + + signal test : std_logic := '0'; + signal timeout : boolean := false; +begin + + --clocks + + clk320_tmp <= not clk320_tmp after clk40_period/16; --320 MHZ + clk320 <= clk320_tmp when clk_en else '0'; + + cnt_div_max <= "11"; + clk_prcss <= clk320; + clk40 <= clk40_tmp; + process(clk_prcss) + begin + if rising_edge(clk_prcss) then + if cnt_div = cnt_div_max then + cnt_div <= "00"; + clk40_tmp <= not clk40_tmp; + else + cnt_div <= cnt_div + "01"; + end if; + end if; + end process; + + --gen lane_control for FELIG + + g_lane_control : for link in 0 to GBT_NUM-1 generate + signal elink_output_width : array_of_slv_2_0(NUMELINKmax-1 downto 0) := (others => "111"); + signal elink_enable : std_logic_vector(NUMELINKmax-1 downto 0) := (others => '1'); + signal data_format : std_logic_vector(1 downto 0); + begin + lane_control(link).global.framegen_reset <= '0'; + lane_control(link).global.elink_sync <= '0'; + lane_control(link).global.framegen_data_select <= '0'; + lane_control(link).global.emu_data_select <= '1'; + lane_control(link).global.l1a_source <= '1';--EXTERNAL TRIGGER + lane_control(link).global.loopback_fifo_delay <= "00010"; + lane_control(link).global.loopback_fifo_reset <= '0'; + lane_control(link).global.a_ch_bit_sel <= "0000000"; + lane_control(link).global.b_ch_bit_sel <= "0000001"; + lane_control(link).global.MSB <= '1'; + lane_control(link).global.FEC <= '0'; + lane_control(link).global.DATARATE <= '1'; + lane_control(link).global.aligned <= aligned; + lane_control(link).global.l1a_max_count <= x"0000000"; + lane_control(link).global.lane_reset <= '0'; + lane_control(link).global.l1a_counter_reset <= l1a_id_register_rst; + lane_control(link).fmemu_random.FMEMU_RANDOM_CONTROL.SELECT_RANDOM <= "0"; + lane_control(link).fmemu_random.FMEMU_RANDOM_CONTROL.SEED <= "1000000000"; --0x200 + lane_control(link).fmemu_random.FMEMU_RANDOM_CONTROL.POLYNOMIAL <= "1001000000"; --0x240 + lane_control(link).fmemu_random.FMEMU_RANDOM_RAM_ADDR <= "0000000000"; + lane_control(link).fmemu_random.FMEMU_RANDOM_RAM.WE <= "0"; + lane_control(link).fmemu_random.FMEMU_RANDOM_RAM.CHANNEL_SELECT <= (others=>'0'); + lane_control(link).fmemu_random.FMEMU_RANDOM_RAM.DATA <= (others=>'0'); + + lane_control(link).emulator(0).output_width <= "010" when FIRMWARE_MODE = 11 else "000" when FIRMWARE_MODE = 6 else "000";-- 8b 2b + lane_control(link).emulator(1).output_width <= "010" when FIRMWARE_MODE = 11 else "000" when FIRMWARE_MODE = 6 else "000";-- 8b 2b + lane_control(link).emulator(2).output_width <= "011" when FIRMWARE_MODE = 11 else "001" when FIRMWARE_MODE = 6 else "000";--16b 4b + lane_control(link).emulator(3).output_width <= "011" when FIRMWARE_MODE = 11 else "001" when FIRMWARE_MODE = 6 else "000";--16b 4b + lane_control(link).emulator(4).output_width <= "100" when FIRMWARE_MODE = 11 else "010" when FIRMWARE_MODE = 6 else "000";--32b 8b + lane_control(link).emulator(5).output_width <= "100";--32b + lane_control(link).emulator(6).output_width <= "100";--32b + + data_format <= "00"; + + g_emu_control : for egroup in lane_control(link).emulator'range generate + lane_control(link).emulator(egroup).pattern_select <= "00"; + lane_control(link).emulator(egroup).data_format <= data_format; + lane_control(link).emulator(egroup).sw_busy <= '0'; + lane_control(link).emulator(egroup).reset <= '0';--emu_reset; + lane_control(link).emulator(egroup).chunk_length <= X"003C"; --60+8 + lane_control(link).emulator(egroup).userdata <= X"ABCD"; + + less_that_five : if egroup<5 generate + elink_enable(egroup*16+7 downto egroup*16) <= X"FF" when (lane_control(link).emulator(egroup).output_width <= "000") else + X"55" when (lane_control(link).emulator(egroup).output_width <= "001") else + X"11" when (lane_control(link).emulator(egroup).output_width <= "010") else + X"01" when (lane_control(link).emulator(egroup).output_width <= "011") else + X"01" when (lane_control(link).emulator(egroup).output_width <= "100"); + elink_enable(egroup*16+15 downto egroup*16+8) <= X"FF" when (lane_control(link).emulator(egroup).output_width <= "000" and FIRMWARE_MODE = 11 and lane_control(link).global.DATARATE = '1') else + X"55" when (lane_control(link).emulator(egroup).output_width <= "001" and FIRMWARE_MODE = 11 and lane_control(link).global.DATARATE = '1') else + X"11" when (lane_control(link).emulator(egroup).output_width <= "010" and FIRMWARE_MODE = 11 and lane_control(link).global.DATARATE = '1') else + X"01" when (lane_control(link).emulator(egroup).output_width <= "011" and FIRMWARE_MODE = 11 and lane_control(link).global.DATARATE = '1') else + X"00"; + end generate less_that_five; + five : if egroup=5 generate + elink_enable(egroup*16+7 downto egroup*16) <= X"FF" when (lane_control(link).emulator(egroup).output_width <= "000" and FIRMWARE_MODE = 11) else + X"55" when (lane_control(link).emulator(egroup).output_width <= "001" and FIRMWARE_MODE = 11) else + X"11" when (lane_control(link).emulator(egroup).output_width <= "010" and FIRMWARE_MODE = 11) else + X"01" when (lane_control(link).emulator(egroup).output_width <= "011" and FIRMWARE_MODE = 11) else + X"01" when (lane_control(link).emulator(egroup).output_width <= "100" and FIRMWARE_MODE = 11) else + X"00"; + elink_enable(egroup*16+15 downto egroup*16+8) <= X"FF" when (lane_control(link).emulator(egroup).output_width <= "000" and FIRMWARE_MODE = 11 and lane_control(link).global.DATARATE = '1') else + X"55" when (lane_control(link).emulator(egroup).output_width <= "001" and FIRMWARE_MODE = 11 and lane_control(link).global.DATARATE = '1') else + X"11" when (lane_control(link).emulator(egroup).output_width <= "010" and FIRMWARE_MODE = 11 and lane_control(link).global.DATARATE = '1') else + X"01" when (lane_control(link).emulator(egroup).output_width <= "011" and FIRMWARE_MODE = 11 and lane_control(link).global.DATARATE = '1') else + X"00"; + end generate five; + six : if egroup=6 generate + elink_enable(egroup*16+7 downto egroup*16) <= X"FF" when (lane_control(link).emulator(egroup).output_width <= "000" and FIRMWARE_MODE = 11 and lane_control(link).global.FEC = '0') else + X"55" when (lane_control(link).emulator(egroup).output_width <= "001" and FIRMWARE_MODE = 11 and lane_control(link).global.FEC = '0') else + X"11" when (lane_control(link).emulator(egroup).output_width <= "010" and FIRMWARE_MODE = 11 and lane_control(link).global.FEC = '0') else + X"01" when (lane_control(link).emulator(egroup).output_width <= "011" and FIRMWARE_MODE = 11 and lane_control(link).global.FEC = '0') else + X"01" when (lane_control(link).emulator(egroup).output_width <= "100" and FIRMWARE_MODE = 11 and lane_control(link).global.FEC = '0') else + X"00"; + elink_enable(egroup*16+15 downto egroup*16+8) <= X"FF" when (lane_control(link).emulator(egroup).output_width <= "000" and FIRMWARE_MODE = 11 and lane_control(link).global.DATARATE = '1' and lane_control(link).global.FEC = '0') else + X"55" when (lane_control(link).emulator(egroup).output_width <= "001" and FIRMWARE_MODE = 11 and lane_control(link).global.DATARATE = '1' and lane_control(link).global.FEC = '0') else + X"11" when (lane_control(link).emulator(egroup).output_width <= "010" and FIRMWARE_MODE = 11 and lane_control(link).global.DATARATE = '1' and lane_control(link).global.FEC = '0') else + X"01" when (lane_control(link).emulator(egroup).output_width <= "011" and FIRMWARE_MODE = 11 and lane_control(link).global.DATARATE = '1' and lane_control(link).global.FEC = '0') else + X"00"; + end generate six; + width : for k in 0 to 7 generate + elink_output_width(egroup*16+k) <= lane_control(link).emulator(egroup).output_width; + elink_output_width(egroup*16+k+8) <= lane_control(link).emulator(egroup).output_width when (FIRMWARE_MODE = 11 and lane_control(link).global.DATARATE = '1') else "111"; + end generate width; + + end generate g_emu_control; + + g_elink_control : for epath in lane_control(link).elink'range generate + lane_control(link).elink(epath).input_width <= '0' when data_format = "00" else '1'; + lane_control(link).elink(epath).endian_mode <= '0'; + lane_control(link).elink(epath).enable <= elink_enable(epath); + lane_control(link).elink(epath).output_width <= elink_output_width(epath); + end generate g_elink_control; + + end generate g_lane_control; + + --Generate FELIX TTC signals + + process(clk40) + begin + if rising_edge(clk40) then + if L1A_count = x"8F" then + L1A_count <= x"00"; + L1A <= '1'; + count_triggers <= count_triggers + '1'; + else + L1A_count <= L1A_count + x"01"; + L1A <= '0'; + if count_triggers = x"04" and L1A_count = x"08" then + single_ecr_long <= '1'; + l1a_id_register_rst <= '0'; + log(ID_MONITOR,"ECR issued", C_SCOPE); + elsif count_triggers = x"09" and L1A_count = x"1F" then + single_ecr_long <= '0'; + l1a_id_register_rst <= '1'; + log(ID_MONITOR,"L1A ID register reset used", C_SCOPE); + else + single_ecr_long <= '0'; + l1a_id_register_rst <= '0'; + end if; + end if; + end if; + end process; + + single_l1a_long <= L1A; + register_map_control.TTC_EMU.SEL(1) <= enable_ttc; + register_map_control.TTC_EMU.ENA(0) <= enable_ttc; + register_map_control.TTC_EMU_TP_DELAY <= x"00000040"; + register_map_control.TTC_EMU_L1A_PERIOD <= x"00000000"; + register_map_control.TTC_EMU_ECR_PERIOD <= x"00000000"; + register_map_control.TTC_EMU_BCR_PERIOD <= x"00000dec"; + register_map_control.TTC_EMU_LONG_CHANNEL_DATA <= x"00000000"; + register_map_control.TTC_EMU_CONTROL.BROADCAST <= "000000"; + register_map_control.TTC_EMU_RESET(64) <= reset; + register_map_control.TTC_EMU_CONTROL.L1A(24) <= single_l1a_long; + register_map_control.TTC_EMU_CONTROL.ECR(26) <= single_ecr_long; + register_map_control.TTC_EMU_CONTROL.BCR(25) <= single_bcr_long; + register_map_control.TTC_EMU_CONTROL.BUSY_IN_ENABLE <= "0"; + + TTCEmu: entity work.TTC_Emulator + port map( + Clock => clk40, + Reset => reset, + register_map_control => register_map_control, + add_s8 => open, + add_d8 => open, + add_strobe => open, + add_e => open, + TTCout => TTCout, -- : out std_logic_vector(9 downto 0) + BUSYIn => '0' + ); + + + --cdr ttcout 40 to 320 + process(clk320) + variable count : integer := 0; + begin + if rising_edge(clk320) then + TTCout320 <= TTCout; + if count = 7 then + count := 0; + txrx_flag <= '1'; + else + count := count + 1; + txrx_flag <= '0'; + end if; + end if; + end process; + + --FELIG emulator + + rx_data(1) <= TTCout320(1); --b channel + rx_data(0) <= TTCout320(0); --l1a + + felig_emulator : entity work.emulator + generic map ( + useGBTdataEmulator => false, + sim_emulator => false, + LANE_ID => 0, + PROTOCOL => FM_TO_PROTOCOL(FIRMWARE_MODE) + ) + port map ( + clk40 => clk40, + lane_rxclk => clk320, + lane_txclk => clk320, + l1a_int_trigger => '0', + l1a_int_int_id => (others => '0'), + l1a_trigger_out => emu_l1a, + gbt_tx_data_228b_out => tx_data, + data_ready_tx_out => tx_rdy, + gbt_rx_data_120b_in => rx_data, + gbt_tx_flag_in => txrx_flag, + gbt_rx_flag_in => txrx_flag, + lane_control => lane_control(0), + lane_monitor => lane_monitor(0)--, + ); + + emu_l1a_id <= lane_monitor(0).global.l1a_id(15 downto 0); + + g_egroups : for eg in 0 to NUMEGROUPmax-1 generate --assuming LPGBT + tx_eg_data(eg) <= tx_data(32*(eg+1)-1 downto 32*eg); + end generate; + + data_to_be_checked <= tx_data(7 downto 0); -- 1 epath of the 8b egroup + + --gen data_valid + + process(clk320) + variable count_l1a : integer := 0; + begin + if rising_edge(clk320) then + if aligned = '1' then + if tx_rdy = '1' then + data_delay <= data_to_be_checked; + if valid_delay = '1' then + data_count <= data_count + '1'; + else + data_count <= (others => '0'); + end if; + + if data_count = x"00000002" then + data_size <= data_delay + x"00000008"; + end if; + + if data_count = data_size - x"00000001" and data_size /= x"00000000" then + valid_delay <= '0'; + end if; + end if; + if data_to_be_checked /= data_delay then + valid_delay <= '1'; + end if; + end if; + if emu_l1a = '1' then + count_l1a := count_l1a + 1; + emu_l1a_40 <= '1'; + else + if count_l1a /= 0 then + if count_l1a = 8 then + count_l1a := 0; + emu_l1a_40 <= '0'; + else + count_l1a := count_l1a + 1; + end if; + end if; + end if; + end if; + end process; + + --check_data (based on FELIGemulator_tb.vhd) + + process(clk40) + variable v_chunks : integer := 0; + variable size : integer := 100; + variable next_w : integer := 100; + variable next_b : integer := 100; + variable flag_check : std_logic := '0'; + begin + if rising_edge(clk40) then + if valid_delay = '1' then + v_chunks := v_chunks + 1; + else + v_chunks := 0; + end if; + + if v_chunks = 1 and data_delay = x"aa" then --checks first byte + check_words <= '1'; + flag_check := '1'; + elsif v_chunks = 3 then + size := to_integer(unsigned(data_delay)); + --chunk_size(link,stream) <= data_delay; + elsif v_chunks = 5 and data_delay = emu_l1a_id(7 downto 0) then + check_words <= '1'; + next_w := 10; + next_b := size - 2; + elsif v_chunks = 6 and data_delay = x"bb" then + check_words <= '1'; + elsif v_chunks = 7 and data_delay = x"aa" then + check_words <= '1'; + elsif v_chunks = 8 and data_delay = x"8" then + check_words <= '1'; + elsif v_chunks = next_w and data_delay = std_logic_vector(to_unsigned(next_b,8)) then + check_words <= '1'; + next_w := next_w + 2; + if next_b > 1 then + next_b := next_b - 2; + end if; + else + check_words <= '0'; + end if; + + if check_words = '1' then + cnt_checks <= cnt_checks + '1'; + end if; + + exp_checks <= std_logic_vector(to_unsigned(5 + size/2, exp_checks'length)); + + if cnt_checks = exp_checks and aligned = '1' then + good <= '1'; + end if; + + if flag_check = '1' and emu_l1a_40 = '1' then + flag_check := '0'; + cnt_checks <= (others => '0'); + good <= '0'; + if good = '1' then + count_good_data <= count_good_data + '1'; + end if; + end if; + end if; + end process; + + --check l1a_id + process(clk40) + begin + if rising_edge(clk40) then + emu_l1a_id_delay <= emu_l1a_id; + if emu_l1a_id_delay /= emu_l1a_id then + if aligned = '1' then + log(ID_MONITOR,"L1A ID is " & to_string(emu_l1a_id,DEC), C_SCOPE); + end if; + if emu_l1a_id = next_l1a_id then + count_good_ids <= count_good_ids + '1'; + next_l1a_id <= next_l1a_id + '1'; + end if; + end if; + if single_ecr_long = '1' or l1a_id_register_rst = '1' then + next_l1a_id <= (others => '0'); + end if; + end if; + end process; + + --main process + mainproc : process + variable vcnt : std_logic_vector(4 downto 0); + begin + assert false + report "START SIMULATION" + severity NOTE; + clk_en <= true; + reset <= '0'; + wait for 2 ns; + reset <= '1'; + wait for 50 ns; + reset <= '0'; + wait for 50 ns; + enable_ttc <= '1'; + wait for 50 ns; + aligned <= '1'; + + wait until (count_triggers = x"0F" and L1A_count = x"4F") or timeout; + check_value(count_good_ids,count_triggers, ERROR, "Comparing count_good_ids with count_triggers",C_SCOPE); + check_value(count_good_data,count_triggers-'1', ERROR, "Comparing count_good_data with count_triggers",C_SCOPE); + check_value(timeout,false, ERROR, "Timeout check",C_SCOPE); + report_alert_counters(FINAL); -- Report final counters and print conclusion for simulation (Success/Fail) + log(ID_LOG_HDR, "SIMULATION COMPLETED", C_SCOPE); + + --Finish the simulation + if use_vunit = false then + std.env.stop; + end if; + uvvm_completed <= '1'; + wait; -- to stop completely + finish; + wait for 1000 us; + end process; + + --timeout + timeoutproc : process + begin + wait for 500 us; + timeout <= true; + end process; +end Behavioral; diff --git a/simulation/UVVMtests/tb/FELIGlinkwrapperLPGBT_tb.vhd b/simulation/UVVMtests/tb/FELIGlinkwrapperLPGBT_tb.vhd new file mode 100644 index 0000000000000000000000000000000000000000..a0d0c6ed63c9971bab5c8667034b1f3762bcf765 --- /dev/null +++ b/simulation/UVVMtests/tb/FELIGlinkwrapperLPGBT_tb.vhd @@ -0,0 +1,346 @@ +--ricardo luz, argonne +--based on simulation/FELIG/felig_lpgbt_sim.vhd + +library IEEE; + use IEEE.std_logic_1164.all; + use IEEE.numeric_std.all; + use IEEE.numeric_std_unsigned.all; + use IEEE.std_logic_textio.all; + + use std.env.all; + use std.textio.all; + + use work.FELIX_package.all; + use work.pcie_package.all; + use work.axi_stream_package.all; + use work.centralRouter_package.all; + use work.type_lib.ALL; + +library xpm; + use xpm.vcomponents.all; + +library uvvm_util; + context uvvm_util.uvvm_util_context; + +entity FELIGlinkwrapperLPGBT_tb is + generic( + use_vunit : boolean := false + ); + port( + uvvm_completed: out std_logic := '0' + ); +end FELIGlinkwrapperLPGBT_tb; + +architecture Behavioral of FELIGlinkwrapperLPGBT_tb is + + constant GBT_NUM : integer := 1; + + constant clk40_period : time := 25 ns; + signal clk_en : boolean := false; + signal clk40 : std_logic; + signal clk40_tmp : std_logic := '0'; + signal clk320 : std_logic; + signal clk320_tmp : std_logic := '0'; + signal clk_prcss : std_logic := '0'; + signal cnt_div : std_logic_vector(1 downto 0) := (others => '0'); + signal cnt_div_max : std_logic_vector(1 downto 0) := (others => '0'); + + signal reset : std_logic := '0'; + signal reset_done : std_logic := '0'; + signal reset_clk40 : std_logic := '0'; + signal reset_done_clk40 : std_logic := '0'; + + type data16barray is array (0 to GBT_NUM-1) of std_logic_vector(15 downto 0); + type data32barray is array (0 to GBT_NUM-1) of std_logic_vector(31 downto 0); + type txrx234b_48ch_type is array (GBT_NUM-1 downto 0) of std_logic_vector(233 downto 0); + type txrx36b_48ch_type is array (GBT_NUM-1 downto 0) of std_logic_vector(35 downto 0); + + --lpgbt BE + signal alignment_done_BE : std_logic_vector(GBT_NUM-1 downto 0); + signal data_rdy_BE : std_logic_vector(GBT_NUM-1 downto 0); + signal RxSlide_BE : std_logic_vector(GBT_NUM-1 downto 0); + signal TX_DATA_BE : data16barray := (others => ("0000000000000000")); + signal uplinkData_i_BE : txrx234b_48ch_type; + signal fec_error_i_BE : std_logic_vector(GBT_NUM-1 downto 0); + signal fec_err_cnt_i_BE : array_32b(0 to GBT_NUM-1); + + --lpgbt FE + signal RxSlide_FE : std_logic_vector(GBT_NUM-1 downto 0); + signal alignment_done_FE : std_logic_vector(GBT_NUM-1 downto 0); + signal sta_headerFlag_out_FE : std_logic_vector(GBT_NUM-1 downto 0); + signal TX_DATA_FE : data32barray := (others => ("00000000000000000000000000000000")); + signal downLinkData_i_FE : txrx36b_48ch_type; + signal tx_flag_out_FE : std_logic_vector(GBT_NUM-1 downto 0); + + --data + signal data_to_be : std_logic_vector(223 downto 0) := (others => '0'); + signal data_to_fe : std_logic_vector(31 downto 0) := (others => '0'); + + --check + signal aligned : std_logic := '0'; + signal good_FE : std_logic_vector(GBT_NUM-1 downto 0) := (others => '0'); + signal good_BE : std_logic_vector(GBT_NUM-1 downto 0) := (others => '0'); + constant GBT_one : std_logic_vector(GBT_NUM-1 downto 0) := (others => '1'); + + signal timeout : boolean := false; +begin + + --clocks + + clk320_tmp <= not clk320_tmp after clk40_period/16; --320 MHZ + clk320 <= clk320_tmp when clk_en else '0'; + + cnt_div_max <= "11"; + clk_prcss <= clk320; + clk40 <= clk40_tmp; + + process(clk_prcss) + begin + if rising_edge(clk_prcss) then + if cnt_div = cnt_div_max then + cnt_div <= "00"; + clk40_tmp <= not clk40_tmp; + else + cnt_div <= cnt_div + "01"; + end if; + end if; + end process; + + --reset + + process(clk40) + begin + if clk40'event and clk40='1' then + reset_clk40 <= reset; + reset_done_clk40 <= reset_done; + data_to_be <= data_to_be + x"1"; + data_to_fe <= data_to_fe + x"1"; + end if; + end process; + + -- lpgbt FELIX + link_loop_BE : for i in 0 to GBT_NUM-1 generate + signal downlinkUserData_i : std_logic_vector(31 downto 0); + signal downlinkEcData_i : std_logic_vector(1 downto 0); + signal downlinkIcData_i : std_logic_vector(1 downto 0); + signal GT_TX_WORD_CLK : std_logic; + signal GT_RX_WORD_CLK : std_logic; + signal uplinkDATA : std_logic_vector(223 downto 0); + signal uplinkEC : std_logic_vector(1 downto 0); + signal uplinkIC : std_logic_vector(1 downto 0); + begin + downlinkUserData_i <= data_to_fe; + downlinkIcData_i <= "00"; + downlinkEcData_i <= "11"; + GT_TX_WORD_CLK <= clk320; + GT_RX_WORD_CLK <= clk320; + lpgbt_BE: entity work.FLX_LpGBT_BE + Port map ( + downlinkUserData_i => downlinkUserData_i, + downlinkEcData_i => downlinkEcData_i, + downlinkIcData_i => downlinkIcData_i, + TXCLK40 => clk40, + TXCLK320 => GT_TX_WORD_CLK, + RXCLK320m => GT_RX_WORD_CLK, + uplinkSelectFEC_i => '0', --FEC5 + data_rdy => data_rdy_BE(i), + Tx_scrambler_bypass => '0', + Tx_Interleaver_bypass => '0', + Tx_FEC_bypass => '0', + TxData_Out => TX_DATA_BE(i), + rxdatain => TX_DATA_FE(i), + GBT_TX_RST => reset_clk40, + GBT_RX_RST => reset_clk40, + uplinkBypassInterleaver_i => '0', + uplinkBypassFECEncoder_i => '0', + uplinkBypassScrambler_i => '0', + uplinkMulticycleDelay_i => "011", --register_map_control.GBT_TX_TC_DLY_VALUE1(2 downto 0); + sta_headerFecLocked_o => alignment_done_BE(i), + ctr_clkSlip_o => RxSlide_BE(i), + uplinkReady_o => open, + uplinkUserData_o => uplinkData_i_BE(i)(229 downto 0), + uplinkEcData_o => uplinkData_i_BE(i)(231 downto 230), + uplinkIcData_o => uplinkData_i_BE(i)(233 downto 232), + fec_error_o => fec_error_i_BE(i), + fec_err_cnt_o => fec_err_cnt_i_BE(i) + ); + uplinkDATA <= uplinkData_i_BE(i)(223 downto 0); + uplinkEC <= uplinkData_i_BE(i)(231 downto 230); + uplinkIC <= uplinkData_i_BE(i)(233 downto 232); + end generate; + + -- lpgbt FELIG + link_loop_FE : for i in 0 to GBT_NUM-1 generate + signal GT_TX_WORD_CLK : std_logic; + signal GT_RX_WORD_CLK : std_logic; + signal FE_UPLINK_USER_DATA : std_logic_vector(223 downto 0); + signal FE_UPLINK_IC_DATA : std_logic_vector(1 downto 0); + signal FE_UPLINK_EC_DATA : std_logic_vector(1 downto 0); + signal downlinkDATA : std_logic_vector(31 downto 0); + signal downlinkEC : std_logic_vector(1 downto 0); + signal downlinkIC : std_logic_vector(1 downto 0); + signal count : std_logic_vector(2 downto 0) := "000"; + signal data_en : std_logic; + begin + GT_TX_WORD_CLK <= clk320; + GT_RX_WORD_CLK <= clk320; + FE_UPLINK_USER_DATA <= data_to_be; + FE_UPLINK_IC_DATA <= "10"; + FE_UPLINK_EC_DATA <= "01"; + lpgbt_FE: entity work.FLX_LpGBT_FE + Port map + ( + clk40_in => clk40, + TXCLK320 => GT_TX_WORD_CLK, + RXCLK320 => GT_RX_WORD_CLK, + rst_uplink_i => reset_clk40, + ctr_clkSlip_s => RxSlide_FE(i), + aligned => alignment_done_FE(i), + sta_headerFlag_o => sta_headerFlag_out_FE(i), + dat_upLinkWord_fromGb_s => TX_DATA_FE(i), + dat_downLinkWord_fromMgt_s16 => TX_DATA_BE(i), + rst_dnlink_i => reset_clk40, + sta_mgtRxRdy_s => reset_done_clk40, + downLinkBypassDeinterleaver => '0', + downLinkBypassFECDecoder => '0', + downLinkBypassDescsrambler => '0', + enableFECErrCounter => '0', + upLinkScramblerBypass => '0', + upLinkInterleaverBypass => '0', + fecMode => '0', --FEC5 + txDataRate => '1', --10.24 Gb/s + phase_sel => "100", + upLinkData => FE_UPLINK_USER_DATA, + upLinkDataIC => FE_UPLINK_IC_DATA, + upLinkDataEC => FE_UPLINK_EC_DATA, + upLinkDataREADY => data_en, + downLinkData => downLinkData_i_FE(i)(31 downto 0), + downLinkDataIC => downLinkData_i_FE(i)(33 downto 32), + downLinkDataEC => downLinkData_i_FE(i)(35 downto 34), + tx_flag_out => tx_flag_out_FE(i) + ); + downlinkDATA <= downLinkData_i_FE(i)(31 downto 0); + downlinkEC <= downLinkData_i_FE(i)(33 downto 32); + downlinkIC <= downLinkData_i_FE(i)(35 downto 34); + process(GT_TX_WORD_CLK) + begin + if GT_TX_WORD_CLK'event and GT_TX_WORD_CLK='1' then + count <= count + "001"; + if count = "111" then + data_en <= '1'; + else + data_en <= '0'; + end if; + end if; + end process; + end generate; + + --check_data + process(clk320) + begin + if clk320'event and clk320='1' then + if alignment_done_FE = GBT_one and alignment_done_BE = GBT_one then + aligned <= '1'; + else + aligned <= '0'; + end if; + end if; + end process; + + link_check : for i in 0 to GBT_NUM-1 generate + signal dif_FE : integer := 0; + signal dif_BE : integer := 0; + + begin + process(clk320) + begin + if clk320'event and clk320='1' then + if cnt_div = "10" and clk40 = '1' and aligned = '1' then + if dif_FE = 0 and dif_BE = 0 then + dif_FE <= to_integer(unsigned(data_to_fe-downLinkData_i_FE(0)(31 downto 0))); + dif_BE <= to_integer(unsigned(data_to_be-uplinkData_i_BE(0)(223 downto 0))); + else + if data_to_fe > downLinkData_i_FE(0)(31 downto 0) then + if dif_FE = to_integer(unsigned(data_to_fe-downLinkData_i_FE(0)(31 downto 0))) then + good_FE(i) <= '1'; + else + good_FE(i) <= '0'; + end if; + else + good_FE(i) <= '0'; + end if; + if data_to_be > uplinkData_i_BE(0)(223 downto 0) then + if dif_BE = to_integer(unsigned(data_to_be-uplinkData_i_BE(0)(223 downto 0))) then + good_BE(i) <= '1'; + else + good_BE(i) <= '0'; + end if; + else + good_BE(i) <= '0'; + end if; + end if; + elsif aligned = '0' then + dif_FE <= 0; + dif_BE <= 0; + end if; + end if; + end process; + end generate; + + --sim process + mainproc : process + variable var_FE : std_logic_vector(GBT_NUM-1 downto 0) := (others => '0'); + variable var_BE : std_logic_vector(GBT_NUM-1 downto 0) := (others => '0'); + variable var_br : integer := 0; + begin + assert false + report "START SIMULATION" + severity NOTE; + clk_en <= true; + wait for 2 us; + reset <= '1'; + wait for 2 us; + reset <='0'; + reset_done <= '1'; + wait for 5 us; + var_br := 0; + wait until (aligned = '1' and good_FE = GBT_one and good_FE = GBT_one) or timeout; + var_FE := good_FE; + var_BE := good_BE; + while true loop + if timeout or data_to_fe > "00000000000000000001000000000000" then + exit; + end if; + if good_BE /= var_BE or var_FE /= good_FE then + var_br := 1; + log(ID_MONITOR,"Value changed. good_BE is "&to_string(good_BE)&" it was "&to_string(var_BE)&". good_FE is "&to_string(good_FE)&" it was "&to_string(var_FE), C_SCOPE); + wait for 25 ns; + var_BE := good_BE; + var_FE := good_FE; + else + wait for 25 ns; + end if; + end loop; + + check_value(var_br, 0, ERROR, "Test if good_BE or good_FE ever changed value. If failed, check output.txt for more detail",C_SCOPE); + check_value(timeout,false, ERROR, "Timeout check",C_SCOPE); + report_alert_counters(FINAL); -- Report final counters and print conclusion for simulation (Success/Fail) + log(ID_LOG_HDR, "SIMULATION COMPLETED", C_SCOPE); + + -- Finish the simulation + if use_vunit = false then + std.env.stop; + end if; + uvvm_completed <= '1'; + wait; -- to stop completely + finish; + wait for 1000 us; + end process; + + timeoutproc : process + begin + wait for 1000 us; + timeout <= true; + end process; + +end Behavioral; diff --git a/simulation/VUnit/tb/FELIGemulator_GBT_vunit_tb.vhd b/simulation/VUnit/tb/FELIGemulator_GBT_vunit_tb.vhd new file mode 100644 index 0000000000000000000000000000000000000000..9113d6890f1b34ebfc5fe4209fa58d7654f18cba --- /dev/null +++ b/simulation/VUnit/tb/FELIGemulator_GBT_vunit_tb.vhd @@ -0,0 +1,81 @@ +--! This file is part of the FELIX firmware distribution (https://gitlab.cern.ch/atlas-tdaq-felix/firmware/). +--! Copyright (C) 2001-2021 CERN for the benefit of the ATLAS collaboration. +--! Authors: +--! Frans Schreuder +--! +--! Licensed under the Apache License, Version 2.0 (the "License"); +--! you may not use this file except in compliance with the License. +--! You may obtain a copy of the License at +--! +--! http://www.apache.org/licenses/LICENSE-2.0 +--! +--! Unless required by applicable law or agreed to in writing, software +--! distributed under the License is distributed on an "AS IS" BASIS, +--! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +--! See the License for the specific language governing permissions and +--! limitations under the License. + +--======================================================================================================================== +-- Copyright (c) 2017 by Bitvis AS. All rights reserved. +-- You should have received a copy of the license file containing the MIT License (see LICENSE.TXT), if not, +-- contact Bitvis AS <support@bitvis.no>. +-- +-- UVVM AND ANY PART THEREOF ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +-- WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +-- OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH UVVM OR THE USE OR OTHER DEALINGS IN UVVM. +--======================================================================================================================== + +------------------------------------------------------------------------------------------ +-- VUnit wrapper for FELIGemulator_tb GBT +------------------------------------------------------------------------------------------ + + +library IEEE; + use IEEE.std_logic_1164.all; + use IEEE.numeric_std.all; + +library lib; +-- + +library vunit_lib; + context vunit_lib.vunit_context; + +-- Test case entity +entity FELIGemulator_GBT_vunit_tb is + generic ( + runner_cfg : string + ); +end entity; + +architecture func of FELIGemulator_GBT_vunit_tb is + signal uvvm_completed : std_logic; + constant C_CLK_PERIOD_250 : time := 4 ns; +begin + + uut_tb: entity work.FELIGemulator_tb + generic map( + use_vunit => true, + FIRMWARE_MODE => 6 + ) + port map( + uvvm_completed => uvvm_completed + ); + + + vunit_main : process is + begin + report "VUnit initializing"; + test_runner_setup(runner, runner_cfg); + report "VUnit initialized"; + while uvvm_completed /= '1' loop + wait for C_CLK_PERIOD_250; + end loop; + report "VUnit UVVM done, cleaning up"; + test_runner_cleanup(runner); + + end process vunit_main; + +end architecture; + + diff --git a/simulation/VUnit/tb/FELIGemulator_LPGBT_vunit_tb.vhd b/simulation/VUnit/tb/FELIGemulator_LPGBT_vunit_tb.vhd new file mode 100644 index 0000000000000000000000000000000000000000..1c30330174c1211522c0412f7af33286f67cf6e5 --- /dev/null +++ b/simulation/VUnit/tb/FELIGemulator_LPGBT_vunit_tb.vhd @@ -0,0 +1,81 @@ +--! This file is part of the FELIX firmware distribution (https://gitlab.cern.ch/atlas-tdaq-felix/firmware/). +--! Copyright (C) 2001-2021 CERN for the benefit of the ATLAS collaboration. +--! Authors: +--! Frans Schreuder +--! +--! Licensed under the Apache License, Version 2.0 (the "License"); +--! you may not use this file except in compliance with the License. +--! You may obtain a copy of the License at +--! +--! http://www.apache.org/licenses/LICENSE-2.0 +--! +--! Unless required by applicable law or agreed to in writing, software +--! distributed under the License is distributed on an "AS IS" BASIS, +--! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +--! See the License for the specific language governing permissions and +--! limitations under the License. + +--======================================================================================================================== +-- Copyright (c) 2017 by Bitvis AS. All rights reserved. +-- You should have received a copy of the license file containing the MIT License (see LICENSE.TXT), if not, +-- contact Bitvis AS <support@bitvis.no>. +-- +-- UVVM AND ANY PART THEREOF ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +-- WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +-- OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH UVVM OR THE USE OR OTHER DEALINGS IN UVVM. +--======================================================================================================================== + +------------------------------------------------------------------------------------------ +-- VUnit wrapper for FELIGemulator_tb LPGBT +------------------------------------------------------------------------------------------ + + +library IEEE; + use IEEE.std_logic_1164.all; + use IEEE.numeric_std.all; + +library lib; +-- + +library vunit_lib; + context vunit_lib.vunit_context; + +-- Test case entity +entity FELIGemulator_LPGBT_vunit_tb is + generic ( + runner_cfg : string + ); +end entity; + +architecture func of FELIGemulator_LPGBT_vunit_tb is + signal uvvm_completed : std_logic; + constant C_CLK_PERIOD_250 : time := 4 ns; +begin + + uut_tb: entity work.FELIGemulator_tb + generic map( + use_vunit => true, + FIRMWARE_MODE => 11 + ) + port map( + uvvm_completed => uvvm_completed + ); + + + vunit_main : process is + begin + report "VUnit initializing"; + test_runner_setup(runner, runner_cfg); + report "VUnit initialized"; + while uvvm_completed /= '1' loop + wait for C_CLK_PERIOD_250; + end loop; + report "VUnit UVVM done, cleaning up"; + test_runner_cleanup(runner); + + end process vunit_main; + +end architecture; + + diff --git a/simulation/VUnit/tb/FELIGexternaltrigger_tb.vhd b/simulation/VUnit/tb/FELIGexternaltrigger_tb.vhd new file mode 100644 index 0000000000000000000000000000000000000000..9081640b0f61cee0b2ea695d70b749c2dc52c260 --- /dev/null +++ b/simulation/VUnit/tb/FELIGexternaltrigger_tb.vhd @@ -0,0 +1,80 @@ +--! This file is part of the FELIX firmware distribution (https://gitlab.cern.ch/atlas-tdaq-felix/firmware/). +--! Copyright (C) 2001-2021 CERN for the benefit of the ATLAS collaboration. +--! Authors: +--! Frans Schreuder +--! +--! Licensed under the Apache License, Version 2.0 (the "License"); +--! you may not use this file except in compliance with the License. +--! You may obtain a copy of the License at +--! +--! http://www.apache.org/licenses/LICENSE-2.0 +--! +--! Unless required by applicable law or agreed to in writing, software +--! distributed under the License is distributed on an "AS IS" BASIS, +--! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +--! See the License for the specific language governing permissions and +--! limitations under the License. + +--======================================================================================================================== +-- Copyright (c) 2017 by Bitvis AS. All rights reserved. +-- You should have received a copy of the license file containing the MIT License (see LICENSE.TXT), if not, +-- contact Bitvis AS <support@bitvis.no>. +-- +-- UVVM AND ANY PART THEREOF ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +-- WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +-- OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH UVVM OR THE USE OR OTHER DEALINGS IN UVVM. +--======================================================================================================================== + +------------------------------------------------------------------------------------------ +-- VUnit wrapper for FELIGexternaltrigger_tb +------------------------------------------------------------------------------------------ + + +library IEEE; + use IEEE.std_logic_1164.all; + use IEEE.numeric_std.all; + +library lib; +-- + +library vunit_lib; + context vunit_lib.vunit_context; + +-- Test case entity +entity FELIGexternaltrigger_vunit_tb is + generic ( + runner_cfg : string + ); +end entity; + +architecture func of FELIGexternaltrigger_vunit_tb is + signal uvvm_completed : std_logic; + constant C_CLK_PERIOD_250 : time := 4 ns; +begin + + uut_tb: entity work.FELIGexternaltrigger_tb + generic map( + use_vunit => true + ) + port map( + uvvm_completed => uvvm_completed + ); + + + vunit_main : process is + begin + report "VUnit initializing"; + test_runner_setup(runner, runner_cfg); + report "VUnit initialized"; + while uvvm_completed /= '1' loop + wait for C_CLK_PERIOD_250; + end loop; + report "VUnit UVVM done, cleaning up"; + test_runner_cleanup(runner); + + end process vunit_main; + +end architecture; + + diff --git a/simulation/VUnit/tb/FELIGlinkwrapperLPGBT_tb.vhd b/simulation/VUnit/tb/FELIGlinkwrapperLPGBT_tb.vhd new file mode 100644 index 0000000000000000000000000000000000000000..6db3a59892967eef1a99674413d1e440b8f88fb0 --- /dev/null +++ b/simulation/VUnit/tb/FELIGlinkwrapperLPGBT_tb.vhd @@ -0,0 +1,80 @@ +--! This file is part of the FELIX firmware distribution (https://gitlab.cern.ch/atlas-tdaq-felix/firmware/). +--! Copyright (C) 2001-2021 CERN for the benefit of the ATLAS collaboration. +--! Authors: +--! Frans Schreuder +--! +--! Licensed under the Apache License, Version 2.0 (the "License"); +--! you may not use this file except in compliance with the License. +--! You may obtain a copy of the License at +--! +--! http://www.apache.org/licenses/LICENSE-2.0 +--! +--! Unless required by applicable law or agreed to in writing, software +--! distributed under the License is distributed on an "AS IS" BASIS, +--! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +--! See the License for the specific language governing permissions and +--! limitations under the License. + +--======================================================================================================================== +-- Copyright (c) 2017 by Bitvis AS. All rights reserved. +-- You should have received a copy of the license file containing the MIT License (see LICENSE.TXT), if not, +-- contact Bitvis AS <support@bitvis.no>. +-- +-- UVVM AND ANY PART THEREOF ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +-- WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +-- OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH UVVM OR THE USE OR OTHER DEALINGS IN UVVM. +--======================================================================================================================== + +------------------------------------------------------------------------------------------ +-- VUnit wrapper for FELIGlinkwrapperLPGBT_tb +------------------------------------------------------------------------------------------ + + +library IEEE; + use IEEE.std_logic_1164.all; + use IEEE.numeric_std.all; + +library lib; +-- + +library vunit_lib; + context vunit_lib.vunit_context; + +-- Test case entity +entity FELIGlinkwrapperLPGBT_vunit_tb is + generic ( + runner_cfg : string + ); +end entity; + +architecture func of FELIGlinkwrapperLPGBT_vunit_tb is + signal uvvm_completed : std_logic; + constant C_CLK_PERIOD_250 : time := 4 ns; +begin + + uut_tb: entity work.FELIGlinkwrapperLPGBT_tb + generic map( + use_vunit => true + ) + port map( + uvvm_completed => uvvm_completed + ); + + + vunit_main : process is + begin + report "VUnit initializing"; + test_runner_setup(runner, runner_cfg); + report "VUnit initialized"; + while uvvm_completed /= '1' loop + wait for C_CLK_PERIOD_250; + end loop; + report "VUnit UVVM done, cleaning up"; + test_runner_cleanup(runner); + + end process vunit_main; + +end architecture; + + diff --git a/sources/FELIG/data_generator/elink_data_emulator.vhd b/sources/FELIG/data_generator/elink_data_emulator.vhd index e6722a4aae877e2a0a80ed739d950c296bcf0e81..0cb28007d48df7b48c17777f71a1756da1040888 100644 --- a/sources/FELIG/data_generator/elink_data_emulator.vhd +++ b/sources/FELIG/data_generator/elink_data_emulator.vhd @@ -328,7 +328,7 @@ begin ) port map( src_clk => '0', - src_in => fmemu_random.SELECT_RANDOM(0), + src_in => fmemu_random.FMEMU_RANDOM_CONTROL.SELECT_RANDOM(fmemu_random.FMEMU_RANDOM_CONTROL.SELECT_RANDOM'low), dest_clk => clk, dest_out => select_random ); diff --git a/sources/FELIG/data_generator/elink_printer_bit_feeder_v2.vhd b/sources/FELIG/data_generator/elink_printer_bit_feeder_v2.vhd index 85514bcf2864e3df887bd85e1cfc9059a3f8daab..f56c05699432dc1c1fc40afa0174bc48eedfcdb3 100644 --- a/sources/FELIG/data_generator/elink_printer_bit_feeder_v2.vhd +++ b/sources/FELIG/data_generator/elink_printer_bit_feeder_v2.vhd @@ -198,7 +198,11 @@ begin end if; if wr_to_reg_final_d = '1' then reg_160_8b10b((count+1)*10 - 1 downto count*10) <= word_test; - reg_160_direc((count+1)*8 - 1 downto count*8 ) <= word_test(7 downto 0); + if MSBfirst = '0' then + reg_160_direc((count+1)*8 - 1 downto count*8 ) <= word_in_d(7 downto 0); + else + reg_160_direc((count+1)*8 - 1 downto count*8 ) <= word_in_d(9 downto 2); + end if; if flag_count <= '0' then if count = count_max then count <= 0; @@ -322,7 +326,11 @@ begin end if; if wr_to_reg_final_d = '1' then reg_160_8b10b((count+1)*10 - 1 downto count*10) <= word_test; - reg_160_direc((count+1)*8 - 1 downto count*8 ) <= word_test(7 downto 0); + if MSBfirst = '0' then + reg_160_direc((count+1)*8 - 1 downto count*8 ) <= word_in_d(7 downto 0); + else + reg_160_direc((count+1)*8 - 1 downto count*8 ) <= word_in_d(9 downto 2); + end if; if flag_count <= '0' then if count = count_max then count <= 0; diff --git a/sources/FELIG/data_generator/elink_printer_v2.vhd b/sources/FELIG/data_generator/elink_printer_v2.vhd index 618cb8b96c9b5f4a4457f9f7fad700a20ab3d9e1..e6657c28cd4df670e1c9b42899a629b620eb0ac6 100644 --- a/sources/FELIG/data_generator/elink_printer_v2.vhd +++ b/sources/FELIG/data_generator/elink_printer_v2.vhd @@ -197,6 +197,9 @@ begin -------- if (gbt_word_latch = '1') then gbt_payload_i <= gbt_bit_stream; + data_ready <= '1'; + else + data_ready <= '0'; end if; -------- case gbt_shift_count is diff --git a/sources/FELIG/emulator/Emulator.vhd b/sources/FELIG/emulator/Emulator.vhd index 1cd9d00fad48d5b7505575ac6585bb4445c06656..37195b8a81fce5f0d301654e85abf7df1d9c6329 100644 --- a/sources/FELIG/emulator/Emulator.vhd +++ b/sources/FELIG/emulator/Emulator.vhd @@ -107,7 +107,7 @@ architecture Behavioral of Emulator is signal l1id : std_logic_vector( 15 downto 0) := (others => '0'); signal l1a_ext_int_id : std_logic_vector( 15 downto 0) := (others => '0'); --MT signal l1a_ext_int_id_extra : std_logic_vector( 31 downto 0) := (others => '0'); --MT - signal l1a_int_int_id_tx_clk : std_logic_vector(15 downto 0); + signal l1a_int_int_id_tx_clk : std_logic_vector( 15 downto 0) := (others => '0'); signal elink_sync : std_logic := '0'; signal elink_sync_reg : std_logic; signal emu_data_re : std_logic_vector(0 to NUMEGROUPmax-1); --(0 to 4); @@ -150,6 +150,8 @@ architecture Behavioral of Emulator is signal out_of_sync : std_logic_vector(NUMEGROUPmax-1 downto 0) := (others => '0'); signal or_out_of_sync : std_logic; signal flag_sync : std_logic_vector(0 to NUMEGROUPmax-1); + signal start_dsp_flag : std_logic := '0'; -- so dsp works in sim + signal start_dsp : std_logic := '0'; -- so dsp works in sim --RL to be implemented --signal aurora_en : std_logic_vector(0 to NUMELINKmax-1); @@ -443,17 +445,22 @@ begin flag_ext_counter_reset <= '0'; end if; end if; - end if; + if start_dsp_flag = '0' then + start_dsp_flag <= '1'; + start_dsp <= '1'; + else + start_dsp <= '0'; + end if; end if; end process; --l1a id counter l1a_ext_int_id_counter : dsp_counter PORT MAP ( CLK => lane_txclk, - CE => ext_counter_l1a_trigger, + CE => ext_counter_l1a_trigger or start_dsp, SCLR => '0', UP => '1', - LOAD => l1a_ext_counter_reset, + LOAD => l1a_ext_counter_reset or start_dsp, L => X"000000000000", Q(47 downto 16) => l1a_ext_int_id_extra, Q(15 downto 0) => l1a_ext_int_id diff --git a/sources/FELIG/emulator/EmulatorWrapper.vhd b/sources/FELIG/emulator/EmulatorWrapper.vhd index e2da90097e575e98cb1c6442e2d76106d9c2066d..1e1f7fbfb488d2840d5ae7f72ac94d5968c3532d 100644 --- a/sources/FELIG/emulator/EmulatorWrapper.vhd +++ b/sources/FELIG/emulator/EmulatorWrapper.vhd @@ -59,7 +59,7 @@ entity EmulatorWrapper is FIRMWARE_MODE : integer := 0 ); port( - clk40 : in std_logic; + clk40 : in std_logic; gt_txusrclk_in : in std_logic_vector(GBT_NUM-1 downto 0); gt_rxusrclk_in : in std_logic_vector(GBT_NUM-1 downto 0); link_tx_data_228b_array_out : out txrx228b_type(0 to GBT_NUM-1); @@ -67,6 +67,7 @@ entity EmulatorWrapper is link_rx_data_120b_array_in : in txrx120b_type(0 to GBT_NUM-1); link_tx_flag_in : in std_logic_vector(GBT_NUM-1 downto 0); link_rx_flag_in : in std_logic_vector(GBT_NUM-1 downto 0); + l1a_int_trigger_out : out std_logic; lane_control : in array_of_lane_control_type(GBT_NUM-1 downto 0); lane_monitor : out array_of_lane_monitor_type(GBT_NUM-1 downto 0) ); @@ -86,29 +87,30 @@ architecture RTL of EmulatorWrapper is return '0'; end if; end function; - signal l1a_int_trigger : std_logic; - signal l1a_int_int_id : std_logic_vector(15 downto 0); - signal l1a_int_int_id_extra : std_logic_vector(31 downto 0); - signal l1a_int_count, l1a_int_max_count : std_logic_vector(31 downto 0); + signal l1a_int_trigger : std_logic := '0'; + signal l1a_int_int_id : std_logic_vector(15 downto 0) := (others=>'0'); + signal l1a_int_int_id_extra : std_logic_vector(31 downto 0) := (others=>'0'); + signal l1a_int_count, l1a_int_max_count : std_logic_vector(31 downto 0) := (others=>'0'); signal l1a_int_max_count_extra : std_logic_vector(15 downto 0) := (others=>'0'); - signal l1a_int_count_load : std_logic; - signal l1a_int_int_id_sclr : std_logic; + signal l1a_int_count_load : std_logic := '0'; + signal l1a_int_int_id_sclr : std_logic := '0'; signal l1a_int_counter_reset : std_logic := '0'; signal flag_int_counter_reset : std_logic := '0'; - signal counter_reset : std_logic; - + signal counter_reset : std_logic := '0'; + signal start_dsp_flag : std_logic := '0'; -- so dsp works in sim + signal start_dsp : std_logic := '0'; -- so dsp works in sim begin l1a_int_max_count <= "0000" & lane_control(0).global.l1a_max_count;--"0000" & register_map_control_40xtal.FELIG_GLOBAL_CONTROL.FAKE_L1A_RATE; counter_reset <= lane_control(0).global.l1a_counter_reset; - + l1a_int_trigger_out <= l1a_int_trigger; l1a_int_counter : dsp_counter PORT MAP ( CLK => clk40, CE => '1', SCLR => '0', UP => '0', - LOAD => l1a_int_count_load, + LOAD => l1a_int_count_load or start_dsp, L(47 downto 32) => X"0000", L(31 downto 0) => l1a_int_max_count, Q(47 downto 32) => l1a_int_max_count_extra, --MT SIMU+ @@ -118,10 +120,10 @@ begin l1a_int_int_id_counter : dsp_counter PORT MAP ( CLK => clk40, - CE => l1a_int_trigger, + CE => l1a_int_trigger or start_dsp, SCLR => l1a_int_int_id_sclr, UP => '1', - LOAD => l1a_int_counter_reset, --RL + LOAD => l1a_int_counter_reset or start_dsp, --RL L => X"000000000000", Q(47 downto 16) => l1a_int_int_id_extra, --MT SIMU+ open, Q(15 downto 0) => l1a_int_int_id @@ -144,13 +146,12 @@ begin process(clk40) begin - if clk40'event and clk40='1' then + if clk40'event and clk40 = '1' then if l1a_int_max_count = 0 then l1a_int_trigger <= '0'; l1a_int_int_id_sclr <= '1'; l1a_int_count_load <= '1'; elsif l1a_int_count = 0 then - l1a_int_trigger <= '1'; l1a_int_int_id_sclr <= '0'; l1a_int_count_load <= '1'; @@ -159,11 +160,16 @@ begin l1a_int_int_id_sclr <= '0'; l1a_int_count_load <= '0'; end if; + if start_dsp_flag = '0' then + start_dsp_flag <= '1'; + start_dsp <= '1'; + else + start_dsp <= '0'; + end if; end if; end process; emulator_inst : for link in GBT_NUM-1 downto 0 generate - gbt : entity work.emulator generic map ( useGBTdataEmulator => false, @@ -185,9 +191,7 @@ begin gbt_rx_flag_in => link_rx_flag_in(link), lane_control => lane_control(link), lane_monitor => lane_monitor(link)--, - ); - end generate; end RTL; diff --git a/sources/FELIG/packages/type_lib.vhd b/sources/FELIG/packages/type_lib.vhd index 287d22b892d05318a58d283b8d97481520f5aeca..1cbf89c42730879b13412d63a4b762ab0f6dbdfe 100644 --- a/sources/FELIG/packages/type_lib.vhd +++ b/sources/FELIG/packages/type_lib.vhd @@ -166,7 +166,6 @@ package type_lib is end record lane_global_control; type lane_emu_random_control is record - SELECT_RANDOM : std_logic_vector(0 downto 0); FMEMU_RANDOM_RAM_ADDR : std_logic_vector(9 downto 0); -- Controls the address of the ramblock for the random number generator FMEMU_RANDOM_RAM : bitfield_fmemu_random_ram_t_type; FMEMU_RANDOM_CONTROL : bitfield_fmemu_random_control_w_type; diff --git a/sources/FELIG/templates/LaneRegisterRemapper.vhd b/sources/FELIG/templates/LaneRegisterRemapper.vhd index f53e89fe74c665454b1023b733366110e1e4acab..439c013c57e3c9fc64e2c96c65949e3b50f733dd 100644 --- a/sources/FELIG/templates/LaneRegisterRemapper.vhd +++ b/sources/FELIG/templates/LaneRegisterRemapper.vhd @@ -103,7 +103,6 @@ begin lane_control(i).global.l1a_counter_reset <= register_map_control.FELIG_L1ID_RESET (register_map_control.FELIG_L1ID_RESET'low); lane_control(i).global.MSB <= register_map_control.ENCODING_REVERSE_10B (register_map_control.ENCODING_REVERSE_10B'low); lane_control(i).global.l1a_max_count <= register_map_control.FELIG_GLOBAL_CONTROL.FAKE_L1A_RATE; - lane_control(i).fmemu_random.SELECT_RANDOM <= register_map_control.FMEMU_RANDOM_CONTROL.SELECT_RANDOM; lane_control(i).fmemu_random.FMEMU_RANDOM_RAM_ADDR <= register_map_control.FMEMU_RANDOM_RAM_ADDR; lane_control(i).fmemu_random.FMEMU_RANDOM_RAM <= register_map_control.FMEMU_RANDOM_RAM; lane_control(i).fmemu_random.FMEMU_RANDOM_CONTROL <= register_map_control.FMEMU_RANDOM_CONTROL; diff --git a/sources/FelixTop/felig_top_bnl712.vhd b/sources/FelixTop/felig_top_bnl712.vhd index 20e80c9ca309b18e74c572e2778ca42d2d563937..65abc364500cb63c2612876310dcb64572fa3efa 100644 --- a/sources/FelixTop/felig_top_bnl712.vhd +++ b/sources/FelixTop/felig_top_bnl712.vhd @@ -396,6 +396,7 @@ begin link_rx_data_120b_array_in => link_rx_data_120b_array_tmp, link_tx_flag_in => link_tx_flag_i, link_rx_flag_in => link_rx_flag_i, + l1a_int_trigger_out => open, --sim lane_control => lane_control, lane_monitor => lane_monitor ); diff --git a/sources/ip_cores/sim/Distr_LUT_felig_sim_netlist.vhdl b/sources/ip_cores/sim/Distr_LUT_felig_sim_netlist.vhdl index 7243ce09c45090948f4372f372cb5f6d3bc40a7f..34e1eb6ddbc8b9e66870d8ca7c9b46819a62e8a6 100644 --- a/sources/ip_cores/sim/Distr_LUT_felig_sim_netlist.vhdl +++ b/sources/ip_cores/sim/Distr_LUT_felig_sim_netlist.vhdl @@ -1,661 +1,667 @@ --- Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. +-- Copyright 1986-2022 Xilinx, Inc. All Rights Reserved. +-- Copyright 2022-2024 Advanced Micro Devices, Inc. All Rights Reserved. -- -------------------------------------------------------------------------------- --- Tool Version: Vivado v.2018.1 (lin64) Build 2188600 Wed Apr 4 18:39:19 MDT 2018 --- Date : Tue Nov 12 18:15:58 2019 --- Host : felix02.hep.anl.gov running 64-bit Scientific Linux release 6.10 (Carbon) +-- Tool Version: Vivado v.2024.1 (lin64) Build 5076996 Wed May 22 18:36:09 MDT 2024 +-- Date : Wed Oct 23 09:28:28 2024 +-- Host : felix04.hep.anl.gov running 64-bit unknown -- Command : write_vhdl -force -mode funcsim --- /users/mtrovato/Phase1/felig/firmware/Projects/FLX712_FELIG/FLX712_FELIG.srcs/sources_1/ip/Distr_LUT_felig/Distr_LUT_felig_sim_netlist.vhdl +-- /users/rluz/firmware_copies/241023_FELIG_FLX712_FLX-1507_UVVM_testbench/Projects/FLX712_FELIG/FLX712_FELIG.gen/sources_1/ip/Distr_LUT_felig/Distr_LUT_felig_sim_netlist.vhdl -- Design : Distr_LUT_felig -- Purpose : This VHDL netlist is a functional simulation representation of the design and should not be modified or -- synthesized. This netlist cannot be used for SDF annotated simulation. -- Device : xcku115-flvf1924-2-e -- -------------------------------------------------------------------------------- -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -library UNISIM; -use UNISIM.VCOMPONENTS.ALL; -entity Distr_LUT_felig_blk_mem_gen_prim_wrapper_init is - port ( - doutb : out STD_LOGIC_VECTOR ( 15 downto 0 ); - clka : in STD_LOGIC; - clkb : in STD_LOGIC; - wea : in STD_LOGIC_VECTOR ( 0 to 0 ); - enb : in STD_LOGIC; - sleep : in STD_LOGIC; - addra : in STD_LOGIC_VECTOR ( 9 downto 0 ); - addrb : in STD_LOGIC_VECTOR ( 9 downto 0 ); - dina : in STD_LOGIC_VECTOR ( 15 downto 0 ) - ); - attribute ORIG_REF_NAME : string; - attribute ORIG_REF_NAME of Distr_LUT_felig_blk_mem_gen_prim_wrapper_init : entity is "blk_mem_gen_prim_wrapper_init"; -end Distr_LUT_felig_blk_mem_gen_prim_wrapper_init; +`protect begin_protected +`protect version = 1 +`protect encrypt_agent = "XILINX" +`protect encrypt_agent_info = "Xilinx Encryption Tool 2024.1" +`protect key_keyowner="Synopsys", key_keyname="SNPS-VCS-RSA-2", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=128) +`protect key_block +RSqbsRZSIb+QlYJMfFv1T7uHQ7PiCEXQkl687MHGm2LgPB15GIYcPmqKUSXgtkLsIFes91PTAyyB +9H9cyY4ZUxedcRg/9ZOB5pm3zPqAbcvGPmg1ivMhr/MlS19t5lYKM2tQo+0Yd+arJXlVZu2BMnvn ++I3G9t9tJuWUIWKjI+I= -architecture STRUCTURE of Distr_LUT_felig_blk_mem_gen_prim_wrapper_init is - signal \DEVICE_8SERIES.NO_BMM_INFO.SDP.SIMPLE_PRIM18.ram_n_70\ : STD_LOGIC; - signal \DEVICE_8SERIES.NO_BMM_INFO.SDP.SIMPLE_PRIM18.ram_n_71\ : STD_LOGIC; - signal \NLW_DEVICE_8SERIES.NO_BMM_INFO.SDP.SIMPLE_PRIM18.ram_CASDOUTA_UNCONNECTED\ : STD_LOGIC_VECTOR ( 15 downto 0 ); - signal \NLW_DEVICE_8SERIES.NO_BMM_INFO.SDP.SIMPLE_PRIM18.ram_CASDOUTB_UNCONNECTED\ : STD_LOGIC_VECTOR ( 15 downto 0 ); - signal \NLW_DEVICE_8SERIES.NO_BMM_INFO.SDP.SIMPLE_PRIM18.ram_CASDOUTPA_UNCONNECTED\ : STD_LOGIC_VECTOR ( 1 downto 0 ); - signal \NLW_DEVICE_8SERIES.NO_BMM_INFO.SDP.SIMPLE_PRIM18.ram_CASDOUTPB_UNCONNECTED\ : STD_LOGIC_VECTOR ( 1 downto 0 ); - signal \NLW_DEVICE_8SERIES.NO_BMM_INFO.SDP.SIMPLE_PRIM18.ram_DOUTADOUT_UNCONNECTED\ : STD_LOGIC_VECTOR ( 15 downto 0 ); - signal \NLW_DEVICE_8SERIES.NO_BMM_INFO.SDP.SIMPLE_PRIM18.ram_DOUTPADOUTP_UNCONNECTED\ : STD_LOGIC_VECTOR ( 1 downto 0 ); - attribute box_type : string; - attribute box_type of \DEVICE_8SERIES.NO_BMM_INFO.SDP.SIMPLE_PRIM18.ram\ : label is "PRIMITIVE"; -begin -\DEVICE_8SERIES.NO_BMM_INFO.SDP.SIMPLE_PRIM18.ram\: unisim.vcomponents.RAMB18E2 - generic map( - CASCADE_ORDER_A => "NONE", - CASCADE_ORDER_B => "NONE", - CLOCK_DOMAINS => "INDEPENDENT", - DOA_REG => 1, - DOB_REG => 1, - ENADDRENA => "FALSE", - ENADDRENB => "FALSE", - INITP_00 => X"0000000000000000000000000000000000000000000000000000000000000000", - INITP_01 => X"0000000000000000000000000000000000000000000000000000000000000000", - INITP_02 => X"0000000000000000000000000000000000000000000000000000000000000000", - INITP_03 => X"0000000000000000000000000000000000000000000000000000000000000000", - INITP_04 => X"0000000000000000000000000000000000000000000000000000000000000000", - INITP_05 => X"0000000000000000000000000000000000000000000000000000000000000000", - INITP_06 => X"0000000000000000000000000000000000000000000000000000000000000000", - INITP_07 => X"0000000000000000000000000000000000000000000000000000000000000000", - INIT_00 => X"005A005A005A005A0053005300530053004C004C004700470041003B00330021", - INIT_01 => X"006D00670067006700670067006700670067006000600060006000600060005A", - INIT_02 => X"0074007400740074007400740074006D006D006D006D006D006D006D006D006D", - INIT_03 => X"007A007A007A007A007A007A007A007A007A007A007A00740074007400740074", - INIT_04 => X"008000800080008000800080008000800080008000800080007A007A007A007A", - INIT_05 => X"0086008600860086008600860086008600860086008000800080008000800080", - INIT_06 => X"008D008D008D008D008600860086008600860086008600860086008600860086", - INIT_07 => X"008D008D008D008D008D008D008D008D008D008D008D008D008D008D008D008D", - INIT_08 => X"00930093009300930093009300930093009300930093008D008D008D008D008D", - INIT_09 => X"0093009300930093009300930093009300930093009300930093009300930093", - INIT_0A => X"0099009900990099009900990099009900990099009900990099009900930093", - INIT_0B => X"0099009900990099009900990099009900990099009900990099009900990099", - INIT_0C => X"009F009F009F009F009F009F009F009F009F009F009F009F009F009900990099", - INIT_0D => X"009F009F009F009F009F009F009F009F009F009F009F009F009F009F009F009F", - INIT_0E => X"00A500A500A500A500A500A500A500A5009F009F009F009F009F009F009F009F", - INIT_0F => X"00A500A500A500A500A500A500A500A500A500A500A500A500A500A500A500A5", - INIT_10 => X"00A500A500A500A500A500A500A500A500A500A500A500A500A500A500A500A5", - INIT_11 => X"00AC00AC00AC00AC00AC00AC00AC00AC00AC00AC00AC00AC00AC00AC00AC00AC", - INIT_12 => X"00AC00AC00AC00AC00AC00AC00AC00AC00AC00AC00AC00AC00AC00AC00AC00AC", - INIT_13 => X"00B200B200B200B200B200AC00AC00AC00AC00AC00AC00AC00AC00AC00AC00AC", - INIT_14 => X"00B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B2", - INIT_15 => X"00B200B200B200B200B200B200B200B200B200B200B200B200B200B200B200B2", - INIT_16 => X"00B800B800B800B800B800B800B200B200B200B200B200B200B200B200B200B2", - INIT_17 => X"00B800B800B800B800B800B800B800B800B800B800B800B800B800B800B800B8", - INIT_18 => X"00B800B800B800B800B800B800B800B800B800B800B800B800B800B800B800B8", - INIT_19 => X"00BE00BE00BE00BE00BE00BE00B800B800B800B800B800B800B800B800B800B8", - INIT_1A => X"00BE00BE00BE00BE00BE00BE00BE00BE00BE00BE00BE00BE00BE00BE00BE00BE", - INIT_1B => X"00BE00BE00BE00BE00BE00BE00BE00BE00BE00BE00BE00BE00BE00BE00BE00BE", - INIT_1C => X"00C500C500C500BE00BE00BE00BE00BE00BE00BE00BE00BE00BE00BE00BE00BE", - INIT_1D => X"00C500C500C500C500C500C500C500C500C500C500C500C500C500C500C500C5", - INIT_1E => X"00C500C500C500C500C500C500C500C500C500C500C500C500C500C500C500C5", - INIT_1F => X"00C500C500C500C500C500C500C500C500C500C500C500C500C500C500C500C5", - INIT_20 => X"00CB00CB00CB00CB00CB00CB00CB00CB00CB00CB00CB00CB00CB00CB00CB00CB", - INIT_21 => X"00CB00CB00CB00CB00CB00CB00CB00CB00CB00CB00CB00CB00CB00CB00CB00CB", - INIT_22 => X"00CB00CB00CB00CB00CB00CB00CB00CB00CB00CB00CB00CB00CB00CB00CB00CB", - INIT_23 => X"00D100D100D100D100D100D100D100D100D100D100D100D100D100CB00CB00CB", - INIT_24 => X"00D100D100D100D100D100D100D100D100D100D100D100D100D100D100D100D1", - INIT_25 => X"00D100D100D100D100D100D100D100D100D100D100D100D100D100D100D100D1", - INIT_26 => X"00D700D700D700D700D700D700D700D700D700D700D100D100D100D100D100D1", - INIT_27 => X"00D700D700D700D700D700D700D700D700D700D700D700D700D700D700D700D7", - INIT_28 => X"00D700D700D700D700D700D700D700D700D700D700D700D700D700D700D700D7", - INIT_29 => X"00DE00DE00DE00DE00DE00DE00DE00DE00DE00DE00D700D700D700D700D700D7", - INIT_2A => X"00DE00DE00DE00DE00DE00DE00DE00DE00DE00DE00DE00DE00DE00DE00DE00DE", - INIT_2B => X"00DE00DE00DE00DE00DE00DE00DE00DE00DE00DE00DE00DE00DE00DE00DE00DE", - INIT_2C => X"00E400E400E400E400E400E400E400E400E400E400E400DE00DE00DE00DE00DE", - INIT_2D => X"00E400E400E400E400E400E400E400E400E400E400E400E400E400E400E400E4", - INIT_2E => X"00E400E400E400E400E400E400E400E400E400E400E400E400E400E400E400E4", - INIT_2F => X"00EA00EA00EA00EA00EA00EA00EA00EA00EA00EA00EA00EA00EA00EA00EA00EA", - INIT_30 => X"00EA00EA00EA00EA00EA00EA00EA00EA00EA00EA00EA00EA00EA00EA00EA00EA", - INIT_31 => X"00F000F000F000F000F000F000F000F000EA00EA00EA00EA00EA00EA00EA00EA", - INIT_32 => X"00F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F0", - INIT_33 => X"00F700F700F700F000F000F000F000F000F000F000F000F000F000F000F000F0", - INIT_34 => X"00F700F700F700F700F700F700F700F700F700F700F700F700F700F700F700F7", - INIT_35 => X"00FD00FD00F700F700F700F700F700F700F700F700F700F700F700F700F700F7", - INIT_36 => X"00FD00FD00FD00FD00FD00FD00FD00FD00FD00FD00FD00FD00FD00FD00FD00FD", - INIT_37 => X"0103010301030103010300FD00FD00FD00FD00FD00FD00FD00FD00FD00FD00FD", - INIT_38 => X"0103010301030103010301030103010301030103010301030103010301030103", - INIT_39 => X"0109010901090109010901090109010901090109010901090103010301030103", - INIT_3A => X"0110011001100110011001100109010901090109010901090109010901090109", - INIT_3B => X"0116011601160116011001100110011001100110011001100110011001100110", - INIT_3C => X"011C011C011C011C011C01160116011601160116011601160116011601160116", - INIT_3D => X"012201220122012201220122012201220122011C011C011C011C011C011C011C", - INIT_3E => X"0136012F012F012F012F012F012F012901290129012901290129012901290122", - INIT_3F => X"016F015D0155014F0149014901430143013D013D013D013D0136013601360136", - INIT_A => B"00" & X"0000", - INIT_B => B"00" & X"0000", - INIT_FILE => "NONE", - IS_CLKARDCLK_INVERTED => '0', - IS_CLKBWRCLK_INVERTED => '0', - IS_ENARDEN_INVERTED => '0', - IS_ENBWREN_INVERTED => '0', - IS_RSTRAMARSTRAM_INVERTED => '0', - IS_RSTRAMB_INVERTED => '0', - IS_RSTREGARSTREG_INVERTED => '0', - IS_RSTREGB_INVERTED => '0', - RDADDRCHANGEA => "FALSE", - RDADDRCHANGEB => "FALSE", - READ_WIDTH_A => 18, - READ_WIDTH_B => 18, - RSTREG_PRIORITY_A => "REGCE", - RSTREG_PRIORITY_B => "REGCE", - SIM_COLLISION_CHECK => "ALL", - SLEEP_ASYNC => "FALSE", - SRVAL_A => B"00" & X"0000", - SRVAL_B => B"00" & X"0000", - WRITE_MODE_A => "NO_CHANGE", - WRITE_MODE_B => "NO_CHANGE", - WRITE_WIDTH_A => 18, - WRITE_WIDTH_B => 18 - ) - port map ( - ADDRARDADDR(13 downto 4) => addra(9 downto 0), - ADDRARDADDR(3 downto 0) => B"0000", - ADDRBWRADDR(13 downto 4) => addrb(9 downto 0), - ADDRBWRADDR(3 downto 0) => B"0000", - ADDRENA => '0', - ADDRENB => '0', - CASDIMUXA => '0', - CASDIMUXB => '0', - CASDINA(15 downto 0) => B"0000000000000000", - CASDINB(15 downto 0) => B"0000000000000000", - CASDINPA(1 downto 0) => B"00", - CASDINPB(1 downto 0) => B"00", - CASDOMUXA => '0', - CASDOMUXB => '0', - CASDOMUXEN_A => '0', - CASDOMUXEN_B => '0', - CASDOUTA(15 downto 0) => \NLW_DEVICE_8SERIES.NO_BMM_INFO.SDP.SIMPLE_PRIM18.ram_CASDOUTA_UNCONNECTED\(15 downto 0), - CASDOUTB(15 downto 0) => \NLW_DEVICE_8SERIES.NO_BMM_INFO.SDP.SIMPLE_PRIM18.ram_CASDOUTB_UNCONNECTED\(15 downto 0), - CASDOUTPA(1 downto 0) => \NLW_DEVICE_8SERIES.NO_BMM_INFO.SDP.SIMPLE_PRIM18.ram_CASDOUTPA_UNCONNECTED\(1 downto 0), - CASDOUTPB(1 downto 0) => \NLW_DEVICE_8SERIES.NO_BMM_INFO.SDP.SIMPLE_PRIM18.ram_CASDOUTPB_UNCONNECTED\(1 downto 0), - CASOREGIMUXA => '0', - CASOREGIMUXB => '0', - CASOREGIMUXEN_A => '0', - CASOREGIMUXEN_B => '0', - CLKARDCLK => clka, - CLKBWRCLK => clkb, - DINADIN(15 downto 0) => dina(15 downto 0), - DINBDIN(15 downto 0) => B"0000000000000000", - DINPADINP(1 downto 0) => B"00", - DINPBDINP(1 downto 0) => B"00", - DOUTADOUT(15 downto 0) => \NLW_DEVICE_8SERIES.NO_BMM_INFO.SDP.SIMPLE_PRIM18.ram_DOUTADOUT_UNCONNECTED\(15 downto 0), - DOUTBDOUT(15 downto 0) => doutb(15 downto 0), - DOUTPADOUTP(1 downto 0) => \NLW_DEVICE_8SERIES.NO_BMM_INFO.SDP.SIMPLE_PRIM18.ram_DOUTPADOUTP_UNCONNECTED\(1 downto 0), - DOUTPBDOUTP(1) => \DEVICE_8SERIES.NO_BMM_INFO.SDP.SIMPLE_PRIM18.ram_n_70\, - DOUTPBDOUTP(0) => \DEVICE_8SERIES.NO_BMM_INFO.SDP.SIMPLE_PRIM18.ram_n_71\, - ENARDEN => wea(0), - ENBWREN => enb, - REGCEAREGCE => '0', - REGCEB => enb, - RSTRAMARSTRAM => '0', - RSTRAMB => '0', - RSTREGARSTREG => '0', - RSTREGB => '0', - SLEEP => sleep, - WEA(1 downto 0) => B"11", - WEBWE(3 downto 0) => B"0000" - ); -end STRUCTURE; -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -library UNISIM; -use UNISIM.VCOMPONENTS.ALL; -entity Distr_LUT_felig_blk_mem_gen_prim_width is - port ( - doutb : out STD_LOGIC_VECTOR ( 15 downto 0 ); - clka : in STD_LOGIC; - clkb : in STD_LOGIC; - wea : in STD_LOGIC_VECTOR ( 0 to 0 ); - enb : in STD_LOGIC; - sleep : in STD_LOGIC; - addra : in STD_LOGIC_VECTOR ( 9 downto 0 ); - addrb : in STD_LOGIC_VECTOR ( 9 downto 0 ); - dina : in STD_LOGIC_VECTOR ( 15 downto 0 ) - ); - attribute ORIG_REF_NAME : string; - attribute ORIG_REF_NAME of Distr_LUT_felig_blk_mem_gen_prim_width : entity is "blk_mem_gen_prim_width"; -end Distr_LUT_felig_blk_mem_gen_prim_width; +`protect key_keyowner="Aldec", key_keyname="ALDEC15_001", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +VRSQ05ZaB6bIhFIQ823mTvlJaG9+5iW5C3+KxGjq0sq9ziCshKOLpOGPDMmOWDqA4uBaxC5IKISr +w8+A8mqbYjXo5m1g8sGjNaETS0HKJsK+l5Y++tN4IEUs+DwxgrPR/+LWtChuOzVkfC7BG3LVUEMj +zM3GAyGcXGJ3sdBItZAfsevyiy7kr4Fw+nk2hWytGteu1NZk3VzPE7KQHLkOlHBPXf6P0j8LpKcr +2oNDgQ/WaEmg6OOvFeJuaWDaee8Sn6wKP/caMyoGdSeczsPtRrJeoSRlbNHlxhCv7zg+Cn2AgwrR +PTqGsMrkhv9U0sq+waS0CmwChsk4WB7RspGYUg== -architecture STRUCTURE of Distr_LUT_felig_blk_mem_gen_prim_width is -begin -\prim_init.ram\: entity work.Distr_LUT_felig_blk_mem_gen_prim_wrapper_init - port map ( - addra(9 downto 0) => addra(9 downto 0), - addrb(9 downto 0) => addrb(9 downto 0), - clka => clka, - clkb => clkb, - dina(15 downto 0) => dina(15 downto 0), - doutb(15 downto 0) => doutb(15 downto 0), - enb => enb, - sleep => sleep, - wea(0) => wea(0) - ); -end STRUCTURE; -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -library UNISIM; -use UNISIM.VCOMPONENTS.ALL; -entity Distr_LUT_felig_blk_mem_gen_generic_cstr is - port ( - doutb : out STD_LOGIC_VECTOR ( 15 downto 0 ); - clka : in STD_LOGIC; - clkb : in STD_LOGIC; - wea : in STD_LOGIC_VECTOR ( 0 to 0 ); - enb : in STD_LOGIC; - sleep : in STD_LOGIC; - addra : in STD_LOGIC_VECTOR ( 9 downto 0 ); - addrb : in STD_LOGIC_VECTOR ( 9 downto 0 ); - dina : in STD_LOGIC_VECTOR ( 15 downto 0 ) - ); - attribute ORIG_REF_NAME : string; - attribute ORIG_REF_NAME of Distr_LUT_felig_blk_mem_gen_generic_cstr : entity is "blk_mem_gen_generic_cstr"; -end Distr_LUT_felig_blk_mem_gen_generic_cstr; +`protect key_keyowner="Mentor Graphics Corporation", key_keyname="MGC-VELOCE-RSA", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=128) +`protect key_block +tNziOjCznlvIl4dadmB9r23Duf+HQHWOuHmupEU3PJxrazHVtZdNKspG9sRXhF9mjbpnSiKYCdFK +Jr9W/dxUid36faFIPKQazVTuOiE0hkzVQAGpYxXjT/ITB/9EFBvgvP5L3EAhHv32x6MA1vkFSI7x +HrZ09YNFEF6T7DPTZE4= -architecture STRUCTURE of Distr_LUT_felig_blk_mem_gen_generic_cstr is -begin -\ramloop[0].ram.r\: entity work.Distr_LUT_felig_blk_mem_gen_prim_width - port map ( - addra(9 downto 0) => addra(9 downto 0), - addrb(9 downto 0) => addrb(9 downto 0), - clka => clka, - clkb => clkb, - dina(15 downto 0) => dina(15 downto 0), - doutb(15 downto 0) => doutb(15 downto 0), - enb => enb, - sleep => sleep, - wea(0) => wea(0) - ); -end STRUCTURE; -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -library UNISIM; -use UNISIM.VCOMPONENTS.ALL; -entity Distr_LUT_felig_blk_mem_gen_top is - port ( - doutb : out STD_LOGIC_VECTOR ( 15 downto 0 ); - clka : in STD_LOGIC; - clkb : in STD_LOGIC; - wea : in STD_LOGIC_VECTOR ( 0 to 0 ); - enb : in STD_LOGIC; - sleep : in STD_LOGIC; - addra : in STD_LOGIC_VECTOR ( 9 downto 0 ); - addrb : in STD_LOGIC_VECTOR ( 9 downto 0 ); - dina : in STD_LOGIC_VECTOR ( 15 downto 0 ) - ); - attribute ORIG_REF_NAME : string; - attribute ORIG_REF_NAME of Distr_LUT_felig_blk_mem_gen_top : entity is "blk_mem_gen_top"; -end Distr_LUT_felig_blk_mem_gen_top; +`protect key_keyowner="Mentor Graphics Corporation", key_keyname="MGC-VERIF-SIM-RSA-2", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +QCYfxgkUHlX1cre1q9aS3sVDIOX36YBK4ZwJXAVUwA6f1OQ77XibjpWJHt5FK9F0PcYp/j21pqzO +BRdkDcFLVAjxER4J5t5iMVhoeMk+3fpiKfYrm4WFl1ygsJsfFJP0jqO1OkjC8iFBtm3n6b7CTl1o +cjBbcBp8UgW6E8rf5inXA0dRqybnyxKJSnMFYLinvpVU6QEc4OKO7mi/i/s9p/efiP+CdQf0yDRU +Fw7o7x0D7tjBv943g5L+4wGZ2JYU+ISqn4Ajxy/bWTTJDe6T/15evhngS61MC8Xjamzc4YLZBP8o +ShfSLoeZeO+Hk5n3xzJRghM0DQ6Sj7NqXFY68w== -architecture STRUCTURE of Distr_LUT_felig_blk_mem_gen_top is -begin -\valid.cstr\: entity work.Distr_LUT_felig_blk_mem_gen_generic_cstr - port map ( - addra(9 downto 0) => addra(9 downto 0), - addrb(9 downto 0) => addrb(9 downto 0), - clka => clka, - clkb => clkb, - dina(15 downto 0) => dina(15 downto 0), - doutb(15 downto 0) => doutb(15 downto 0), - enb => enb, - sleep => sleep, - wea(0) => wea(0) - ); -end STRUCTURE; -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -library UNISIM; -use UNISIM.VCOMPONENTS.ALL; -entity Distr_LUT_felig_blk_mem_gen_v8_4_1_synth is - port ( - doutb : out STD_LOGIC_VECTOR ( 15 downto 0 ); - clka : in STD_LOGIC; - clkb : in STD_LOGIC; - wea : in STD_LOGIC_VECTOR ( 0 to 0 ); - enb : in STD_LOGIC; - sleep : in STD_LOGIC; - addra : in STD_LOGIC_VECTOR ( 9 downto 0 ); - addrb : in STD_LOGIC_VECTOR ( 9 downto 0 ); - dina : in STD_LOGIC_VECTOR ( 15 downto 0 ) - ); - attribute ORIG_REF_NAME : string; - attribute ORIG_REF_NAME of Distr_LUT_felig_blk_mem_gen_v8_4_1_synth : entity is "blk_mem_gen_v8_4_1_synth"; -end Distr_LUT_felig_blk_mem_gen_v8_4_1_synth; +`protect key_keyowner="Real Intent", key_keyname="RI-RSA-KEY-1", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +Uy8FDDy3dZQGAnMQV0HBesEs+/oZdaq35Kj1PGhy9J/+EBZm0nhhQgYtku8tWABW2jKAC1GtNTvo +uReQyr1hteMxTbD5OIuqv86eb1hXZVENlZ7ichG8auUjkeHAkaSYNbHOuDLIhSqHEL67XbcZ9zPG +1JOY3+VONSww0KYPcQbGSo/2DaC5C0Y+mZODRfJ4+b0WXjce6UaJetilBc3VtqqmodIM2d3HDawF +R0xVJfHj86rXmUkY+SNUw60zsV6raCY6G3k/rXpei1d6zn8tCThkKG5fwiWY8zA7kRdTFIlVKP9h +fb6kfzRBRT/BgVQ8d4RgEcEVV8m3u/Mf4KIlTw== -architecture STRUCTURE of Distr_LUT_felig_blk_mem_gen_v8_4_1_synth is -begin -\gnbram.gnativebmg.native_blk_mem_gen\: entity work.Distr_LUT_felig_blk_mem_gen_top - port map ( - addra(9 downto 0) => addra(9 downto 0), - addrb(9 downto 0) => addrb(9 downto 0), - clka => clka, - clkb => clkb, - dina(15 downto 0) => dina(15 downto 0), - doutb(15 downto 0) => doutb(15 downto 0), - enb => enb, - sleep => sleep, - wea(0) => wea(0) - ); -end STRUCTURE; -library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -library UNISIM; -use UNISIM.VCOMPONENTS.ALL; -entity Distr_LUT_felig_blk_mem_gen_v8_4_1 is - port ( - clka : in STD_LOGIC; - rsta : in STD_LOGIC; - ena : in STD_LOGIC; - regcea : in STD_LOGIC; - wea : in STD_LOGIC_VECTOR ( 0 to 0 ); - addra : in STD_LOGIC_VECTOR ( 9 downto 0 ); - dina : in STD_LOGIC_VECTOR ( 15 downto 0 ); - douta : out STD_LOGIC_VECTOR ( 15 downto 0 ); - clkb : in STD_LOGIC; - rstb : in STD_LOGIC; - enb : in STD_LOGIC; - regceb : in STD_LOGIC; - web : in STD_LOGIC_VECTOR ( 0 to 0 ); - addrb : in STD_LOGIC_VECTOR ( 9 downto 0 ); - dinb : in STD_LOGIC_VECTOR ( 15 downto 0 ); - doutb : out STD_LOGIC_VECTOR ( 15 downto 0 ); - injectsbiterr : in STD_LOGIC; - injectdbiterr : in STD_LOGIC; - eccpipece : in STD_LOGIC; - sbiterr : out STD_LOGIC; - dbiterr : out STD_LOGIC; - rdaddrecc : out STD_LOGIC_VECTOR ( 9 downto 0 ); - sleep : in STD_LOGIC; - deepsleep : in STD_LOGIC; - shutdown : in STD_LOGIC; - rsta_busy : out STD_LOGIC; - rstb_busy : out STD_LOGIC; - s_aclk : in STD_LOGIC; - s_aresetn : in STD_LOGIC; - s_axi_awid : in STD_LOGIC_VECTOR ( 3 downto 0 ); - s_axi_awaddr : in STD_LOGIC_VECTOR ( 31 downto 0 ); - s_axi_awlen : in STD_LOGIC_VECTOR ( 7 downto 0 ); - s_axi_awsize : in STD_LOGIC_VECTOR ( 2 downto 0 ); - s_axi_awburst : in STD_LOGIC_VECTOR ( 1 downto 0 ); - s_axi_awvalid : in STD_LOGIC; - s_axi_awready : out STD_LOGIC; - s_axi_wdata : in STD_LOGIC_VECTOR ( 15 downto 0 ); - s_axi_wstrb : in STD_LOGIC_VECTOR ( 0 to 0 ); - s_axi_wlast : in STD_LOGIC; - s_axi_wvalid : in STD_LOGIC; - s_axi_wready : out STD_LOGIC; - s_axi_bid : out STD_LOGIC_VECTOR ( 3 downto 0 ); - s_axi_bresp : out STD_LOGIC_VECTOR ( 1 downto 0 ); - s_axi_bvalid : out STD_LOGIC; - s_axi_bready : in STD_LOGIC; - s_axi_arid : in STD_LOGIC_VECTOR ( 3 downto 0 ); - s_axi_araddr : in STD_LOGIC_VECTOR ( 31 downto 0 ); - s_axi_arlen : in STD_LOGIC_VECTOR ( 7 downto 0 ); - s_axi_arsize : in STD_LOGIC_VECTOR ( 2 downto 0 ); - s_axi_arburst : in STD_LOGIC_VECTOR ( 1 downto 0 ); - s_axi_arvalid : in STD_LOGIC; - s_axi_arready : out STD_LOGIC; - s_axi_rid : out STD_LOGIC_VECTOR ( 3 downto 0 ); - s_axi_rdata : out STD_LOGIC_VECTOR ( 15 downto 0 ); - s_axi_rresp : out STD_LOGIC_VECTOR ( 1 downto 0 ); - s_axi_rlast : out STD_LOGIC; - s_axi_rvalid : out STD_LOGIC; - s_axi_rready : in STD_LOGIC; - s_axi_injectsbiterr : in STD_LOGIC; - s_axi_injectdbiterr : in STD_LOGIC; - s_axi_sbiterr : out STD_LOGIC; - s_axi_dbiterr : out STD_LOGIC; - s_axi_rdaddrecc : out STD_LOGIC_VECTOR ( 9 downto 0 ) - ); - attribute C_ADDRA_WIDTH : integer; - attribute C_ADDRA_WIDTH of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 10; - attribute C_ADDRB_WIDTH : integer; - attribute C_ADDRB_WIDTH of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 10; - attribute C_ALGORITHM : integer; - attribute C_ALGORITHM of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 1; - attribute C_AXI_ID_WIDTH : integer; - attribute C_AXI_ID_WIDTH of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 4; - attribute C_AXI_SLAVE_TYPE : integer; - attribute C_AXI_SLAVE_TYPE of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_AXI_TYPE : integer; - attribute C_AXI_TYPE of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 1; - attribute C_BYTE_SIZE : integer; - attribute C_BYTE_SIZE of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 9; - attribute C_COMMON_CLK : integer; - attribute C_COMMON_CLK of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_COUNT_18K_BRAM : string; - attribute C_COUNT_18K_BRAM of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is "1"; - attribute C_COUNT_36K_BRAM : string; - attribute C_COUNT_36K_BRAM of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is "0"; - attribute C_CTRL_ECC_ALGO : string; - attribute C_CTRL_ECC_ALGO of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is "NONE"; - attribute C_DEFAULT_DATA : string; - attribute C_DEFAULT_DATA of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is "0"; - attribute C_DISABLE_WARN_BHV_COLL : integer; - attribute C_DISABLE_WARN_BHV_COLL of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_DISABLE_WARN_BHV_RANGE : integer; - attribute C_DISABLE_WARN_BHV_RANGE of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_ELABORATION_DIR : string; - attribute C_ELABORATION_DIR of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is "./"; - attribute C_ENABLE_32BIT_ADDRESS : integer; - attribute C_ENABLE_32BIT_ADDRESS of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_EN_DEEPSLEEP_PIN : integer; - attribute C_EN_DEEPSLEEP_PIN of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_EN_ECC_PIPE : integer; - attribute C_EN_ECC_PIPE of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_EN_RDADDRA_CHG : integer; - attribute C_EN_RDADDRA_CHG of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_EN_RDADDRB_CHG : integer; - attribute C_EN_RDADDRB_CHG of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_EN_SAFETY_CKT : integer; - attribute C_EN_SAFETY_CKT of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_EN_SHUTDOWN_PIN : integer; - attribute C_EN_SHUTDOWN_PIN of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_EN_SLEEP_PIN : integer; - attribute C_EN_SLEEP_PIN of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_EST_POWER_SUMMARY : string; - attribute C_EST_POWER_SUMMARY of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is "Estimated Power for IP : 2.810143 mW"; - attribute C_FAMILY : string; - attribute C_FAMILY of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is "kintexu"; - attribute C_HAS_AXI_ID : integer; - attribute C_HAS_AXI_ID of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_HAS_ENA : integer; - attribute C_HAS_ENA of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_HAS_ENB : integer; - attribute C_HAS_ENB of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 1; - attribute C_HAS_INJECTERR : integer; - attribute C_HAS_INJECTERR of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_HAS_MEM_OUTPUT_REGS_A : integer; - attribute C_HAS_MEM_OUTPUT_REGS_A of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_HAS_MEM_OUTPUT_REGS_B : integer; - attribute C_HAS_MEM_OUTPUT_REGS_B of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 1; - attribute C_HAS_MUX_OUTPUT_REGS_A : integer; - attribute C_HAS_MUX_OUTPUT_REGS_A of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_HAS_MUX_OUTPUT_REGS_B : integer; - attribute C_HAS_MUX_OUTPUT_REGS_B of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_HAS_REGCEA : integer; - attribute C_HAS_REGCEA of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_HAS_REGCEB : integer; - attribute C_HAS_REGCEB of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_HAS_RSTA : integer; - attribute C_HAS_RSTA of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_HAS_RSTB : integer; - attribute C_HAS_RSTB of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_HAS_SOFTECC_INPUT_REGS_A : integer; - attribute C_HAS_SOFTECC_INPUT_REGS_A of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_HAS_SOFTECC_OUTPUT_REGS_B : integer; - attribute C_HAS_SOFTECC_OUTPUT_REGS_B of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_INITA_VAL : string; - attribute C_INITA_VAL of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is "0"; - attribute C_INITB_VAL : string; - attribute C_INITB_VAL of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is "0"; - attribute C_INIT_FILE : string; - attribute C_INIT_FILE of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is "Distr_LUT_felig.mem"; - attribute C_INIT_FILE_NAME : string; - attribute C_INIT_FILE_NAME of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is "Distr_LUT_felig.mif"; - attribute C_INTERFACE_TYPE : integer; - attribute C_INTERFACE_TYPE of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_LOAD_INIT_FILE : integer; - attribute C_LOAD_INIT_FILE of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 1; - attribute C_MEM_TYPE : integer; - attribute C_MEM_TYPE of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 1; - attribute C_MUX_PIPELINE_STAGES : integer; - attribute C_MUX_PIPELINE_STAGES of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_PRIM_TYPE : integer; - attribute C_PRIM_TYPE of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 1; - attribute C_READ_DEPTH_A : integer; - attribute C_READ_DEPTH_A of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 1024; - attribute C_READ_DEPTH_B : integer; - attribute C_READ_DEPTH_B of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 1024; - attribute C_READ_WIDTH_A : integer; - attribute C_READ_WIDTH_A of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 16; - attribute C_READ_WIDTH_B : integer; - attribute C_READ_WIDTH_B of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 16; - attribute C_RSTRAM_A : integer; - attribute C_RSTRAM_A of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_RSTRAM_B : integer; - attribute C_RSTRAM_B of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_RST_PRIORITY_A : string; - attribute C_RST_PRIORITY_A of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is "CE"; - attribute C_RST_PRIORITY_B : string; - attribute C_RST_PRIORITY_B of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is "CE"; - attribute C_SIM_COLLISION_CHECK : string; - attribute C_SIM_COLLISION_CHECK of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is "ALL"; - attribute C_USE_BRAM_BLOCK : integer; - attribute C_USE_BRAM_BLOCK of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_USE_BYTE_WEA : integer; - attribute C_USE_BYTE_WEA of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_USE_BYTE_WEB : integer; - attribute C_USE_BYTE_WEB of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_USE_DEFAULT_DATA : integer; - attribute C_USE_DEFAULT_DATA of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_USE_ECC : integer; - attribute C_USE_ECC of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_USE_SOFTECC : integer; - attribute C_USE_SOFTECC of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_USE_URAM : integer; - attribute C_USE_URAM of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 0; - attribute C_WEA_WIDTH : integer; - attribute C_WEA_WIDTH of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 1; - attribute C_WEB_WIDTH : integer; - attribute C_WEB_WIDTH of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 1; - attribute C_WRITE_DEPTH_A : integer; - attribute C_WRITE_DEPTH_A of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 1024; - attribute C_WRITE_DEPTH_B : integer; - attribute C_WRITE_DEPTH_B of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 1024; - attribute C_WRITE_MODE_A : string; - attribute C_WRITE_MODE_A of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is "NO_CHANGE"; - attribute C_WRITE_MODE_B : string; - attribute C_WRITE_MODE_B of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is "WRITE_FIRST"; - attribute C_WRITE_WIDTH_A : integer; - attribute C_WRITE_WIDTH_A of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 16; - attribute C_WRITE_WIDTH_B : integer; - attribute C_WRITE_WIDTH_B of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is 16; - attribute C_XDEVICEFAMILY : string; - attribute C_XDEVICEFAMILY of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is "kintexu"; - attribute ORIG_REF_NAME : string; - attribute ORIG_REF_NAME of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is "blk_mem_gen_v8_4_1"; - attribute downgradeipidentifiedwarnings : string; - attribute downgradeipidentifiedwarnings of Distr_LUT_felig_blk_mem_gen_v8_4_1 : entity is "yes"; -end Distr_LUT_felig_blk_mem_gen_v8_4_1; +`protect key_keyowner="Xilinx", key_keyname="xilinxt_2023_11", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +Pk1GeRlkUK9lt6DVXYVdtOABlzDEWQDcBsP/p+Wo5HaglDLG5b8gk08xTP3IcJ1RKcfuARPMGO2s +/VqFbnVADV90T1rhjIuWMcBnzYQK/ALUvwv11Uju9Gn0fvPIz52l3QBnpjHI1nlsFB7WeqkzVfHZ +tg9gO9bPHjHLjVd9BzH6McrEWY5RkZ0UBy0Fmh/SownJX1b0YGE7LdwKydEMEpyvb28bwTOwfEv/ +4RtsfYtEvTjo6e1ZBm66D9IQmKUu32wzTfn5bFZHdyjZg6+HcTzvHMtQX2+AggXfP6FsO2/83qkb +0bfj226fnLhr32dJxtsaJS5OR63GYtzDJ05ITA== -architecture STRUCTURE of Distr_LUT_felig_blk_mem_gen_v8_4_1 is - signal \<const0>\ : STD_LOGIC; -begin - dbiterr <= \<const0>\; - douta(15) <= \<const0>\; - douta(14) <= \<const0>\; - douta(13) <= \<const0>\; - douta(12) <= \<const0>\; - douta(11) <= \<const0>\; - douta(10) <= \<const0>\; - douta(9) <= \<const0>\; - douta(8) <= \<const0>\; - douta(7) <= \<const0>\; - douta(6) <= \<const0>\; - douta(5) <= \<const0>\; - douta(4) <= \<const0>\; - douta(3) <= \<const0>\; - douta(2) <= \<const0>\; - douta(1) <= \<const0>\; - douta(0) <= \<const0>\; - rdaddrecc(9) <= \<const0>\; - rdaddrecc(8) <= \<const0>\; - rdaddrecc(7) <= \<const0>\; - rdaddrecc(6) <= \<const0>\; - rdaddrecc(5) <= \<const0>\; - rdaddrecc(4) <= \<const0>\; - rdaddrecc(3) <= \<const0>\; - rdaddrecc(2) <= \<const0>\; - rdaddrecc(1) <= \<const0>\; - rdaddrecc(0) <= \<const0>\; - rsta_busy <= \<const0>\; - rstb_busy <= \<const0>\; - s_axi_arready <= \<const0>\; - s_axi_awready <= \<const0>\; - s_axi_bid(3) <= \<const0>\; - s_axi_bid(2) <= \<const0>\; - s_axi_bid(1) <= \<const0>\; - s_axi_bid(0) <= \<const0>\; - s_axi_bresp(1) <= \<const0>\; - s_axi_bresp(0) <= \<const0>\; - s_axi_bvalid <= \<const0>\; - s_axi_dbiterr <= \<const0>\; - s_axi_rdaddrecc(9) <= \<const0>\; - s_axi_rdaddrecc(8) <= \<const0>\; - s_axi_rdaddrecc(7) <= \<const0>\; - s_axi_rdaddrecc(6) <= \<const0>\; - s_axi_rdaddrecc(5) <= \<const0>\; - s_axi_rdaddrecc(4) <= \<const0>\; - s_axi_rdaddrecc(3) <= \<const0>\; - s_axi_rdaddrecc(2) <= \<const0>\; - s_axi_rdaddrecc(1) <= \<const0>\; - s_axi_rdaddrecc(0) <= \<const0>\; - s_axi_rdata(15) <= \<const0>\; - s_axi_rdata(14) <= \<const0>\; - s_axi_rdata(13) <= \<const0>\; - s_axi_rdata(12) <= \<const0>\; - s_axi_rdata(11) <= \<const0>\; - s_axi_rdata(10) <= \<const0>\; - s_axi_rdata(9) <= \<const0>\; - s_axi_rdata(8) <= \<const0>\; - s_axi_rdata(7) <= \<const0>\; - s_axi_rdata(6) <= \<const0>\; - s_axi_rdata(5) <= \<const0>\; - s_axi_rdata(4) <= \<const0>\; - s_axi_rdata(3) <= \<const0>\; - s_axi_rdata(2) <= \<const0>\; - s_axi_rdata(1) <= \<const0>\; - s_axi_rdata(0) <= \<const0>\; - s_axi_rid(3) <= \<const0>\; - s_axi_rid(2) <= \<const0>\; - s_axi_rid(1) <= \<const0>\; - s_axi_rid(0) <= \<const0>\; - s_axi_rlast <= \<const0>\; - s_axi_rresp(1) <= \<const0>\; - s_axi_rresp(0) <= \<const0>\; - s_axi_rvalid <= \<const0>\; - s_axi_sbiterr <= \<const0>\; - s_axi_wready <= \<const0>\; - sbiterr <= \<const0>\; -GND: unisim.vcomponents.GND - port map ( - G => \<const0>\ - ); -inst_blk_mem_gen: entity work.Distr_LUT_felig_blk_mem_gen_v8_4_1_synth - port map ( - addra(9 downto 0) => addra(9 downto 0), - addrb(9 downto 0) => addrb(9 downto 0), - clka => clka, - clkb => clkb, - dina(15 downto 0) => dina(15 downto 0), - doutb(15 downto 0) => doutb(15 downto 0), - enb => enb, - sleep => sleep, - wea(0) => wea(0) - ); -end STRUCTURE; +`protect key_keyowner="Metrics Technologies Inc.", key_keyname="DSim", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +LCfWqKmUoUSVOTKNAl5p8n1hfz7SMU2kDOUMBjsDncgSFqiu2zUy1I6GSDrVnF/2umJG5/mWcpvi +rQaFJOlrJ8DNctSuavdlopRAwTMsVi6dAlNGrAawSiDIxtI3tN3MDVdMiH5H+pJMqMt59yXneyCf +2RRSRz2sUQK/aj0lXlqKjVJzVbk8HaBQ8akBJF4iWSMK4foIzJ6iO1EupYovuW6uEiO7jQRWezlW +pbbDenOHHWbfinuX5cbkjpTKHGsEKct65q+ZXJp60m3sconSK3Y2eLQxusuJ1FHDJ4GGKO8mEzCv +3cfGdXX3pVL81OfGO/JD1aMs9H98CO5ssbHqlw== + +`protect key_keyowner="Atrenta", key_keyname="ATR-SG-RSA-1", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=384) +`protect key_block +A4S1e3DHcTeWzaDVuWDRb3Yf1BjiEsR1RtAeL0BJ7J/oPWMNj96MeGsUiHtZoiYqteTZxqax2cyZ +PV0cMLoBK4Ya8CyM+BTnkFA2ablsGt5Es4TgG/nFS9VEhmeKxu8boAsqW5697aiqOATJf/LucQh5 +GOnPXHAuPrDj0A/fu8N2QduqGyysWUSc1KsoJ0/0noJYvLJ2yOhFi4uIUYQfG5LOuOrca5P43pqA +iwUKW/RrFXal2acJdFeXIKffZpKanSV97urdzKyBvf9EPV/M8g9uPFJJ1z6aS+FbknhVPs0pt6eD ++J/qib4gVp/HGnRo4YlxauUMv6Yv9wxiaObY6ttDfYf5p3uzWZMlf3i7YOzZwcd4aS/6+vkD28LG +L9piBIpLx2dvQy74RdvCVdvaP1LC6RMju9RfuXJhuX4ZAmDxRi0zQyRda838ikzwYeOCSKLIvRPb +nuJ8Zx2ot8EFqSeGaaRFaEMU6Zf5SptCUuVMHvSkinBewcwrLB5uiJTJ + +`protect key_keyowner="Cadence Design Systems.", key_keyname="CDS_RSA_KEY_VER_1", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +gj+uMxV+tK4Di7pgSOE82FOBeWmUB1A7OKFOSMUW3qrmQ4/YhryfHMlWPxfAq8avQL7tnBTnRFEg +czbErdIcNzYjrM7Qq00QC/mTqmeQX4/apbqGvN+rwK4RR5oj22wfTib/UQNEQX6fbpi6PtmAeUR9 +eShsfq+YWcf7z2Zw4Q+o4+E6m4/3CzU68vglNpzNsJ8S9/8XpdIrvAA/WRAX6OEOC4wlNIKDZsq/ ++zMbFgSzN1rP844I/CDmxYM0NIzBWWhYBkPfJyQyigmUoXb84lDip0/Dmnq4EHvu7D/tZNnDl5st +JpftRfEpT6S8e/5MBeKUuhbfg6etHo/oFZvPKQ== + +`protect key_keyowner="Synplicity", key_keyname="SYNP15_1", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +aWTy3xv6SqKsldtLS2gY4KrTS8U+KtFNRHS314f6EYZy1MHE9t7oICJ8eNB8up8A+odoE23N3fJb +1alhaadeRWU2GjlIiK1LjZ5PQw+jb1u1GWtRiY+TcTlD75XUlqwykVBrCDfm565DmgZjZle9T3/t +WEfLo+m/8GfBe8trVnoftsk/XI00BMFXRzw8doPGDhNECS1NUrLebryb9iO5Hf4A/40dtslTARsR +nicN0KoIIyiQ+QzliqyXU/8VjS45inON8R0Kv9Qx46EXUp7bds5uQ7QycRhpLG0IPnMIweudU67w +eQmpHJzvZKBCZks/R0OafZx44H6Jib2+QazBCw== + +`protect key_keyowner="Mentor Graphics Corporation", key_keyname="MGC-PREC-RSA", key_method="rsa" +`protect encoding = (enctype="BASE64", line_length=76, bytes=256) +`protect key_block +UGdPiChIPj1lSozqzCQx17Bi+8FWSuMUMzXUkDLH5zcP1t8tZLzh4CU4WAR8lmJxn8gH763fLp5c +RYU6zA0yxHzl2ksc5YRU1XEfQQT9ha8fQnz+18wVKcsa5UIOfMbGDwnS9yfX59ntG8CB0uF8bJKE +y1CS6U/1Stfs1w2mF94iDxI2n2GJlb1UPtWpmxMBI88hY0GktTPXP2Y7JKl8zRl/Lq0wIF8pHwXk +B4nOgKm6hfzPj0xZ6E/TuER/JE3fy8RSm24IlL/CUgpReEslEOYjQ4EKKZRG9/fxg26utQWW9p+G +fWVU53qrFGzBhKQ96Paj1ROkv6hDHyUb6n7uSw== + +`protect data_method = "AES128-CBC" +`protect encoding = (enctype = "BASE64", line_length = 76, bytes = 31088) +`protect data_block +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 +wcnhplIi4BGm8Ov+8a31Qy8XeZIPHas= +`protect end_protected library IEEE; use IEEE.STD_LOGIC_1164.ALL; library UNISIM; @@ -674,11 +680,11 @@ entity Distr_LUT_felig is attribute NotValidForBitStream : boolean; attribute NotValidForBitStream of Distr_LUT_felig : entity is true; attribute CHECK_LICENSE_TYPE : string; - attribute CHECK_LICENSE_TYPE of Distr_LUT_felig : entity is "Distr_LUT_felig,blk_mem_gen_v8_4_1,{}"; + attribute CHECK_LICENSE_TYPE of Distr_LUT_felig : entity is "Distr_LUT_felig,blk_mem_gen_v8_4_8,{}"; attribute downgradeipidentifiedwarnings : string; attribute downgradeipidentifiedwarnings of Distr_LUT_felig : entity is "yes"; attribute x_core_info : string; - attribute x_core_info of Distr_LUT_felig : entity is "blk_mem_gen_v8_4_1,Vivado 2018.1"; + attribute x_core_info of Distr_LUT_felig : entity is "blk_mem_gen_v8_4_8,Vivado 2024.1"; end Distr_LUT_felig; architecture STRUCTURE of Distr_LUT_felig is @@ -802,6 +808,10 @@ architecture STRUCTURE of Distr_LUT_felig is attribute C_READ_DEPTH_A of U0 : label is 1024; attribute C_READ_DEPTH_B : integer; attribute C_READ_DEPTH_B of U0 : label is 1024; + attribute C_READ_LATENCY_A : integer; + attribute C_READ_LATENCY_A of U0 : label is 1; + attribute C_READ_LATENCY_B : integer; + attribute C_READ_LATENCY_B of U0 : label is 1; attribute C_READ_WIDTH_A : integer; attribute C_READ_WIDTH_A of U0 : label is 16; attribute C_READ_WIDTH_B : integer; @@ -849,12 +859,14 @@ architecture STRUCTURE of Distr_LUT_felig is attribute C_XDEVICEFAMILY : string; attribute C_XDEVICEFAMILY of U0 : label is "kintexu"; attribute downgradeipidentifiedwarnings of U0 : label is "yes"; + attribute is_du_within_envelope : string; + attribute is_du_within_envelope of U0 : label is "true"; attribute x_interface_info : string; attribute x_interface_info of clka : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTA CLK"; attribute x_interface_parameter : string; - attribute x_interface_parameter of clka : signal is "XIL_INTERFACENAME BRAM_PORTA, MEM_SIZE 8192, MEM_WIDTH 32, MEM_ECC NONE, MASTER_TYPE OTHER"; + attribute x_interface_parameter of clka : signal is "XIL_INTERFACENAME BRAM_PORTA, MEM_ADDRESS_MODE BYTE_ADDRESS, MEM_SIZE 8192, MEM_WIDTH 32, MEM_ECC NONE, MASTER_TYPE OTHER, READ_LATENCY 1"; attribute x_interface_info of clkb : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTB CLK"; - attribute x_interface_parameter of clkb : signal is "XIL_INTERFACENAME BRAM_PORTB, MEM_SIZE 8192, MEM_WIDTH 32, MEM_ECC NONE, MASTER_TYPE OTHER"; + attribute x_interface_parameter of clkb : signal is "XIL_INTERFACENAME BRAM_PORTB, MEM_ADDRESS_MODE BYTE_ADDRESS, MEM_SIZE 8192, MEM_WIDTH 32, MEM_ECC NONE, MASTER_TYPE OTHER, READ_LATENCY 1"; attribute x_interface_info of enb : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTB EN"; attribute x_interface_info of addra : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTA ADDR"; attribute x_interface_info of addrb : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTB ADDR"; @@ -862,7 +874,7 @@ architecture STRUCTURE of Distr_LUT_felig is attribute x_interface_info of doutb : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTB DOUT"; attribute x_interface_info of wea : signal is "xilinx.com:interface:bram:1.0 BRAM_PORTA WE"; begin -U0: entity work.Distr_LUT_felig_blk_mem_gen_v8_4_1 +U0: entity work.Distr_LUT_felig_blk_mem_gen_v8_4_8 port map ( addra(9 downto 0) => addra(9 downto 0), addrb(9 downto 0) => addrb(9 downto 0), @@ -880,8 +892,8 @@ U0: entity work.Distr_LUT_felig_blk_mem_gen_v8_4_1 injectdbiterr => '0', injectsbiterr => '0', rdaddrecc(9 downto 0) => NLW_U0_rdaddrecc_UNCONNECTED(9 downto 0), - regcea => '0', - regceb => '0', + regcea => '1', + regceb => '1', rsta => '0', rsta_busy => NLW_U0_rsta_busy_UNCONNECTED, rstb => '0',