Skip to content
Snippets Groups Projects
Commit 41eb7c55 authored by Reinier van der Walle's avatar Reinier van der Walle
Browse files

inital commit of dp_block_validate_channel and its TBs

parent aec420dc
No related branches found
No related tags found
1 merge request!125inital commit of dp_block_validate_channel and its TBs
......@@ -31,6 +31,7 @@ synth_files =
src/vhdl/dp_pipeline_ready.vhd
src/vhdl/dp_block_resize.vhd
src/vhdl/dp_block_select.vhd
src/vhdl/dp_block_validate_channel.vhd
src/vhdl/mms_dp_block_select.vhd
src/vhdl/dp_force_data_parallel.vhd
src/vhdl/mms_dp_force_data_parallel.vhd
......@@ -198,6 +199,7 @@ test_bench_files =
tb/vhdl/tb_dp_block_gen.vhd
tb/vhdl/tb_dp_block_gen_valid_arr.vhd
tb/vhdl/tb_dp_block_from_mm.vhd
tb/vhdl/tb_dp_block_validate_channel.vhd
tb/vhdl/tb_dp_bsn_align.vhd
tb/vhdl/tb_mms_dp_bsn_align.vhd
tb/vhdl/tb_dp_bsn_monitor.vhd
......@@ -277,6 +279,7 @@ test_bench_files =
tb/vhdl/tb_tb_dp_block_gen.vhd
tb/vhdl/tb_tb_dp_block_gen_valid_arr.vhd
tb/vhdl/tb_tb_dp_block_from_mm.vhd
tb/vhdl/tb_tb_dp_block_validate_channel.vhd
tb/vhdl/tb_tb_dp_bsn_align.vhd
tb/vhdl/tb_tb_dp_bsn_source_v2.vhd
tb/vhdl/tb_tb_dp_concat.vhd
......@@ -342,6 +345,7 @@ regression_test_vhdl =
tb/vhdl/tb_tb_dp_block_gen.vhd
tb/vhdl/tb_tb_dp_block_gen_valid_arr.vhd
tb/vhdl/tb_tb_dp_block_from_mm.vhd
tb/vhdl/tb_tb_dp_block_validate_channel.vhd
tb/vhdl/tb_tb_dp_bsn_align.vhd
tb/vhdl/tb_tb_dp_bsn_source_v2.vhd
tb/vhdl/tb_tb_dp_concat.vhd
......
-------------------------------------------------------------------------------
--
-- Copyright 2021
-- 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: R vd Walle
-- Purpose:
-- The dp_block_validate_channel.vhd can remove a block of data from a
-- multiplexed in_sosi stream based on the in_sosi.channel field.
-- If in_sosi.channel = g_remove_channel, then the in_sosi is passed on to
-- remove_sosi and not passed on to keep_sosi, else vice versa.
-- Other modes can be selected by setting g_mode. g_mode options are:
-- . "=" which removes all blocks with channel = g_remove_channel
-- . "<" which removes all blocks with channel < g_remove_channel
-- . ">" which removes all blocks with channel > g_remove_channel
-- Remarks:
LIBRARY IEEE, common_lib;
USE IEEE.std_logic_1164.all;
USE IEEE.numeric_std.all;
USE work.dp_stream_pkg.ALL;
USE common_lib.common_pkg.ALL;
USE common_lib.common_mem_pkg.ALL;
ENTITY dp_block_validate_channel IS
GENERIC (
g_remove_channel : NATURAL := 0;
g_mode : STRING := "=" -- can be "=", "<", ">"
);
PORT (
dp_rst : IN STD_LOGIC;
dp_clk : IN STD_LOGIC;
-- ST sink
in_sosi : IN t_dp_sosi;
-- ST source
out_keep_sosi : OUT t_dp_sosi;
out_remove_sosi : OUT t_dp_sosi
);
END dp_block_validate_channel;
ARCHITECTURE rtl OF dp_block_validate_channel IS
SIGNAL remove_blk : STD_LOGIC;
SIGNAL remove_blk_reg : STD_LOGIC := '0';
SIGNAL remove_sosi : t_dp_sosi;
SIGNAL keep_sosi : t_dp_sosi;
BEGIN
ASSERT g_mode = "=" OR g_mode = "<" OR g_mode = ">" REPORT "g_mode must be one of three options: '=', '<' or '>'" SEVERITY ERROR;
gen_equal : IF g_mode = "=" GENERATE -- remove all blocks with ch = g_remove_channel
remove_blk <= remove_blk_reg WHEN in_sosi.sop = '0' ELSE
'1' WHEN TO_UINT(in_sosi.channel) = g_remove_channel ELSE '0';
END GENERATE;
gen_smaller : IF g_mode = "<" GENERATE -- remove all blocks with ch < g_remove_channel
remove_blk <= remove_blk_reg WHEN in_sosi.sop = '0' ELSE
'1' WHEN TO_UINT(in_sosi.channel) < g_remove_channel ELSE '0';
END GENERATE;
gen_larger : IF g_mode = ">" GENERATE -- remove all blocks with ch > g_remove_channel
remove_blk <= remove_blk_reg WHEN in_sosi.sop = '0' ELSE
'1' WHEN TO_UINT(in_sosi.channel) > g_remove_channel ELSE '0';
END GENERATE;
p_dp_clk : PROCESS(dp_rst, dp_clk)
BEGIN
IF dp_rst='1' THEN
remove_blk_reg <= '0';
ELSIF rising_edge(dp_clk) THEN
remove_blk_reg <= remove_blk;
END IF;
END PROCESS;
p_sosi : PROCESS(in_sosi, remove_blk)
BEGIN
-- sosi that contains the removed blocks
remove_sosi <= in_sosi;
remove_sosi.valid <= in_sosi.valid AND remove_blk;
remove_sosi.sop <= in_sosi.sop AND remove_blk;
remove_sosi.eop <= in_sosi.eop AND remove_blk;
remove_sosi.sync <= in_sosi.sync AND remove_blk;
-- sosi that contains the all but the removed blocks
keep_sosi <= in_sosi;
keep_sosi.valid <= in_sosi.valid AND NOT remove_blk;
keep_sosi.sop <= in_sosi.sop AND NOT remove_blk;
keep_sosi.eop <= in_sosi.eop AND NOT remove_blk;
keep_sosi.sync <= in_sosi.sync AND NOT remove_blk;
END PROCESS;
u_pipe_remove : ENTITY work.dp_pipeline
GENERIC MAP (
g_pipeline => 1 -- 0 for wires, > 0 for registers,
)
PORT MAP (
rst => dp_rst,
clk => dp_clk,
-- ST sink
snk_in => remove_sosi,
-- ST source
src_out => out_remove_sosi
);
u_pipe_keep : ENTITY work.dp_pipeline
GENERIC MAP (
g_pipeline => 1 -- 0 for wires, > 0 for registers,
)
PORT MAP (
rst => dp_rst,
clk => dp_clk,
-- ST sink
snk_in => keep_sosi,
-- ST source
src_out => out_keep_sosi
);
END rtl;
-------------------------------------------------------------------------------
--
-- Copyright 2021
-- 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: R vd Walle
-- Purpose:
-- Test bench for dp_block_validate_channel.
-- Description:
-- Verifies the output sosi of the DUT with the expected sosi.
-- The TB also reads the register values via MM and verifies them against the
-- expected values.
-- Usage:
-- . as 5
-- . run -all
LIBRARY IEEE, common_lib;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL;
USE common_lib.common_pkg.ALL;
USE common_lib.common_mem_pkg.ALL;
USE common_lib.tb_common_mem_pkg.ALL;
USE common_lib.common_str_pkg.ALL;
USE common_lib.common_lfsr_sequences_pkg.ALL;
USE common_lib.tb_common_pkg.ALL;
USE work.dp_stream_pkg.ALL;
USE work.tb_dp_pkg.ALL;
ENTITY tb_dp_block_validate_channel IS
GENERIC (
g_nof_blocks_per_sync : NATURAL := 8;
g_nof_data_per_blk : NATURAL := 8;
g_gap_size : NATURAL := 5;
g_remove_channel : NATURAL := 0;
g_mode : STRING := "="
);
END tb_dp_block_validate_channel;
ARCHITECTURE tb OF tb_dp_block_validate_channel IS
------------------------------------------------------------------------------
-- Clock & reset
------------------------------------------------------------------------------
CONSTANT c_dp_clk_period : TIME := 5 ns;
CONSTANT c_mm_clk_period : TIME := 10 ns;
CONSTANT c_dut_pipeline : NATURAL := 1;
CONSTANT c_nof_sync : NATURAL := 5;
CONSTANT c_nof_blk : NATURAL := g_nof_blocks_per_sync * c_nof_sync;
SIGNAL dp_clk : STD_LOGIC := '1';
SIGNAL rst : STD_LOGIC := '1';
SIGNAL tb_end : STD_LOGIC := '0';
SIGNAL stimuli_end : STD_LOGIC;
SIGNAL stimuli_sosi : t_dp_sosi;
SIGNAL stimuli_siso : t_dp_siso := c_dp_siso_rdy;
SIGNAL keep_sosi : t_dp_sosi;
SIGNAL remove_sosi : t_dp_sosi;
SIGNAL reference_sosi : t_dp_sosi;
SIGNAL reference_siso : t_dp_siso := c_dp_siso_rdy;
BEGIN
------------------------------------------------------------------------------
-- Clock & reset
------------------------------------------------------------------------------
dp_clk <= (NOT dp_clk) OR tb_end AFTER c_dp_clk_period/2;
rst <= '1', '0' AFTER c_dp_clk_period*7;
------------------------------------------------------------------------------
-- Stimuli:
------------------------------------------------------------------------------
-- Generate snk_in with data frames
u_stimuli : ENTITY work.dp_stream_stimuli
GENERIC MAP (
g_sync_period => g_nof_blocks_per_sync,
g_nof_repeat => g_nof_blocks_per_sync * c_nof_sync,
g_pkt_len => g_nof_data_per_blk,
g_pkt_gap => g_gap_size
)
PORT MAP (
rst => rst,
clk => dp_clk,
-- Generate stimuli
src_in => stimuli_siso,
src_out => stimuli_sosi,
-- End of stimuli
tb_end => stimuli_end
);
------------------------------------------------------------------------------
-- DUT
------------------------------------------------------------------------------
u_dut : ENTITY work.dp_block_validate_channel
GENERIC MAP (
g_remove_channel => g_remove_channel,
g_mode => g_mode
)
PORT MAP (
dp_rst => rst,
dp_clk => dp_clk,
-- ST sink
in_sosi => stimuli_sosi,
-- ST source
out_keep_sosi => keep_sosi,
out_remove_sosi => remove_sosi
);
------------------------------------------------------------------------------
-- Verification
------------------------------------------------------------------------------
u_pipeline : ENTITY work.dp_pipeline
GENERIC MAP (
g_pipeline => c_dut_pipeline
)
PORT MAP (
rst => rst,
clk => dp_clk,
-- ST sink
snk_out => OPEN,
snk_in => stimuli_sosi,
-- ST source
src_in => reference_siso,
src_out => reference_sosi
);
p_verify : PROCESS(dp_clk)
BEGIN
IF rising_edge(dp_clk) THEN
IF reference_sosi.valid = '1' THEN
IF TO_UINT(reference_sosi.channel) = g_remove_channel AND g_mode = "=" THEN
ASSERT remove_sosi = reference_sosi REPORT "remove_sosi does not contain removed block!" SEVERITY ERROR;
ASSERT keep_sosi.valid = '0' REPORT "Wrong, removed block occurs in keep_sosi!" SEVERITY ERROR;
ASSERT keep_sosi.sop = '0' REPORT "Wrong, removed block occurs in keep_sosi!" SEVERITY ERROR;
ASSERT keep_sosi.eop = '0' REPORT "Wrong, removed block occurs in keep_sosi!" SEVERITY ERROR;
ELSIF g_mode = "=" THEN
ASSERT keep_sosi = reference_sosi REPORT "No block in keep_sosi" SEVERITY ERROR;
ASSERT remove_sosi.valid = '0' REPORT "Wrong, block occurs in remove_sosi which is unexpected!" SEVERITY ERROR;
ASSERT remove_sosi.sop = '0' REPORT "Wrong, block occurs in remove_sosi which is unexpected!" SEVERITY ERROR;
ASSERT remove_sosi.eop = '0' REPORT "Wrong, block occurs in remove_sosi which is unexpected!" SEVERITY ERROR;
ELSIF TO_UINT(reference_sosi.channel) < g_remove_channel AND g_mode = "<" THEN
ASSERT remove_sosi = reference_sosi REPORT "remove_sosi does not contain removed block!" SEVERITY ERROR;
ASSERT keep_sosi.valid = '0' REPORT "Wrong, removed block occurs in keep_sosi!" SEVERITY ERROR;
ASSERT keep_sosi.sop = '0' REPORT "Wrong, removed block occurs in keep_sosi!" SEVERITY ERROR;
ASSERT keep_sosi.eop = '0' REPORT "Wrong, removed block occurs in keep_sosi!" SEVERITY ERROR;
ELSIF g_mode = "<" THEN
ASSERT keep_sosi = reference_sosi REPORT "No block in keep_sosi" SEVERITY ERROR;
ASSERT remove_sosi.valid = '0' REPORT "Wrong, block occurs in remove_sosi which is unexpected!" SEVERITY ERROR;
ASSERT remove_sosi.sop = '0' REPORT "Wrong, block occurs in remove_sosi which is unexpected!" SEVERITY ERROR;
ASSERT remove_sosi.eop = '0' REPORT "Wrong, block occurs in remove_sosi which is unexpected!" SEVERITY ERROR;
ELSIF TO_UINT(reference_sosi.channel) > g_remove_channel AND g_mode = ">" THEN
ASSERT remove_sosi = reference_sosi REPORT "remove_sosi does not contain removed block!" SEVERITY ERROR;
ASSERT keep_sosi.valid = '0' REPORT "Wrong, removed block occurs in keep_sosi!" SEVERITY ERROR;
ASSERT keep_sosi.sop = '0' REPORT "Wrong, removed block occurs in keep_sosi!" SEVERITY ERROR;
ASSERT keep_sosi.eop = '0' REPORT "Wrong, removed block occurs in keep_sosi!" SEVERITY ERROR;
ELSIF g_mode = ">" THEN
ASSERT keep_sosi = reference_sosi REPORT "No block in keep_sosi" SEVERITY ERROR;
ASSERT remove_sosi.valid = '0' REPORT "Wrong, block occurs in remove_sosi which is unexpected!" SEVERITY ERROR;
ASSERT remove_sosi.sop = '0' REPORT "Wrong, block occurs in remove_sosi which is unexpected!" SEVERITY ERROR;
ASSERT remove_sosi.eop = '0' REPORT "Wrong, block occurs in remove_sosi which is unexpected!" SEVERITY ERROR;
END IF;
END IF;
END IF;
END PROCESS;
tb_end <= '0', stimuli_end AFTER (1 + 10*c_dut_pipeline)*c_dp_clk_period;
END tb;
-------------------------------------------------------------------------------
--
-- Copyright 2021
-- 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: R vd Walle
-- Purpose:
-- Verify multiple variations of tb_dp_block_validate_channel
-- Usage:
-- > as 3
-- > run -all
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY tb_tb_dp_block_validate_channel IS
END tb_tb_dp_block_validate_channel;
ARCHITECTURE tb OF tb_tb_dp_block_validate_channel IS
SIGNAL tb_end : STD_LOGIC := '0'; -- declare tb_end to avoid 'No objects found' error on 'when -label tb_end'
CONSTANT c_blk_per_sync : NATURAL := 5;
CONSTANT c_data_per_blk : NATURAL := 9;
CONSTANT c_gap_size : NATURAL := 5;
BEGIN
-- g_nof_blocks_per_sync : NATURAL := 8;
-- g_nof_data_per_blk : NATURAL := 8;
-- g_gap_size : NATURAL := 5;
-- g_remove_channel : NATURAL := 0;
-- g_mode : STRING := "="
u_equal : ENTITY work.tb_dp_block_validate_channel GENERIC MAP(c_blk_per_sync, c_data_per_blk, c_gap_size, 7, "=");
u_smaller : ENTITY work.tb_dp_block_validate_channel GENERIC MAP(c_blk_per_sync, c_data_per_blk, c_gap_size, 7, "<");
u_greater : ENTITY work.tb_dp_block_validate_channel GENERIC MAP(c_blk_per_sync, c_data_per_blk, c_gap_size, 7, ">");
END tb;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment