Skip to content
Snippets Groups Projects
Commit 4ab0d08d authored by Pieter Donker's avatar Pieter Donker Committed by Eric Kooistra
Browse files

Resolve L2SDP-128

parent efbb7c16
No related branches found
No related tags found
1 merge request!100Removed text for XSub that is now written in Confluence Subband correlator...
......@@ -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]
......
-------------------------------------------------------------------------------
--
-- 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;
-------------------------------------------------------------------------------
--
-- 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;
......@@ -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
......
-------------------------------------------------------------------------------
--
-- 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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment