diff --git a/applications/lofar2/libraries/sdp/hdllib.cfg b/applications/lofar2/libraries/sdp/hdllib.cfg index 864b6aa6cf50a8286b9ba04da91560d776eb096a..06720dbf4fed95af61f17c22350b8afce784719d 100644 --- a/applications/lofar2/libraries/sdp/hdllib.cfg +++ b/applications/lofar2/libraries/sdp/hdllib.cfg @@ -10,14 +10,18 @@ synth_files = src/vhdl/sdp_subband_equalizer.vhd src/vhdl/sdp_bf_weights.vhd src/vhdl/sdp_beamformer_local.vhd + src/vhdl/sdp_info_reg.vhd + src/vhdl/sdp_info.vhd src/vhdl/sdp_beamformer_output.vhd src/vhdl/node_sdp_adc_input_and_timing.vhd src/vhdl/node_sdp_filterbank.vhd src/vhdl/node_sdp_beamformer.vhd -test_bench_files = -regression_test_vhdl = +test_bench_files = + tb/vhdl/tb_sdp_info.vhd +regression_test_vhdl = + tb/vhdl/tb_sdp_info.vhd [modelsim_project_file] diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_info.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_info.vhd new file mode 100644 index 0000000000000000000000000000000000000000..bf74d2baef718b791718f6ccc6d15138e9407959 --- /dev/null +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_info.vhd @@ -0,0 +1,114 @@ +------------------------------------------------------------------------------- +-- +-- Copyright 2020 +-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +-- +-- 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. +-- +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +-- +-- Author: P. Donker + +-- Purpose: +-- . SDP info register +-- Description: +-- +-- https://plm.astron.nl/polarion/#/project/LOFAR2System/wiki/L2%20Interface%20Control%20Documents/SC%20to%20SDP%20ICD +-- +-- Remark: +-- . +------------------------------------------------------------------------------- + +LIBRARY IEEE, common_lib, mm_lib; +USE IEEE.STD_LOGIC_1164.ALL; +USE common_lib.common_pkg.ALL; +USE common_lib.common_mem_pkg.ALL; +USE common_lib.common_field_pkg.ALL; +USE work.sdp_pkg.ALL; + +ENTITY sdp_info IS + PORT ( + -- Clocks and reset + mm_rst : IN STD_LOGIC; -- reset synchronous with mm_clk + mm_clk : IN STD_LOGIC; -- memory-mapped bus clock + + dp_clk : IN STD_LOGIC; + dp_rst : IN STD_LOGIC; + + reg_mosi : IN t_mem_mosi; + reg_miso : OUT t_mem_miso; + + -- inputs from other blocks + gn_index : IN NATURAL; + f_adc : IN STD_LOGIC; + fsub_type : IN STD_LOGIC; + + -- sdp info + sdp_info : OUT t_sdp_info + ); +END sdp_info; + + +ARCHITECTURE str OF sdp_info IS + + SIGNAL sdp_info_ro: t_sdp_info; -- ro = read only + SIGNAL block_period: STD_LOGIC_VECTOR(15 DOWNTO 0); + +BEGIN + + u_mm_fields: ENTITY work.sdp_info_reg + PORT MAP ( + + mm_clk => mm_clk, + mm_rst => mm_rst, + + dp_clk => dp_clk, + dp_rst => dp_rst, + + reg_mosi => reg_mosi, + reg_miso => reg_miso, + + -- sdp info + sdp_info_ro => sdp_info_ro, + sdp_info => sdp_info + ); + + + -- f_adc : '0' => 160M, '1' => 200M + -- fsub_type: '0' => critical sampled PFB, '1' => oversampled PFB + p_block_period : PROCESS(f_adc, fsub_type) + BEGIN + IF f_adc = '0' THEN + IF fsub_type = '0' THEN + block_period <= TO_UVEC(6400, block_period'LENGTH); -- 160M, critical sampled + ELSE + block_period <= TO_UVEC(5400, block_period'LENGTH); -- 160M, oversampled + END IF; + ELSE + IF fsub_type = '0' THEN + block_period <= TO_UVEC(5120, block_period'LENGTH); -- 200M, critical sampled + ELSE + block_period <= TO_UVEC(4320, block_period'LENGTH); -- 200M, oversampled + END IF; + END IF; + END PROCESS; + + sdp_info_ro.antenna_band_index <= '0' WHEN gn_index < c_sdp_N_pn_lb ELSE '1'; + sdp_info_ro.f_adc <= f_adc; + sdp_info_ro.fsub_type <= fsub_type; + sdp_info_ro.block_period <= block_period; + +END str; diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_info_reg.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_info_reg.vhd new file mode 100644 index 0000000000000000000000000000000000000000..bcd6e5a201e0665eca382bc41940a8684bfe3273 --- /dev/null +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_info_reg.vhd @@ -0,0 +1,141 @@ +------------------------------------------------------------------------------- +-- +-- Copyright 2020 +-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +-- +-- 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. +-- +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +-- +-- Author: P. Donker + +-- Purpose: +-- . SDP info register +-- Description: +-- +-- https://plm.astron.nl/polarion/#/project/LOFAR2System/wiki/L2%20Interface%20Control%20Documents/SC%20to%20SDP%20ICD +-- +-- Remark: +-- . +------------------------------------------------------------------------------- + +LIBRARY IEEE, common_lib, mm_lib; +USE IEEE.STD_LOGIC_1164.ALL; +USE common_lib.common_pkg.ALL; +USE common_lib.common_mem_pkg.ALL; +USE common_lib.common_field_pkg.ALL; +USE work.sdp_pkg.ALL; + +ENTITY sdp_info_reg IS + PORT ( + -- Clocks and reset + mm_rst : IN STD_LOGIC; -- reset synchronous with mm_clk + mm_clk : IN STD_LOGIC; -- memory-mapped bus clock + + dp_clk : IN STD_LOGIC; + dp_rst : IN STD_LOGIC; + + reg_mosi : IN t_mem_mosi; + reg_miso : OUT t_mem_miso; + + -- sdp info + sdp_info_ro : IN t_sdp_info; -- ro = read only + sdp_info : OUT t_sdp_info + ); +END sdp_info_reg; + + +ARCHITECTURE str OF sdp_info_reg IS + + CONSTANT c_field_arr : t_common_field_arr(13 DOWNTO 0) := + ( (field_name_pad("station_id"), "RW", 16, field_default(0)), + (field_name_pad("antenna_band_index"), "RO", 1, field_default(0)), + (field_name_pad("observation_id"), "RW", 32, field_default(0)), + (field_name_pad("nyquist_zone_index"), "RW", 2, field_default(0)), + (field_name_pad("f_adc"), "RO", 1, field_default(0)), + (field_name_pad("fsub_type"), "RO", 1, field_default(0)), + (field_name_pad("beam_repositioning_flag"), "RW", 1, field_default(0)), + (field_name_pad("subband_calibrated_flag"), "RW", 1, field_default(0)), + (field_name_pad("O_si"), "RW", 8, field_default(0)), + (field_name_pad("N_si"), "RW", 8, field_default(0)), + (field_name_pad("O_rn"), "RW", 8, field_default(0)), + (field_name_pad("N_rn"), "RW", 8, field_default(0)), + (field_name_pad("block_period"), "RO", 16, field_default(0)), + (field_name_pad("beamlet_scale"), "RW", 16, field_default(0)) ); + + SIGNAL mm_fields_in : STD_LOGIC_VECTOR(field_slv_in_len(c_field_arr)-1 DOWNTO 0); + SIGNAL mm_fields_out : STD_LOGIC_VECTOR(field_slv_out_len(c_field_arr)-1 DOWNTO 0); + + SIGNAL sdp_info_rd : t_sdp_info; + SIGNAL sdp_info_wr : t_sdp_info; + +BEGIN + + sdp_info <= sdp_info_rd; + + p_sdp_info_rd : PROCESS(sdp_info_wr, sdp_info_ro) + BEGIN + -- default write assign all fields + sdp_info_rd <= sdp_info_wr; + + -- overrule the read only fields + sdp_info_rd.antenna_band_index <= sdp_info_ro.antenna_band_index; + sdp_info_rd.f_adc <= sdp_info_ro.f_adc; + sdp_info_rd.fsub_type <= sdp_info_ro.fsub_type; + sdp_info_rd.block_period <= sdp_info_ro.block_period; + END PROCESS; + + + u_mm_fields: ENTITY mm_lib.mm_fields + GENERIC MAP( + g_use_slv_in_val => FALSE, -- use FALSE to save logic when always slv_in_val='1' + g_field_arr => c_field_arr + ) + PORT MAP ( + mm_clk => mm_clk, + mm_rst => mm_rst, + + mm_mosi => reg_mosi, + mm_miso => reg_miso, + + slv_clk => dp_clk, + slv_rst => dp_rst, + + slv_in => mm_fields_in, + slv_in_val => '1', + + slv_out => mm_fields_out + ); + + -- add "RO" fields to mm_fields + mm_fields_in(field_hi(c_field_arr, "antenna_band_index") DOWNTO field_lo(c_field_arr, "antenna_band_index")) <= slv(sdp_info_rd.antenna_band_index); + mm_fields_in(field_hi(c_field_arr, "f_adc") DOWNTO field_lo(c_field_arr, "f_adc")) <= slv(sdp_info_rd.f_adc); + mm_fields_in(field_hi(c_field_arr, "fsub_type") DOWNTO field_lo(c_field_arr, "fsub_type")) <= slv(sdp_info_rd.fsub_type); + mm_fields_in(field_hi(c_field_arr, "block_period") DOWNTO field_lo(c_field_arr, "block_period")) <= sdp_info_rd.block_period; + + -- get "RW" fields from mm_fields + sdp_info_wr.station_id <= mm_fields_out(field_hi(c_field_arr, "station_id") DOWNTO field_lo(c_field_arr, "station_id")); + sdp_info_wr.observation_id <= mm_fields_out(field_hi(c_field_arr, "observation_id") DOWNTO field_lo(c_field_arr, "observation_id")); + sdp_info_wr.nyquist_zone_index <= mm_fields_out(field_hi(c_field_arr, "nyquist_zone_index") DOWNTO field_lo(c_field_arr, "nyquist_zone_index")); + sdp_info_wr.beam_repositioning_flag <= sl(mm_fields_out(field_hi(c_field_arr, "beam_repositioning_flag") DOWNTO field_lo(c_field_arr, "beam_repositioning_flag"))); + sdp_info_wr.subband_calibrated_flag <= sl(mm_fields_out(field_hi(c_field_arr, "subband_calibrated_flag") DOWNTO field_lo(c_field_arr, "subband_calibrated_flag"))); + sdp_info_wr.O_si <= mm_fields_out(field_hi(c_field_arr, "O_si") DOWNTO field_lo(c_field_arr, "O_si")); + sdp_info_wr.N_si <= mm_fields_out(field_hi(c_field_arr, "N_si") DOWNTO field_lo(c_field_arr, "N_si")); + sdp_info_wr.O_rn <= mm_fields_out(field_hi(c_field_arr, "O_rn") DOWNTO field_lo(c_field_arr, "O_rn")); + sdp_info_wr.N_rn <= mm_fields_out(field_hi(c_field_arr, "N_rn") DOWNTO field_lo(c_field_arr, "N_rn")); + sdp_info_wr.beamlet_scale <= mm_fields_out(field_hi(c_field_arr, "beamlet_scale") DOWNTO field_lo(c_field_arr, "beamlet_scale")); + +END str; diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd index 3977e21a40a61fb9dd378e2a91ff1eec711e7b61..eceaf45bc6411570c44c6bb178b8b8504b2e1061 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd @@ -85,7 +85,8 @@ PACKAGE sdp_pkg is CONSTANT c_sdp_W_beamlet_sum : NATURAL := 18; CONSTANT c_sdp_W_beamlet : NATURAL := 8; CONSTANT c_sdp_W_beamlet_scale : NATURAL := 16; - CONSTANT c_sdp_W_gn_id : NATURAL := 5; + CONSTANT c_sdp_W_gn_id : NATURAL := 5; + CONSTANT c_sdp_N_pn_lb : NATURAL := 16; -- AIT constants CONSTANT c_sdp_ait_buf_nof_data_jesd : NATURAL := 1024; -- 1024 14 bit samples fit in one M20k BRAM diff --git a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_info.vhd b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_info.vhd new file mode 100644 index 0000000000000000000000000000000000000000..2f691bdbcdd74a93cb43dd6db278bf85d1fcab60 --- /dev/null +++ b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_info.vhd @@ -0,0 +1,272 @@ +------------------------------------------------------------------------------- +-- +-- Copyright 2020 +-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +-- +-- 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. +-- +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +-- +-- Author: P. Donker + +-- Purpose: +-- . test bench for sdp_info.vhd (and sdp_info_reg.vhd) +-- Description: +-- +-- https://plm.astron.nl/polarion/#/project/LOFAR2System/workitem?id=LOFAR2-9258 +-- https://plm.astron.nl/polarion/#/project/LOFAR2System/workitem?id=LOFAR2-8855 +-- +-- Remark: +-- . +------------------------------------------------------------------------------- + +LIBRARY IEEE, common_lib; +USE IEEE.STD_LOGIC_1164.ALL; +USE common_lib.common_pkg.ALL; +USE common_lib.common_mem_pkg.ALL; +USE common_lib.tb_common_pkg.ALL; +USE common_lib.tb_common_mem_pkg.ALL; +USE work.sdp_pkg.ALL; + + +ENTITY tb_sdp_info IS +END tb_sdp_info; + +ARCHITECTURE tb OF tb_sdp_info IS + CONSTANT c_dp_clk_period : TIME := 5 ns; -- 200 MHz + CONSTANT c_mm_clk_period : TIME := 20 ns; -- 50 MHz + + CONSTANT c_cross_clock_domain_latency : NATURAL := 20; + + -- used mm_adresses on mm bus + CONSTANT c_mm_addr_beamlet_scale : NATURAL := 0; + CONSTANT c_mm_addr_block_period : NATURAL := 1; + CONSTANT c_mm_addr_N_rn : NATURAL := 2; + CONSTANT c_mm_addr_O_rn : NATURAL := 3; + CONSTANT c_mm_addr_N_si : NATURAL := 4; + CONSTANT c_mm_addr_O_si : NATURAL := 5; + CONSTANT c_mm_addr_subband_calibrated_flag : NATURAL := 6; + CONSTANT c_mm_addr_beam_repositioning_flag : NATURAL := 7; + CONSTANT c_mm_addr_fsub_type : NATURAL := 8; + CONSTANT c_mm_addr_f_adc : NATURAL := 9; + CONSTANT c_mm_addr_nyquist_zone_index : NATURAL := 10; + CONSTANT c_mm_addr_observation_id : NATURAL := 11; + CONSTANT c_mm_addr_antenna_band_index : NATURAL := 12; + CONSTANT c_mm_addr_station_id : NATURAL := 13; + + SIGNAL tb_end : STD_LOGIC := '0'; + SIGNAL tb_mm_reg_end : STD_LOGIC := '0'; + + SIGNAL dp_clk : STD_LOGIC := '1'; -- digital data path clock = 200 MHz (deser factor 4); + SIGNAL dp_rst : STD_LOGIC; + + SIGNAL mm_clk : STD_LOGIC := '1'; -- MM control clock = 50 MHz + SIGNAL mm_rst : STD_LOGIC; + + SIGNAL reg_mosi : t_mem_mosi := c_mem_mosi_rst; + SIGNAL reg_miso : t_mem_miso; + + -- signals used to change settings of sdp_info + SIGNAL gn_index : NATURAL := 15; + SIGNAL f_adc : STD_LOGIC := '0'; + SIGNAL fsub_type : STD_LOGIC := '0'; + + SIGNAL sdp_info : t_sdp_info; + + -- signals used for response of mm bus + SIGNAL mm_natural_response : NATURAL; +BEGIN + dp_rst <= '1', '0' AFTER c_dp_clk_period*7; + dp_clk <= (NOT dp_clk) OR tb_end AFTER c_dp_clk_period/2; + + mm_rst <= '1', '0' AFTER c_mm_clk_period*7; + mm_clk <= (NOT mm_clk) OR tb_end AFTER c_mm_clk_period/2; + + p_mm_reg_stimuli : PROCESS + BEGIN + reg_mosi <= c_mem_mosi_rst; + + -- initialyze + proc_common_wait_until_low(mm_clk, mm_rst); + proc_common_wait_some_cycles(mm_clk, 100); + + -- default all register hold value 0, try to write 1 in all registers + proc_mem_mm_bus_wr(c_mm_addr_beamlet_scale ,10 ,mm_clk, reg_miso, reg_mosi); + proc_mem_mm_bus_wr(c_mm_addr_block_period ,11 ,mm_clk, reg_miso, reg_mosi); -- RO + proc_mem_mm_bus_wr(c_mm_addr_N_rn ,12 ,mm_clk, reg_miso, reg_mosi); + proc_mem_mm_bus_wr(c_mm_addr_O_rn ,13 ,mm_clk, reg_miso, reg_mosi); + proc_mem_mm_bus_wr(c_mm_addr_N_si ,14 ,mm_clk, reg_miso, reg_mosi); + proc_mem_mm_bus_wr(c_mm_addr_O_si ,15 ,mm_clk, reg_miso, reg_mosi); + proc_mem_mm_bus_wr(c_mm_addr_subband_calibrated_flag,1 ,mm_clk, reg_miso, reg_mosi); + proc_mem_mm_bus_wr(c_mm_addr_beam_repositioning_flag,1 ,mm_clk, reg_miso, reg_mosi); + proc_mem_mm_bus_wr(c_mm_addr_fsub_type ,1 ,mm_clk, reg_miso, reg_mosi); -- RO + proc_mem_mm_bus_wr(c_mm_addr_f_adc ,1 ,mm_clk, reg_miso, reg_mosi); -- RO + proc_mem_mm_bus_wr(c_mm_addr_nyquist_zone_index ,3 ,mm_clk, reg_miso, reg_mosi); + proc_mem_mm_bus_wr(c_mm_addr_observation_id ,16 ,mm_clk, reg_miso, reg_mosi); + proc_mem_mm_bus_wr(c_mm_addr_antenna_band_index ,1 ,mm_clk, reg_miso, reg_mosi); -- RO + proc_mem_mm_bus_wr(c_mm_addr_station_id ,17 ,mm_clk, reg_miso, reg_mosi); + proc_common_wait_some_cycles(mm_clk, c_cross_clock_domain_latency); + + proc_mem_mm_bus_rd(c_mm_addr_beamlet_scale, mm_clk, reg_mosi); proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk); + mm_natural_response <= TO_UINT(reg_miso.rddata); proc_common_wait_some_cycles(mm_clk, 1); + ASSERT mm_natural_response = 10 REPORT "wrong beamlet_scale" SEVERITY ERROR; + + proc_mem_mm_bus_rd(c_mm_addr_block_period, mm_clk, reg_mosi); proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk); + mm_natural_response <= TO_UINT(reg_miso.rddata); proc_common_wait_some_cycles(mm_clk, 1); + ASSERT mm_natural_response /= 11 REPORT "wrong block_period (not read only)" SEVERITY ERROR; + + proc_mem_mm_bus_rd(c_mm_addr_N_rn, mm_clk, reg_mosi); proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk); + mm_natural_response <= TO_UINT(reg_miso.rddata); proc_common_wait_some_cycles(mm_clk, 1); + ASSERT mm_natural_response = 12 REPORT "wrong N_rn" SEVERITY ERROR; + + proc_mem_mm_bus_rd(c_mm_addr_O_rn, mm_clk, reg_mosi); proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk); + mm_natural_response <= TO_UINT(reg_miso.rddata); proc_common_wait_some_cycles(mm_clk, 1); + ASSERT mm_natural_response = 13 REPORT "wrong O_rn" SEVERITY ERROR; + + proc_mem_mm_bus_rd(c_mm_addr_N_si, mm_clk, reg_mosi); proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk); + mm_natural_response <= TO_UINT(reg_miso.rddata); proc_common_wait_some_cycles(mm_clk, 1); + ASSERT mm_natural_response = 14 REPORT "wrong N_si" SEVERITY ERROR; + + proc_mem_mm_bus_rd(c_mm_addr_O_si, mm_clk, reg_mosi); proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk); + mm_natural_response <= TO_UINT(reg_miso.rddata); proc_common_wait_some_cycles(mm_clk, 1); + ASSERT mm_natural_response = 15 REPORT "wrong O_si" SEVERITY ERROR; + + proc_mem_mm_bus_rd(c_mm_addr_subband_calibrated_flag, mm_clk, reg_mosi); proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk); + mm_natural_response <= TO_UINT(reg_miso.rddata); proc_common_wait_some_cycles(mm_clk, 1); + ASSERT mm_natural_response = 1 REPORT "wrong subband_calibrated_flag" SEVERITY ERROR; + + proc_mem_mm_bus_rd(c_mm_addr_beam_repositioning_flag, mm_clk, reg_mosi); proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk); + mm_natural_response <= TO_UINT(reg_miso.rddata); proc_common_wait_some_cycles(mm_clk, 1); + ASSERT mm_natural_response = 1 REPORT "wrong beam_repositioning_flag" SEVERITY ERROR; + + proc_mem_mm_bus_rd(c_mm_addr_fsub_type, mm_clk, reg_mosi); proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk); + mm_natural_response <= TO_UINT(reg_miso.rddata); proc_common_wait_some_cycles(mm_clk, 1); + ASSERT mm_natural_response /= 1 REPORT "wrong fsub_type (not read only)" SEVERITY ERROR; + + proc_mem_mm_bus_rd(c_mm_addr_f_adc, mm_clk, reg_mosi); proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk); + mm_natural_response <= TO_UINT(reg_miso.rddata); proc_common_wait_some_cycles(mm_clk, 1); + ASSERT mm_natural_response /= 1 REPORT "wrong f_adc (not read only)" SEVERITY ERROR; + + proc_mem_mm_bus_rd(c_mm_addr_nyquist_zone_index, mm_clk, reg_mosi); proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk); + mm_natural_response <= TO_UINT(reg_miso.rddata); proc_common_wait_some_cycles(mm_clk, 1); + ASSERT mm_natural_response = 3 REPORT "wrong nyquist_zone_index" SEVERITY ERROR; + + proc_mem_mm_bus_rd(c_mm_addr_observation_id, mm_clk, reg_mosi); proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk); + mm_natural_response <= TO_UINT(reg_miso.rddata); proc_common_wait_some_cycles(mm_clk, 1); + ASSERT mm_natural_response = 16 REPORT "wrong observation_id" SEVERITY ERROR; + + proc_mem_mm_bus_rd(c_mm_addr_antenna_band_index, mm_clk, reg_mosi); proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk); + mm_natural_response <= TO_UINT(reg_miso.rddata); proc_common_wait_some_cycles(mm_clk, 1); + ASSERT mm_natural_response /= 1 REPORT "wrong antenna_band_index (not read only)" SEVERITY ERROR; + + proc_mem_mm_bus_rd(c_mm_addr_station_id, mm_clk, reg_mosi); proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk); + mm_natural_response <= TO_UINT(reg_miso.rddata); proc_common_wait_some_cycles(mm_clk, 1); + ASSERT mm_natural_response = 17 REPORT "wrong station_id" SEVERITY ERROR; + + -- check if antenna_band_index is changed on change of gn_index + -- '0' <= 16, '1' > 16 + gn_index <= 32; + proc_common_wait_some_cycles(mm_clk, c_cross_clock_domain_latency); + proc_mem_mm_bus_rd(c_mm_addr_antenna_band_index, mm_clk, reg_mosi); proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk); + mm_natural_response <= TO_UINT(reg_miso.rddata); proc_common_wait_some_cycles(mm_clk, 1); + ASSERT mm_natural_response = 1 REPORT "wrong antenna_band_index" SEVERITY ERROR; + + -- check block_period if f_adc and fsub_type are changed + -- f_adc = '0' and fsub_type = '0' => block_period = 6400 + -- f_adc = '1' and fsub_type = '0' => block_period = 5120 + -- f_adc = '0' and fsub_type = '1' => block_period = 5400 + -- f_adc = '1' and fsub_type = '1' => block_period = 4320 + f_adc <= '0'; fsub_type <= '0'; + proc_common_wait_some_cycles(mm_clk, c_cross_clock_domain_latency); + proc_mem_mm_bus_rd(c_mm_addr_block_period, mm_clk, reg_mosi); + proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk); + mm_natural_response <= TO_UINT(reg_miso.rddata(15 DOWNTO 0)); + proc_common_wait_some_cycles(mm_clk, 1); + ASSERT mm_natural_response = 6400 REPORT "wrong block_period, expected 6400" SEVERITY ERROR; + f_adc <= '1'; fsub_type <= '0'; + proc_common_wait_some_cycles(mm_clk, c_cross_clock_domain_latency); + proc_mem_mm_bus_rd(c_mm_addr_block_period, mm_clk, reg_mosi); + proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk); + mm_natural_response <= TO_UINT(reg_miso.rddata(15 DOWNTO 0)); + proc_common_wait_some_cycles(mm_clk, 1); + ASSERT mm_natural_response = 5120 REPORT "wrong block_period, expected 5120" SEVERITY ERROR; + f_adc <= '0'; fsub_type <= '1'; + proc_common_wait_some_cycles(mm_clk, c_cross_clock_domain_latency); + proc_mem_mm_bus_rd(c_mm_addr_block_period, mm_clk, reg_mosi); + proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk); + mm_natural_response <= TO_UINT(reg_miso.rddata(15 DOWNTO 0)); + proc_common_wait_some_cycles(mm_clk, 1); + ASSERT mm_natural_response = 5400 REPORT "wrong block_period, expected 5400" SEVERITY ERROR; + f_adc <= '1'; fsub_type <= '1'; + proc_common_wait_some_cycles(mm_clk, c_cross_clock_domain_latency); + proc_mem_mm_bus_rd(c_mm_addr_block_period, mm_clk, reg_mosi); + proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, mm_clk); + mm_natural_response <= TO_UINT(reg_miso.rddata(15 DOWNTO 0)); + proc_common_wait_some_cycles(mm_clk, 1); + ASSERT mm_natural_response = 4320 REPORT "wrong block_period, expected 4320" SEVERITY ERROR; + + proc_common_wait_some_cycles(mm_clk, 100); + tb_mm_reg_end <= '1'; + WAIT; + + END PROCESS; + + -- check if values in sdp_info match with expected values + p_sdp_info_stimuli : PROCESS + BEGIN + proc_common_wait_until_high(mm_clk, tb_mm_reg_end); -- wait for p_mm_reg_stimuli done + + ASSERT TO_UINT(sdp_info.beamlet_scale) = 10 REPORT "wrong sdp_info.beamlet_scale value" SEVERITY ERROR; + ASSERT TO_UINT(sdp_info.block_period) = 4320 REPORT "wrong sdp_info.block_period value" SEVERITY ERROR; + ASSERT TO_UINT(sdp_info.N_rn) = 12 REPORT "wrong sdp_info.N_rn value" SEVERITY ERROR; + ASSERT TO_UINT(sdp_info.O_rn) = 13 REPORT "wrong sdp_info.O_rn value" SEVERITY ERROR; + ASSERT TO_UINT(sdp_info.N_si) = 14 REPORT "wrong sdp_info.N_si value" SEVERITY ERROR; + ASSERT TO_UINT(sdp_info.O_si) = 15 REPORT "wrong sdp_info.O_si value" SEVERITY ERROR; + ASSERT sdp_info.subband_calibrated_flag = '1' REPORT "wrong sdp_info.subband_calibrated_flag value" SEVERITY ERROR; + ASSERT sdp_info.beam_repositioning_flag = '1' REPORT "wrong sdp_info.beam_repositioning_flag value" SEVERITY ERROR; + ASSERT sdp_info.fsub_type = '1' REPORT "wrong sdp_info.fsub_type value" SEVERITY ERROR; + ASSERT sdp_info.f_adc = '1' REPORT "wrong sdp_info.f_adc value" SEVERITY ERROR; + ASSERT TO_UINT(sdp_info.nyquist_zone_index) = 3 REPORT "wrong sdp_info.nyquist_zone_index value" SEVERITY ERROR; + ASSERT TO_UINT(sdp_info.observation_id) = 16 REPORT "wrong sdp_info.observation_id value" SEVERITY ERROR; + ASSERT sdp_info.antenna_band_index = '1' REPORT "wrong sdp_info.antenna_band_index value" SEVERITY ERROR; + ASSERT TO_UINT(sdp_info.station_id) = 17 REPORT "wrong sdp_info.station_id value" SEVERITY ERROR; + + proc_common_wait_some_cycles(mm_clk, 100); + tb_end <= '1'; + WAIT; + END PROCESS; + + + -- SDP info + u_dut: ENTITY work.sdp_info + PORT MAP ( + mm_clk => mm_clk, + mm_rst => mm_rst, + + dp_clk => dp_clk, + dp_rst => dp_rst, + + reg_mosi => reg_mosi, + reg_miso => reg_miso, + + gn_index => gn_index, + f_adc => f_adc, + fsub_type => fsub_type, + + sdp_info => sdp_info + ); + +END tb; \ No newline at end of file