From 5afe666027eca15a705246892dbaafb503f1f8d2 Mon Sep 17 00:00:00 2001 From: JobvanWee <wee@astron.nl> Date: Tue, 3 May 2022 14:59:01 +0200 Subject: [PATCH] Save --- .../designs/lofar2_unb2c_ddrctrl/hdllib.cfg | 4 +- .../src/vhdl/lofar2_unb2c_ddrctrl.vhd | 75 +++++----- .../src/vhdl/mmm_lofar2_unb2c_ddrctrl.vhd | 2 +- .../tb/vhdl/tb_lofar2_unb2c_ddrctrl.vhd | 130 ++++++++++++++++-- .../libraries/ddrctrl/src/vhdl/ddrctrl.vhd | 2 +- .../ddrctrl/src/vhdl/ddrctrl_controller.vhd | 26 ++-- .../vhdl/ddrctrl_input_address_counter.vhd | 3 +- 7 files changed, 188 insertions(+), 54 deletions(-) diff --git a/applications/lofar2/designs/lofar2_unb2c_ddrctrl/hdllib.cfg b/applications/lofar2/designs/lofar2_unb2c_ddrctrl/hdllib.cfg index f4619bf5c7..0f90c75817 100644 --- a/applications/lofar2/designs/lofar2_unb2c_ddrctrl/hdllib.cfg +++ b/applications/lofar2/designs/lofar2_unb2c_ddrctrl/hdllib.cfg @@ -1,6 +1,6 @@ hdl_lib_name = lofar2_unb2c_ddrctrl hdl_library_clause_name = lofar2_unb2c_ddrctrl_lib -hdl_lib_uses_synth = common technology mm unb2c_board lofar2_ddrctrl diag dp +hdl_lib_uses_synth = lofar2_ddrctrl common technology mm unb2c_board lofar2_ddrctrl diag dp tech_ddr lofar2_sdp mm hdl_lib_uses_sim = hdl_lib_technology = ip_arria10_e2sg @@ -17,12 +17,14 @@ regression_test_vhdl = [modelsim_project_file] modelsim_copy_files = + src/data data [quartus_project_file] synth_top_level_entity = quartus_copy_files = quartus . + src/data data quartus_qsf_files = $RADIOHDL_WORK/boards/uniboard2c/libraries/unb2c_board/quartus/unb2c_board.qsf diff --git a/applications/lofar2/designs/lofar2_unb2c_ddrctrl/src/vhdl/lofar2_unb2c_ddrctrl.vhd b/applications/lofar2/designs/lofar2_unb2c_ddrctrl/src/vhdl/lofar2_unb2c_ddrctrl.vhd index 76788eb88c..d90d5998ba 100644 --- a/applications/lofar2/designs/lofar2_unb2c_ddrctrl/src/vhdl/lofar2_unb2c_ddrctrl.vhd +++ b/applications/lofar2/designs/lofar2_unb2c_ddrctrl/src/vhdl/lofar2_unb2c_ddrctrl.vhd @@ -20,7 +20,7 @@ -- ------------------------------------------------------------------------------- -LIBRARY IEEE, common_lib, unb2c_board_lib, technology_lib, diag_lib, dp_lib, ddrctrl_lib; +LIBRARY IEEE, common_lib, unb2c_board_lib, technology_lib, diag_lib, dp_lib, lofar2_ddrctrl_lib, tech_ddr_lib, lofar2_sdp_lib; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.NUMERIC_STD.ALL; USE common_lib.common_pkg.ALL; @@ -28,6 +28,11 @@ USE common_lib.common_mem_pkg.ALL; USE technology_lib.technology_pkg.ALL; USE unb2c_board_lib.unb2c_board_pkg.ALL; USE dp_lib.dp_stream_pkg.ALL; +USE tech_ddr_lib.tech_ddr_pkg.ALL; +USE lofar2_sdp_lib.sdp_pkg.ALL; +USE diag_lib.diag_pkg.ALL; + + ENTITY lofar2_unb2c_ddrctrl IS GENERIC ( @@ -84,7 +89,7 @@ ARCHITECTURE str OF lofar2_unb2c_ddrctrl IS CONSTANT c_bsn_nof_clk_per_sync : NATURAL := sel_a_b(g_sim, 16*c_bs_block_size, c_sdp_N_clk_per_sync); -- ddrctrl - CONSTANT c_tech_ddr : t_c_tech_ddr :=c_tech_ddr4_8g_1600m; + CONSTANT c_tech_ddr : t_c_tech_ddr := func_tech_sel_ddr(g_sim, c_tech_ddr4_sim_16k, c_tech_ddr4_8g_1600m); CONSTANT c_stop_percentage : NATURAL := 80; -- diag_data_buffer @@ -102,10 +107,10 @@ ARCHITECTURE str OF lofar2_unb2c_ddrctrl IS SIGNAL xo_rst : STD_LOGIC; SIGNAL xo_rst_n : STD_LOGIC; SIGNAL mm_clk : STD_LOGIC; - SIGNAL mm_rst : STD_LOGIC; + SIGNAL mm_rst : STD_LOGIC := '0'; SIGNAL st_pps : STD_LOGIC; - SIGNAL st_rst : STD_LOGIC; + SIGNAL st_rst : STD_LOGIC := '0'; SIGNAL st_clk : STD_LOGIC; -- PIOs @@ -170,13 +175,21 @@ ARCHITECTURE str OF lofar2_unb2c_ddrctrl IS SIGNAL qsfp_red_led_arr : STD_LOGIC_VECTOR(c_unb2c_board_tr_qsfp.nof_bus-1 DOWNTO 0); -- bsn_source_v2 - SIGNAL reg_bsn_source_v2_mosi : t_mem_mosi; - SIGNAL reg_bsn_source_v2_miso : t_mem_miso; + SIGNAL reg_bsn_source_v2_mosi : t_mem_mosi; + SIGNAL reg_bsn_source_v2_miso : t_mem_miso; + SIGNAL bs_sosi : t_dp_sosi; -- bsn_scheduler - SIGNAL reg_bsn_scheduler_wg_mosi : t_mem_mosi; - SIGNAL reg_bsn_scheduler_wg_miso : t_mem_miso; - SIGNAL trigger_wg : STD_LOGIC; + SIGNAL reg_bsn_scheduler_wg_mosi : t_mem_mosi; + SIGNAL reg_bsn_scheduler_wg_miso : t_mem_miso; + SIGNAL trigger_wg : STD_LOGIC; + + -- diag_wg_wideband_arr + SIGNAL reg_wg_mosi : t_mem_mosi; + SIGNAL reg_wg_miso : t_mem_miso; + SIGNAL ram_wg_mosi : t_mem_mosi; + SIGNAL ram_wg_miso : t_mem_miso; + SIGNAL wg_sosi_arr : t_dp_sosi_arr(c_nof_streams-1 DOWNTO 0); -- stop_in SIGNAL reg_stop_in_mosi : t_mem_mosi; @@ -199,7 +212,7 @@ ARCHITECTURE str OF lofar2_unb2c_ddrctrl IS SIGNAL ram_data_buf_miso : t_mem_miso; SIGNAL reg_rx_seq_data_mosi : t_mem_mosi; SIGNAL reg_rx_seq_data_miso : t_mem_miso; - SIGNAL out_wr_data_ready_arr : STD_LOGIC_VECTOR(c_nof_streams-1 DOWNTO 0); + SIGNAL out_wr_data_done_arr : STD_LOGIC_VECTOR(c_nof_streams-1 DOWNTO 0); -- bsn_buffer SIGNAL reg_bsn_buf_mosi : t_mem_mosi; @@ -208,7 +221,7 @@ ARCHITECTURE str OF lofar2_unb2c_ddrctrl IS SIGNAL ram_bsn_buf_miso : t_mem_miso; SIGNAL reg_rx_seq_bsn_mosi : t_mem_mosi; SIGNAL reg_rx_seq_bsn_miso : t_mem_miso; - SIGNAL out_wr_bsn_ready_arr : STD_LOGIC_VECTOR(c_nof_streams-1 DOWNTO 0); + SIGNAL out_wr_bsn_done_arr : STD_LOGIC_VECTOR(c_nof_streams-1 DOWNTO 0); @@ -216,11 +229,12 @@ ARCHITECTURE str OF lofar2_unb2c_ddrctrl IS BEGIN - out_siso.ready <= vector_or(out_wr_ready_arr) OR vector_or(out_wr_bsn_ready_arr); + out_siso.ready <= vector_or(NOT out_wr_data_done_arr) OR vector_or(NOT out_wr_bsn_done_arr); + - FOR I IN 0 TO g_nof_streams-1 LOOP + store_bsn_in_re : FOR I IN 0 TO c_nof_streams-1 GENERATE out_sosi_arr(I).re <= out_sosi_arr(I).bsn; - END LOOP; + END GENERATE; u_bsn_source_v2 : ENTITY dp_lib.mms_dp_bsn_source_v2 GENERIC MAP ( @@ -281,7 +295,7 @@ BEGIN -- Basic WG parameters, see diag_wg.vhd for their meaning g_buf_dat_w => c_wg_buf_dat_w, g_buf_addr_w => c_wg_buf_addr_w, - g_calc_support => TRUE, + g_calc_support => FALSE, g_calc_gain_w => 1, g_calc_dat_w => c_sdp_W_adc ) @@ -330,10 +344,9 @@ BEGIN in_reg => stop_in_arr, out_reg => stop_in_arr ); -END mms_common_reg; - u_ddrctrl : ENTITY ddrctrl_lib.ddrctrl + u_ddrctrl : ENTITY lofar2_ddrctrl_lib.ddrctrl GENERIC MAP ( g_tech_ddr => c_tech_ddr, g_sim_model => g_sim, @@ -360,7 +373,7 @@ END mms_common_reg; phy4_ou => phy4_ou ); - u_diag_data_buffer ENTITY diag.mms_diag_data_buffer_dev + u_diag_data_buffer : ENTITY diag_lib.mms_diag_data_buffer_dev GENERIC MAP ( g_technology => g_technology, @@ -375,17 +388,17 @@ END mms_common_reg; g_use_steps => FALSE, g_nof_steps => c_diag_seq_rx_reg_nof_steps, g_seq_dat_w => c_data_w - ); - PORT ( + ) + PORT MAP ( -- Memory-mapped clock domain mm_rst => mm_rst, mm_clk => mm_clk, reg_data_buf_mosi => reg_data_buf_mosi, - reg_data_buf_miso => reg_data_buf_mosi, + reg_data_buf_miso => reg_data_buf_miso, ram_data_buf_mosi => ram_data_buf_mosi, - ram_data_buf_miso => ram_data_buf_mosi, + ram_data_buf_miso => ram_data_buf_miso, reg_rx_seq_mosi => reg_rx_seq_data_mosi, reg_rx_seq_miso => reg_rx_seq_data_miso, @@ -394,13 +407,13 @@ END mms_common_reg; dp_rst => st_rst, dp_clk => st_clk, - in_sync => sync, - in_sosi_arr => out_sosi_arr + in_sync => PPS, + in_sosi_arr => out_sosi_arr, out_wr_done_arr => out_wr_data_done_arr ); - u_diag_bsn_buffer ENTITY diag.mms_diag_data_buffer_dev + u_diag_bsn_buffer : ENTITY diag_lib.mms_diag_data_buffer_dev GENERIC MAP ( g_technology => g_technology, @@ -415,17 +428,17 @@ END mms_common_reg; g_use_steps => FALSE, g_nof_steps => c_diag_seq_rx_reg_nof_steps, g_seq_dat_w => c_data_w - ); - PORT ( + ) + PORT MAP ( -- Memory-mapped clock domain mm_rst => mm_rst, mm_clk => mm_clk, reg_data_buf_mosi => reg_bsn_buf_mosi, - reg_data_buf_miso => reg_bsn_buf_mosi, + reg_data_buf_miso => reg_bsn_buf_miso, ram_data_buf_mosi => ram_bsn_buf_mosi, - ram_data_buf_miso => ram_bsn_buf_mosi, + ram_data_buf_miso => ram_bsn_buf_miso, reg_rx_seq_mosi => reg_rx_seq_bsn_mosi, reg_rx_seq_miso => reg_rx_seq_bsn_miso, @@ -434,8 +447,8 @@ END mms_common_reg; dp_rst => st_rst, dp_clk => st_clk, - in_sync => sync, - in_sosi_arr => out_sosi_arr + in_sync => PPS, + in_sosi_arr => out_sosi_arr, out_wr_done_arr => out_wr_bsn_done_arr ); diff --git a/applications/lofar2/designs/lofar2_unb2c_ddrctrl/src/vhdl/mmm_lofar2_unb2c_ddrctrl.vhd b/applications/lofar2/designs/lofar2_unb2c_ddrctrl/src/vhdl/mmm_lofar2_unb2c_ddrctrl.vhd index 23e76c4efe..13605faf95 100644 --- a/applications/lofar2/designs/lofar2_unb2c_ddrctrl/src/vhdl/mmm_lofar2_unb2c_ddrctrl.vhd +++ b/applications/lofar2/designs/lofar2_unb2c_ddrctrl/src/vhdl/mmm_lofar2_unb2c_ddrctrl.vhd @@ -130,7 +130,7 @@ ENTITY mmm_lofar2_unb2c_ddrctrl IS ram_bsn_buf_mosi : OUT t_mem_mosi; ram_bsn_buf_miso : IN t_mem_miso; reg_rx_seq_bsn_mosi : OUT t_mem_mosi; - reg_rx_seq_bsn_miso : IN t_mem_miso; + reg_rx_seq_bsn_miso : IN t_mem_miso diff --git a/applications/lofar2/designs/lofar2_unb2c_ddrctrl/tb/vhdl/tb_lofar2_unb2c_ddrctrl.vhd b/applications/lofar2/designs/lofar2_unb2c_ddrctrl/tb/vhdl/tb_lofar2_unb2c_ddrctrl.vhd index 866b7d2fd6..015835d2ee 100644 --- a/applications/lofar2/designs/lofar2_unb2c_ddrctrl/tb/vhdl/tb_lofar2_unb2c_ddrctrl.vhd +++ b/applications/lofar2/designs/lofar2_unb2c_ddrctrl/tb/vhdl/tb_lofar2_unb2c_ddrctrl.vhd @@ -41,7 +41,7 @@ -- > python $UPE_GEAR/peripherals/util_ppsh.py --gn 3 -n 1 -v 5 --sim -- -LIBRARY IEEE, common_lib, unb2c_board_lib, i2c_lib; +LIBRARY IEEE, common_lib, unb2c_board_lib, i2c_lib, technology_lib, mm_lib, dp_lib, tech_ddr_lib, lofar2_sdp_lib, diag_lib; USE IEEE.std_logic_1164.ALL; USE IEEE.numeric_std.ALL; USE common_lib.common_pkg.ALL; @@ -49,6 +49,14 @@ USE unb2c_board_lib.unb2c_board_pkg.ALL; USE common_lib.tb_common_pkg.ALL; USE i2c_lib.i2c_dev_unb2_pkg.ALL; USE i2c_lib.i2c_commander_unb2_pmbus_pkg.ALL; +USE technology_lib.technology_select_pkg.ALL; +USE dp_lib.dp_stream_pkg.ALL; +USE tech_ddr_lib.tech_ddr_pkg.ALL; +USE lofar2_sdp_lib.sdp_pkg.ALL; +USE diag_lib.diag_pkg.ALL; +USE mm_lib.mm_file_pkg.ALL; +USE mm_lib.mm_file_unb_pkg.ALL; + ENTITY tb_lofar2_unb2c_ddrctrl IS GENERIC ( @@ -70,14 +78,53 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_ddrctrl IS CONSTANT c_fw_version : t_unb2c_board_fw_version := (1, 0); CONSTANT c_cable_delay : TIME := 12 ns; - CONSTANT c_eth_clk_period : TIME := 8 ns; -- 125 MHz XO on UniBoard - CONSTANT c_clk_period : TIME := 5 ns; + CONSTANT c_eth_clk_period : TIME := 8 ns; -- 125 MHz XO on UniBoardi + CONSTANT c_st_clk_period : TIME := 5 ns; -- 200 MHz st clk + CONSTANT c_tb_clk_period : TIME := 1 ns; -- 1000 MHz mm clk CONSTANT c_pps_period : NATURAL := 1000; + CONSTANT c_mm_file_reg_bsn_source_v2 : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_BSN_SOURCE_V2"; + CONSTANT c_mm_file_reg_bsn_scheduler_wg : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_BSN_SCHEDULER"; + CONSTANT c_mm_file_reg_diag_wg_wideband_arr : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_WG_WIDEBAND_ARR"; + CONSTANT c_mm_file_reg_stop_in : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_STOP_IN"; + CONSTANT c_mm_file_reg_data_buf : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_DATA_BUF"; + CONSTANT c_mm_file_ram_data_buf : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "RAM_DATA_BUF"; + CONSTANT c_mm_file_reg_rx_seq_data : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_RX_SEQ_DATA"; + CONSTANT c_mm_file_reg_bsn_buf : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_BSN_BUF"; + CONSTANT c_mm_file_ram_bsn_buf : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "RAM_BSN_BUF"; + CONSTANT c_mm_file_reg_rx_seq_bsn : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_RX_SEQ_BSN"; + + -- c_check_vector + CONSTANT c_tech_ddr : t_c_tech_ddr := c_tech_ddr4_sim_16k; + CONSTANT c_ctrl_data_w : NATURAL := func_tech_ddr_ctlr_data_w(c_tech_ddr); -- 576 + CONSTANT c_adr_w : NATURAL := func_tech_ddr_ctlr_address_w(c_tech_ddr); -- the lengt of the address vector, for simulation this is smaller, otherwise the simulation would take to long, 27 + CONSTANT c_max_adr : NATURAL := 2**(c_adr_w)-1; -- the maximal address that is possible within the address vector length + CONSTANT c_block_size : NATURAL := 1024; + CONSTANT c_nof_streams : NATURAL := 12; + CONSTANT c_data_w : NATURAL := 14; + CONSTANT c_bim : NATURAL := (c_max_adr*c_ctrl_data_w)/(c_block_size*c_nof_streams*c_data_w); -- the amount of whole blocks that fit in memory. + + + CONSTANT c_check_vector : STD_LOGIC_VECTOR(c_ctrl_data_w*c_bim*c_block_size-1 DOWNTO 0) := (OTHERS => '0'); -- the sinewave of one stream for c_bim length + + -- BSN + CONSTANT c_init_bsn : NATURAL := 17; -- some recognizable value >= 0 + CONSTANT c_nof_block_per_sync : NATURAL := 16; + CONSTANT c_nof_clk_per_sync : NATURAL := c_nof_block_per_sync * c_sdp_N_fft; + + -- WG + CONSTANT c_wg_phase : REAL := 0.0; -- WG phase in degrees + CONSTANT c_wg_freq : REAL := 160.0; -- WG freq + CONSTANT c_wg_ampl : REAL := 20.0; -- WG amplitude + CONSTANT c_bsn_start_wg : NATURAL := c_init_bsn + 2; -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values + -- DUT - SIGNAL clk : STD_LOGIC := '0'; + SIGNAL st_clk : STD_LOGIC := '0'; + SIGNAL tb_clk : STD_LOGIC := '0'; + SIGNAL tb_end : STD_LOGIC := '0'; SIGNAL pps : STD_LOGIC := '0'; SIGNAL pps_rst : STD_LOGIC := '0'; + SIGNAL rd_data : STD_LOGIC_VECTOR(32-1 DOWNTO 0) := (OTHERS => '0'); SIGNAL WDI : STD_LOGIC; SIGNAL INTA : STD_LOGIC; @@ -93,13 +140,16 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_ddrctrl IS SIGNAL qsfp_led : STD_LOGIC_VECTOR(c_unb2c_board_tr_qsfp_nof_leds-1 DOWNTO 0); + SIGNAL current_bsn_wg : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0); + + BEGIN ---------------------------------------------------------------------------- -- System setup ---------------------------------------------------------------------------- - clk <= NOT clk AFTER c_clk_period/2; -- External clock (200 MHz) - eth_clk(0) <= NOT eth_clk(0) AFTER c_eth_clk_period/2; -- Ethernet ref clock (25 MHz) + st_clk <= NOT st_clk OR tb_end AFTER c_st_clk_period/2; -- External clock (200 MHz) + eth_clk(0) <= NOT eth_clk(0) OR tb_end AFTER c_eth_clk_period/2; -- Ethernet ref clock (25 MHz) INTA <= 'H'; -- pull up INTB <= 'H'; -- pull up @@ -107,7 +157,7 @@ BEGIN ------------------------------------------------------------------------------ -- External PPS ------------------------------------------------------------------------------ - proc_common_gen_pulse(1, c_pps_period, '1', pps_rst, clk, pps); + proc_common_gen_pulse(1, c_pps_period, '1', pps_rst, st_clk, pps); ------------------------------------------------------------------------------ -- 1GbE Loopback model @@ -120,7 +170,7 @@ BEGIN ------------------------------------------------------------------------------ -- DUT ------------------------------------------------------------------------------ - u_lofar2_unb2c_ddrctrl : ENTITY work.lofar2_unb2c_ddrctrl + u_lofar2_unb2c_ddrctrl : ENTITY work.lofar2_unb2c_ddrctrl GENERIC MAP ( g_sim => c_sim, g_sim_unb_nr => c_unb_nr, @@ -129,7 +179,7 @@ BEGIN ) PORT MAP ( -- GENERAL - CLK => clk, + CLK => st_clk, PPS => pps, WDI => WDI, INTA => INTA, @@ -148,4 +198,66 @@ BEGIN QSFP_LED => qsfp_led ); + + ------------------------------------------------------------------------------ + -- MM slave accesses via file IO + ------------------------------------------------------------------------------ + tb_clk <= NOT tb_clk OR tb_end AFTER c_tb_clk_period/2; -- Testbench MM clock + + + + p_mm_stimuli : PROCESS + + VARIABLE v_bsn : NATURAL := 0; + + BEGIN + + ---------------------------------------------------------------------------- + -- Enable BSN + ---------------------------------------------------------------------------- + mmf_mm_bus_wr(c_mm_file_reg_bsn_source_v2, 2, c_init_bsn, tb_clk); -- Init BSN + mmf_mm_bus_wr(c_mm_file_reg_bsn_source_v2, 3, 0, tb_clk); -- Write high part activates the init BSN + mmf_mm_bus_wr(c_mm_file_reg_bsn_source_v2, 1, c_nof_clk_per_sync, tb_clk); -- nof_block_per_sync + mmf_mm_bus_wr(c_mm_file_reg_bsn_source_v2, 0, 16#00000003#, tb_clk); -- Enable BSN at PPS + + + + --mmf_mm_bus_rd(c_mm_file_reg_dp_selector, 0, rd_data, tb_clk); + + ---------------------------------------------------------------------------- + -- Enable and start WG + ---------------------------------------------------------------------------- + -- 0 : mode[7:0] --> off=0, calc=1, repeat=2, single=3) + -- nof_samples[31:16] --> <= c_ram_wg_size=1024 + -- 1 : phase[15:0] + -- 2 : freq[30:0] + -- 3 : ampl[16:0] + + FOR I IN 0 TO c_nof_streams-1 LOOP + mmf_mm_bus_wr(c_mm_file_reg_diag_wg_wideband_arr, (I*4)+0, 1024*2**16 + 1, tb_clk); -- nof_samples, mode calc + mmf_mm_bus_wr(c_mm_file_reg_diag_wg_wideband_arr, (I*4)+1, INTEGER(c_wg_phase), tb_clk); -- phase offset in degrees + mmf_mm_bus_wr(c_mm_file_reg_diag_wg_wideband_arr, (I*4)+2, INTEGER(c_wg_freq), tb_clk); -- freq + mmf_mm_bus_wr(c_mm_file_reg_diag_wg_wideband_arr, (I*4)+3, INTEGER(c_wg_ampl), tb_clk); -- ampl + END LOOP; + + -- Read current BSN + mmf_mm_bus_rd(c_mm_file_reg_bsn_scheduler_wg, 0, current_bsn_wg(31 DOWNTO 0), tb_clk); + mmf_mm_bus_rd(c_mm_file_reg_bsn_scheduler_wg, 1, current_bsn_wg(63 DOWNTO 32), tb_clk); + proc_common_wait_some_cycles(tb_clk, 1); + + -- Write scheduler BSN to trigger start of WG at next block + v_bsn := TO_UINT(current_bsn_wg) + 2; + ASSERT v_bsn <= c_bsn_start_wg REPORT "Too late to start WG: " & NATURAL'image(v_bsn) & " > " & NATURAL'image(c_bsn_start_wg) SEVERITY ERROR; + mmf_mm_bus_wr(c_mm_file_reg_bsn_scheduler_wg, 0, c_bsn_start_wg, tb_clk); -- first write low then high part + mmf_mm_bus_wr(c_mm_file_reg_bsn_scheduler_wg, 1, 0, tb_clk); -- assume v_bsn < 2**31-1 + + + WAIT FOR c_st_clk_period*100000; + tb_end <= '1'; + ASSERT FALSE REPORT "Test: OK" SEVERITY FAILURE; + WAIT; + END PROCESS; + + + END tb; diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd index bca85556f7..a6ed9291ac 100644 --- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd +++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd @@ -84,7 +84,7 @@ END ddrctrl; ARCHITECTURE str OF ddrctrl IS -- constant for readability - CONSTANT c_io_ddr_data_w : NATURAL := func_tech_ddr_ctlr_data_w( g_tech_ddr ); -- 576 + CONSTANT c_io_ddr_data_w : NATURAL := func_tech_ddr_ctlr_data_w(g_tech_ddr); -- 576 CONSTANT c_wr_fifo_depth : NATURAL := 256; -- defined at DDR side of the FIFO, >=16 and independent of wr burst size, default >= 256 because 32b*256 fits in 1 M9K so c_ctlr_data_w=256b will require 8 M9K CONSTANT c_rd_fifo_depth : NATURAL := 256; -- defined at DDR side of the FIFO, >=16 AND > max number of rd burst sizes (so > c_rd_fifo_af_margin), default >= 256 because 32b*256 fits in 1 M9K so c_ctlr_data_w=256b will require 8 M9K CONSTANT c_wr_fifo_uw_w : NATURAL := ceil_log2(c_wr_fifo_depth*(func_tech_ddr_ctlr_data_w(g_tech_ddr)/c_io_ddr_data_w)); diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd index bf0f59d644..cb1d0ac31d 100644 --- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd +++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd @@ -128,7 +128,8 @@ ARCHITECTURE rtl OF ddrctrl_controller IS wr_sosi : t_dp_sosi; END RECORD; - CONSTANT c_t_reg_init : t_reg := (RESET, '0', '0', TO_UVEC(g_max_adr, c_adr_w), (OTHERS => '0'), 0, '1', '1', '0', 0, (OTHERS => '0'), 0, '0', c_mem_ctlr_mosi_rst, c_dp_sosi_init); + + CONSTANT c_t_reg_init : t_reg := (RESET, '0', '0', TO_UVEC(g_max_adr, c_adr_w), (OTHERS => '0'), 0, '0', '1', '0', 0, (OTHERS => '0'), 0, '0', c_mem_ctlr_mosi_rst, c_dp_sosi_init); -- signals for readability @@ -159,6 +160,11 @@ BEGIN v.dvr_mosi.wr := '1'; v.wr_sosi.valid := '1'; + IF rst = '0' THEN + v.state := WAIT_FOR_SOP; + END IF; + + WHEN WAIT_FOR_SOP => v.dvr_mosi.burstbegin := '0'; @@ -425,14 +431,6 @@ BEGIN END IF; -- the statemachine goes to Idle when its finished or when its waiting on other components. - WHEN OTHERS => - v := c_t_reg_init; - - - END CASE; - - - IF q_reg.state = RESET OR q_reg.state = IDLE THEN IF stop_in = '1' THEN v.ready_for_set_stop := '1'; ELSIF q_reg.ready_for_set_stop = '1' AND inp_sosi.eop = '1' THEN @@ -446,7 +444,15 @@ BEGIN ELSE v.state := IDLE; END IF; - END IF; + + + + WHEN OTHERS => + v := c_t_reg_init; + + + END CASE; + IF rst = '1' THEN diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_address_counter.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_address_counter.vhd index 874e81e5ea..1854d3fd14 100644 --- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_address_counter.vhd +++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_address_counter.vhd @@ -129,10 +129,11 @@ BEGIN WHEN IDLE => - -- after a reset skip the first data block so the ddr memory can initialize. + -- after a reset wait for a sop so the memory will be filled with whole blocks. IF in_sosi.sop = '1' THEN v.bsn_passed := '1'; END IF; + v.out_sosi.valid := '0'; END CASE; -- GitLab