diff --git a/applications/apertif/designs/apertif_unb1_correlator/quartus/apertif_unb1_correlator_pins.tcl b/applications/apertif/designs/apertif_unb1_correlator/quartus/apertif_unb1_correlator_pins.tcl index 9937946fdea526134ed9b5dc2c9023bf336fc076..ca9bb1a71bbc2cf2044c7477fd7578d624dc7d5a 100644 --- a/applications/apertif/designs/apertif_unb1_correlator/quartus/apertif_unb1_correlator_pins.tcl +++ b/applications/apertif/designs/apertif_unb1_correlator/quartus/apertif_unb1_correlator_pins.tcl @@ -24,4 +24,4 @@ source $::env(UNB)/Firmware/designs/unb_common/src/tcl/COMMON_NODE_other_pins.tc source $::env(UNB)/Firmware/designs/unb_common/src/tcl/COMMON_NODE_1Gbe_pins.tcl source $::env(UNB)/Firmware/designs/unb_common/src/tcl/COMMON_NODE_sensor_pins.tcl source $::env(UNB)/Firmware/designs/unb_common/src/tcl/pins_tr_front_pcs.tcl - +source $::env(UNB)/Firmware/designs/unb_common/src/tcl/FRONT_NODE_mesh_nocmu_pins.tcl diff --git a/applications/apertif/designs/apertif_unb1_correlator/src/vhdl/apertif_unb1_correlator.vhd b/applications/apertif/designs/apertif_unb1_correlator/src/vhdl/apertif_unb1_correlator.vhd index bb10ca6a3a807262b36584202f34cc5ed0ea89bb..54b26c9bce194eac3d2cbd9a527ca21b7b381be3 100644 --- a/applications/apertif/designs/apertif_unb1_correlator/src/vhdl/apertif_unb1_correlator.vhd +++ b/applications/apertif/designs/apertif_unb1_correlator/src/vhdl/apertif_unb1_correlator.vhd @@ -42,6 +42,17 @@ USE apertif_lib.apertif_udp_offload_pkg.ALL; USE wpfb_lib.wpfb_pkg.ALL; USE bf_lib.bf_pkg.ALL; +-- Purpose: +-- +-- Description: +-- +-- Remarks: +-- . Compile times: +-- . 48 Visibility system with dumb terminals : ??? hours, Non-functional design, for resource util exploration only. +-- . 48 Visibility system: : 5.5 hours, fMax ~200MHz, should be functional but it is not. +-- . 48 Visibility system, no DSP : 3.5 hours +-- . 48 Visibility system, BG+offload only : 20 minutes, for visibility offload testing only + ENTITY apertif_unb1_correlator IS GENERIC ( g_design_name : STRING := "apertif_unb1_correlator"; @@ -51,6 +62,7 @@ ENTITY apertif_unb1_correlator IS g_stamp_date : NATURAL := 0; -- Date (YYYYMMDD) -- set by QSF g_stamp_time : NATURAL := 0; -- Time (HHMMSS) -- set by QSF g_stamp_svn : NATURAL := 0; -- SVN revision -- set by QSF + g_use_dumb_mesh_terminals : BOOLEAN := TRUE; -- Add dumb mesh terminals to the design. Non-functional, for synthesis results only. g_offload_bg : BOOLEAN := FALSE;-- Bypass everything; use only a block-gen->dp_offload_tx. g_no_dsp : BOOLEAN := FALSE -- True = bypass WPFB, bypass correlator multipliers+accumulators. ); -- . Correlator does output correctly sized DP packets. @@ -78,8 +90,19 @@ ENTITY apertif_unb1_correlator IS -- Transceiver clocks SA_CLK : IN STD_LOGIC; -- SerDes Clock BN-BI / SI_FN + SB_CLK : IN STD_LOGIC; -- TR clock FN-BN (tr_mesh) + + -- Mesh Serial I/O + FN_BN_0_TX : OUT STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0); + FN_BN_0_RX : IN STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0); + FN_BN_1_TX : OUT STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0); + FN_BN_1_RX : IN STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0); + FN_BN_2_TX : OUT STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0); + FN_BN_2_RX : IN STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0); + FN_BN_3_TX : OUT STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0); + FN_BN_3_RX : IN STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0); - -- Serial I/O + -- Serial I/O: 10GbE receivers SI_FN_0_TX : OUT STD_LOGIC_VECTOR(c_unb1_board_ci.tr.bus_w-1 DOWNTO 0); SI_FN_0_RX : IN STD_LOGIC_VECTOR(c_unb1_board_ci.tr.bus_w-1 DOWNTO 0); SI_FN_1_TX : OUT STD_LOGIC_VECTOR(c_unb1_board_ci.tr.bus_w-1 DOWNTO 0); @@ -298,6 +321,8 @@ ARCHITECTURE str OF apertif_unb1_correlator IS SIGNAL dp_bsn_monitor_in_sosi_arr : t_dp_sosi_arr(c_nof_10GbE_streams+1+1-1 DOWNTO 0); -- De and Reinterleaver + SIGNAL dp_deinterleave_snk_in_arr : t_dp_sosi_arr(c_nof_10GbE_streams*c_nof_bf_modules-1 DOWNTO 0); + SIGNAL dp_pipeline_snk_in : t_dp_sosi; SIGNAL interleaved_arr : t_dp_sosi_arr(c_nof_10GbE_streams*c_nof_bf_modules-1 DOWNTO 0); SIGNAL deinterleaved_arr : t_dp_sosi_arr(c_nof_inputs-1 DOWNTO 0); SIGNAL reinterleave_in_arr : t_dp_sosi_arr(c_nof_inputs-1 DOWNTO 0); @@ -316,6 +341,16 @@ ARCHITECTURE str OF apertif_unb1_correlator IS SIGNAL apertif_unb1_correlator_vis_offload_snk_out : t_dp_siso; SIGNAL dp_offload_tx_src_out_arr : t_dp_sosi_arr(1-1 DOWNTO 0); SIGNAL dp_offload_tx_src_in_arr : t_dp_siso_arr(1-1 DOWNTO 0); + + -- Mesh terminals + SIGNAL tx_serial_2arr : t_unb1_board_mesh_sl_2arr; + SIGNAL rx_serial_2arr : t_unb1_board_mesh_sl_2arr; + + SIGNAL mesh_tx_snk_out_2arr : t_unb1_board_mesh_siso_2arr; + SIGNAL mesh_tx_snk_in_2arr : t_unb1_board_mesh_sosi_2arr; + SIGNAL mesh_rx_src_in_2arr : t_unb1_board_mesh_siso_2arr; + SIGNAL mesh_rx_src_out_2arr : t_unb1_board_mesh_sosi_2arr; + BEGIN gen_no_offload_bg: IF g_offload_bg=FALSE GENERATE @@ -544,22 +579,11 @@ BEGIN END GENERATE; ----------------------------------------------------------------------------- - -- RX: 3 BSN monitors for the 3 incoming streams - -- +1 BSN monitor for post-BSN aligner stream(0) - -- +1 BSN monitor for correlator output + -- RX: BSN monitors at several stages in the stream ----------------------------------------------------------------------------- - dp_bsn_monitor_in_siso_arr(c_nof_10GbE_streams-1 DOWNTO 0) <= dp_offload_rx_src_in_arr; - dp_bsn_monitor_in_sosi_arr(c_nof_10GbE_streams-1 DOWNTO 0) <= dp_offload_rx_restored_src_out_arr; - -- Use the 4th BSN monitor instance to monitor post-BSN aligner stream(0) - dp_bsn_monitor_in_sosi_arr(c_nof_10GbE_streams) <= dp_bsn_align_src_out_arr(0); - dp_bsn_monitor_in_siso_arr(c_nof_10GbE_streams) <= dp_bsn_align_src_in_arr(0); - -- Use the 5th BSN monitor instance to monitor the correlator output - dp_bsn_monitor_in_sosi_arr(c_nof_10GbE_streams+1) <= correlator_src_out_arr(0); - dp_bsn_monitor_in_siso_arr(c_nof_10GbE_streams+1) <= c_dp_siso_rdy; - u_dp_bsn_monitor : ENTITY dp_lib.mms_dp_bsn_monitor GENERIC MAP ( - g_nof_streams => c_nof_10GbE_streams+1+1, + g_nof_streams => 5, g_log_first_bsn => TRUE ) PORT MAP ( @@ -574,11 +598,27 @@ BEGIN in_sosi_arr => dp_bsn_monitor_in_sosi_arr ); + -- 0) Monitor the BSN-aligned output + dp_bsn_monitor_in_sosi_arr(0) <= dp_bsn_align_src_out_arr(0); + dp_bsn_monitor_in_siso_arr(0) <= dp_bsn_align_src_in_arr(0); + -- 1) Monitor the rewired/reinterleaver stage output / WPFB input + dp_bsn_monitor_in_sosi_arr(1) <= wpfb_snk_in_arr(0); + dp_bsn_monitor_in_siso_arr(1) <= c_dp_siso_rdy; + -- 2) Monitor the WPFB output / correlator input + dp_bsn_monitor_in_sosi_arr(2) <= wpfb_src_out_arr(0); + dp_bsn_monitor_in_siso_arr(2) <= c_dp_siso_rdy; + -- 3) Monitor the correlator output / visibility offload input + dp_bsn_monitor_in_sosi_arr(3) <= correlator_src_out_arr(0); + dp_bsn_monitor_in_siso_arr(3) <= c_dp_siso_rdy; + -- 3) Monitor the correlator output / visibility offload input + dp_bsn_monitor_in_sosi_arr(4) <= dp_offload_tx_src_out_arr(0); + dp_bsn_monitor_in_siso_arr(4) <= dp_offload_tx_src_in_arr(0); + ----------------------------------------------------------------------------- -- Beamlet routing from 10GbE inputs T2..T0 to unfolder correlator inputs 23..0: -- . Beamlet indices between parentheses () - -- . Stream indices between brackets [] - -- + -- . Stream indices between brackets [] /-Insert Mesh terminals here (?) after deinterleaved_arr + -- / -- T2(B6,B7)--[11]--deinter-[1]--(T2,B7)--[23] [23]--(T2,B7)--[1]-reinter-[11]--(T1,B7),(T2,B7)--unfold-[1]--(T2,B7)-->[23] -- \[0]--(T2,B6)--[22] [15]--(T1,B7)--[0]/ \[0]--(T1,B7)-->[22] -- (B4,B5)--[10]--deinter-[1]--(T2,B5)--[21] [07]--(T0,B7)--[1]-reinter-[10]--(T2,B6),(T0,B7)--unfold-[1]--(T0,B7)-->[21] @@ -606,8 +646,12 @@ BEGIN -- ^ ^ ^ ^ ^ -- interleaved_arr | reinterleave_in_arr | Unfolded correlator inputs -- deinterleaved_arr reinterleave_out_arr,wpfb_out_arr,correlator_snk_in_arr - ----------------------------------------------------------------------------- - + ----------------------------------------------------------------------------- + gen_deinterleave_snk_in_arr: IF g_use_dumb_mesh_terminals=FALSE GENERATE + dp_pipeline_snk_in <= interleaved_arr(0); + dp_deinterleave_snk_in_arr <= interleaved_arr; + END GENERATE; + gen_deinterleave : FOR i IN 0 TO c_nof_10GbE_streams*c_nof_bf_modules-1 GENERATE u_deinterleave : ENTITY dp_lib.dp_deinterleave GENERIC MAP ( @@ -622,11 +666,11 @@ BEGIN rst => dp_rst, clk => dp_clk, - snk_in => interleaved_arr(i), + snk_in => dp_deinterleave_snk_in_arr(i), src_out_arr => deinterleaved_arr(2*i+1 DOWNTO 2*i) ); END GENERATE; - + p_reorder_array : PROCESS(deinterleaved_arr) BEGIN FOR i IN 0 TO 2*c_nof_bf_modules-1 LOOP @@ -664,7 +708,7 @@ BEGIN rst => dp_rst, clk => dp_clk, -- ST sink - snk_in => interleaved_arr(0), + snk_in => dp_pipeline_snk_in, --interleaved_arr(0), -- ST source src_out => wpfb_snk_in_ctrl ); @@ -679,6 +723,124 @@ BEGIN END LOOP; END PROCESS; + ----------------------------------------------------------------------------- + -- Preliminary mesh terminals to explore resource usage of final design: + -- . With g_use_dumb_mesh_terminals=TRUE, the mesh terminals: + -- . Transmit 21/24 beamlets to the other 7 FPGAs via the mesh. + -- . Receive 21/24 beamlets from the other FPGAs via the mesh. + -- . These are DUMB terminals because this will synthesize but not + -- functionally work because the lack of alignment and proper rewiring. + -- . FOR EXPLORATION OF RESOURCE UTILIZATION ONLY! + ----------------------------------------------------------------------------- + gen_terminals_mesh : if g_use_dumb_mesh_terminals=TRUE GENERATE + + mesh_tx_snk_in_2arr(0)(0) <= interleaved_arr(0); + mesh_tx_snk_in_2arr(0)(1) <= interleaved_arr(1); + mesh_tx_snk_in_2arr(0)(2) <= interleaved_arr(2); + mesh_tx_snk_in_2arr(1)(0) <= interleaved_arr(3); + mesh_tx_snk_in_2arr(1)(1) <= interleaved_arr(4); + mesh_tx_snk_in_2arr(1)(2) <= interleaved_arr(5); + mesh_tx_snk_in_2arr(2)(0) <= interleaved_arr(6); + mesh_tx_snk_in_2arr(2)(1) <= interleaved_arr(7); + mesh_tx_snk_in_2arr(2)(2) <= interleaved_arr(8); + mesh_tx_snk_in_2arr(3)(0) <= interleaved_arr(9); + mesh_tx_snk_in_2arr(3)(1) <= interleaved_arr(10); + mesh_tx_snk_in_2arr(3)(2) <= interleaved_arr(11); + + dp_deinterleave_snk_in_arr(0) <= mesh_rx_src_out_2arr(0)(0); + dp_deinterleave_snk_in_arr(1) <= mesh_rx_src_out_2arr(0)(1); + dp_deinterleave_snk_in_arr(2) <= mesh_rx_src_out_2arr(0)(2); + dp_deinterleave_snk_in_arr(3) <= mesh_rx_src_out_2arr(1)(0); + dp_deinterleave_snk_in_arr(4) <= mesh_rx_src_out_2arr(1)(1); + dp_deinterleave_snk_in_arr(5) <= mesh_rx_src_out_2arr(1)(2); + dp_deinterleave_snk_in_arr(6) <= mesh_rx_src_out_2arr(2)(0); + dp_deinterleave_snk_in_arr(7) <= mesh_rx_src_out_2arr(2)(1); + dp_deinterleave_snk_in_arr(8) <= mesh_rx_src_out_2arr(2)(2); + dp_deinterleave_snk_in_arr(9) <= mesh_rx_src_out_2arr(3)(0); + dp_deinterleave_snk_in_arr(10) <= mesh_rx_src_out_2arr(3)(1); + dp_deinterleave_snk_in_arr(11) <= mesh_rx_src_out_2arr(3)(2); + + dp_pipeline_snk_in <= mesh_rx_src_out_2arr(0)(0); + + u_terminals_mesh : ENTITY unb1_board_lib.unb1_board_terminals_mesh + GENERIC MAP ( + g_sim => g_sim, + g_sim_level => 1, + -- System + g_node_type => e_fn, + g_nof_bus => 4, + -- User + g_usr_use_complex => c_use_complex, + g_usr_data_w => 16, + g_usr_frame_len => 176, + g_usr_nof_streams => 4, -- Actually 3 but has to be 4 to prevent errors. + -- Phy + g_phy_nof_serial => 3, + g_phy_gx_mbps => 6250, + g_phy_rx_fifo_size => 176, + g_phy_ena_reorder => TRUE, + -- Tx + g_use_tx => TRUE, + g_tx_input_use_fifo => TRUE, + -- Rx + g_use_rx => TRUE, + g_rx_output_use_fifo => TRUE, + g_rx_output_fifo_size => 176, + g_rx_output_fifo_fill => 0, + g_rx_timeout_w => 0, + -- Monitoring + g_mon_select => 0 + ) + PORT MAP ( + chip_id => ID(2 DOWNTO 0), + + mm_rst => mm_rst, + mm_clk => mm_clk, + dp_rst => dp_rst, + dp_clk => dp_clk, +-- dp_sync => dp_pps, + tr_clk => SB_clk, + cal_clk => mm_clk, + + -- Received beamlets from other nodes +-- rx_usr_siso_2arr => mesh_rx_src_in_2arr, + rx_usr_sosi_2arr => mesh_rx_src_out_2arr, + + -- Beamlets transmitted to other nodes +-- tx_usr_siso_2arr => mesh_tx_snk_out_2arr, + tx_usr_sosi_2arr => mesh_tx_snk_in_2arr, + + -- Mesh interface level (4 nodes)(4 lanes) + tx_serial_2arr => tx_serial_2arr, + rx_serial_2arr => rx_serial_2arr + + -- MM Control +-- reg_tr_nonbonded_mosi => reg_tr_nonbonded_mosi, +-- reg_tr_nonbonded_miso => reg_tr_nonbonded_miso, +-- reg_diagnostics_mosi => reg_diagnostics_mosi, +-- reg_diagnostics_miso => reg_diagnostics_miso, +-- ram_diag_data_buf_mosi => ram_mesh_diag_data_buf_mosi, +-- ram_diag_data_buf_miso => ram_mesh_diag_data_buf_miso + ); + + u_unb1_board_mesh_io : ENTITY unb1_board_lib.unb1_board_mesh_io + PORT MAP ( + tx_serial_2arr => tx_serial_2arr, + rx_serial_2arr => rx_serial_2arr, + + -- Serial I/O + FN_BN_0_TX => FN_BN_0_TX, + FN_BN_0_RX => FN_BN_0_RX, + FN_BN_1_TX => FN_BN_1_TX, + FN_BN_1_RX => FN_BN_1_RX, + FN_BN_2_TX => FN_BN_2_TX, + FN_BN_2_RX => FN_BN_2_RX, + FN_BN_3_TX => FN_BN_3_TX, + FN_BN_3_RX => FN_BN_3_RX + ); + + END GENERATE; + ----------------------------------------------------------------------------- -- WPFB ----------------------------------------------------------------------------- diff --git a/applications/apertif/designs/apertif_unb1_correlator/tb/vhdl/tb_apertif_unb1_correlator.vhd b/applications/apertif/designs/apertif_unb1_correlator/tb/vhdl/tb_apertif_unb1_correlator.vhd index cd1f937417372c2822f7b4cf770bb80243d4d4e4..9b8d09ebb49dfd04573c2e35d9029aac5f225c6d 100644 --- a/applications/apertif/designs/apertif_unb1_correlator/tb/vhdl/tb_apertif_unb1_correlator.vhd +++ b/applications/apertif/designs/apertif_unb1_correlator/tb/vhdl/tb_apertif_unb1_correlator.vhd @@ -73,6 +73,11 @@ ARCHITECTURE tb OF tb_apertif_unb1_correlator IS SIGNAL sens_scl : STD_LOGIC; SIGNAL sens_sda : STD_LOGIC; SIGNAL si_fn_0_tx : STD_LOGIC_VECTOR(c_unb1_board_ci.tr.bus_w-1 DOWNTO 0) := (OTHERS => '0'); + + SIGNAL fn_bn_0_tx : STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0); + SIGNAL fn_bn_1_tx : STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0); + SIGNAL fn_bn_2_tx : STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0); + SIGNAL fn_bn_3_tx : STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0); BEGIN @@ -126,12 +131,25 @@ BEGIN -- Transceiver clocks SA_CLK => sa_clk, -- : IN STD_LOGIC; -- SerDes Clock BN-BI / SI_FN - + SB_CLK => sa_clk, + -- Serial I/O - SI_FN_0_RX => si_fn_0_tx, -- : IN STD_LOGIC_VECTOR(c_unb1_board_ci.tr.bus_w-1 DOWNTO 0); - SI_FN_1_RX => si_fn_0_tx, -- : IN STD_LOGIC_VECTOR(c_unb1_board_ci.tr.bus_w-1 DOWNTO 0); - SI_FN_2_RX => si_fn_0_tx, -- : IN STD_LOGIC_VECTOR(c_unb1_board_ci.tr.bus_w-1 DOWNTO 0); - SI_FN_3_RX => si_fn_0_tx -- : IN STD_LOGIC_VECTOR(c_unb1_board_ci.tr.bus_w-1 DOWNTO 0); + SI_FN_0_RX => si_fn_0_tx, + SI_FN_1_RX => si_fn_0_tx, + SI_FN_2_RX => si_fn_0_tx, + SI_FN_3_RX => si_fn_0_tx, + + FN_BN_0_RX => fn_bn_0_tx, + FN_BN_0_TX => fn_bn_0_tx, + + FN_BN_1_RX => fn_bn_1_tx, + FN_BN_1_tX => fn_bn_1_tx, + + FN_BN_2_RX => fn_bn_2_tx, + FN_BN_2_TX => fn_bn_2_tx, + + FN_BN_3_RX => fn_bn_3_tx, + FN_BN_3_TX => fn_bn_3_tx ); END tb;