diff --git a/libraries/base/diag/hdllib.cfg b/libraries/base/diag/hdllib.cfg index 06595cdf39a97e375a4ad0d80c30add886130538..6976c4da96ea3f03cd2624952b9bc8b407d7e8ea 100644 --- a/libraries/base/diag/hdllib.cfg +++ b/libraries/base/diag/hdllib.cfg @@ -28,7 +28,7 @@ synth_files = $UNB/Firmware/modules/Lofar/diag/src/vhdl/mms_diag_data_buffer.vhd $UNB/Firmware/modules/Lofar/diag/src/vhdl/diag_block_gen.vhd $UNB/Firmware/modules/Lofar/diag/src/vhdl/diag_block_gen_reg.vhd - $UNB/Firmware/modules/Lofar/diag/src/vhdl/mms_diag_block_gen.vhd + src/vhdl/mms_diag_block_gen.vhd test_bench_files = $UNB/Firmware/modules/Lofar/diag/tb/vhdl/tb_diag_wg.vhd @@ -41,3 +41,4 @@ test_bench_files = $UNB/Firmware/modules/Lofar/diag/tb/vhdl/tb_diag_frm_monitor.vhd $UNB/Firmware/modules/Lofar/diag/tb/vhdl/tb_mms_diag_seq.vhd $UNB/Firmware/modules/Lofar/diag/tb/vhdl/tb_mms_diag_block_gen.vhd + tb/vhdl/tb_diag_regression.vhd diff --git a/libraries/base/diag/src/vhdl/mms_diag_block_gen.vhd b/libraries/base/diag/src/vhdl/mms_diag_block_gen.vhd new file mode 100644 index 0000000000000000000000000000000000000000..19640ccb71e9eb2f57f42dc50f58ccf0d3fdd710 --- /dev/null +++ b/libraries/base/diag/src/vhdl/mms_diag_block_gen.vhd @@ -0,0 +1,172 @@ +------------------------------------------------------------------------------- +-- +-- Copyright (C) 2011 +-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +------------------------------------------------------------------------------- + +-- Purpose: Block generator for multiple parallel SOSI streams +-- Description: +-- . The mms_diag_block_gen provides a MM slave interface to an array of +-- g_nof_output_streams diag_block_gen instances. +-- . The waveform data is stored in RAM and can be pre-load with data from a +-- file g_file_name_prefix. The stream index to the select the actual file +-- is default I, but can be set via g_file_index_arr(I). The g_file_index_arr +-- makes the relation between the instance index and file index flexible. +-- Remark: +-- . The diag_block_gen does not support back pressure, but it does support +-- XON/XOFF flow control at block level via out_siso.xon. +-- . Default input *_mosi = c_mem_mosi_rst to support using the BG with default +-- control and memory settings and no MM interface + +LIBRARY IEEE, common_lib, dp_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 dp_lib.dp_stream_pkg.ALL; +USE work.diag_pkg.ALL; + +ENTITY mms_diag_block_gen IS + GENERIC ( + g_blk_sync : BOOLEAN := FALSE; + g_nof_output_streams : POSITIVE := 16; + g_buf_dat_w : POSITIVE := 32; + g_buf_addr_w : POSITIVE := 7; -- Waveform buffer size 2**g_buf_addr_w nof samples + g_file_index_arr : t_nat_natural_arr := array_init(0, 128, 1); -- default use the instance index as file index 0, 1, 2, 3, 4 ... + g_file_name_prefix : STRING := "../../data/bf_in_data"; -- Relative path to the hex files that contain the initial data for the memories + -- The sequence number and ".hex" are added within the entity. + g_diag_block_gen_rst : t_diag_block_gen := c_diag_block_gen_rst + ); + PORT ( + -- System + mm_rst : IN STD_LOGIC; -- reset synchronous with mm_clk + mm_clk : IN STD_LOGIC; -- memory-mapped bus clock + dp_rst : IN STD_LOGIC; -- reset synchronous with st_clk + dp_clk : IN STD_LOGIC; -- streaming clock domain clock + en_sync : IN STD_LOGIC := '1'; -- block generator enable sync pulse in ST dp_clk domain + -- MM interface + reg_bg_ctrl_mosi : IN t_mem_mosi := c_mem_mosi_rst; -- Memory interface for In System updating of the waveform generator data + reg_bg_ctrl_miso : OUT t_mem_miso; -- Memory interface for In System updating of the waveform generator data + ram_bg_data_mosi : IN t_mem_mosi := c_mem_mosi_rst; -- Memory interface for In System updating of the waveform generator data + ram_bg_data_miso : OUT t_mem_miso; -- Memory interface for In System updating of the waveform generator data + -- ST interface + out_siso_arr : IN t_dp_siso_arr(g_nof_output_streams-1 DOWNTO 0) := (OTHERS=>c_dp_siso_rdy); -- Default no XON flow control + out_sosi_arr : OUT t_dp_sosi_arr(g_nof_output_streams-1 DOWNTO 0) -- Output SOSI that contains the waveform data + ); +END mms_diag_block_gen; + +ARCHITECTURE rtl OF mms_diag_block_gen IS + + CONSTANT c_buf : t_c_mem := (latency => 1, + adr_w => g_buf_addr_w, + dat_w => g_buf_dat_w, + nof_dat => 2**g_buf_addr_w, + init_sl => '0'); + + CONSTANT c_post_buf_file : STRING := ".hex"; + + TYPE t_buf_dat_arr IS ARRAY (NATURAL RANGE <>) OF STD_LOGIC_VECTOR(g_buf_dat_w -1 DOWNTO 0); + TYPE t_buf_adr_arr IS ARRAY (NATURAL RANGE <>) OF STD_LOGIC_VECTOR(g_buf_addr_w-1 DOWNTO 0); + + SIGNAL st_addr_arr : t_buf_adr_arr(g_nof_output_streams -1 DOWNTO 0); + SIGNAL st_rd : STD_LOGIC_VECTOR(g_nof_output_streams -1 DOWNTO 0); + SIGNAL st_rdval : STD_LOGIC_VECTOR(g_nof_output_streams -1 DOWNTO 0); + SIGNAL st_rddata_arr : t_buf_dat_arr(g_nof_output_streams -1 DOWNTO 0); + SIGNAL ram_bg_data_mosi_arr : t_mem_mosi_arr(g_nof_output_streams -1 DOWNTO 0); + SIGNAL ram_bg_data_miso_arr : t_mem_miso_arr(g_nof_output_streams -1 DOWNTO 0); + SIGNAL bg_ctrl : t_diag_block_gen; + +BEGIN + + u_bg_ctrl : ENTITY work.diag_block_gen_reg + GENERIC MAP( + g_cross_clock_domain => TRUE, -- use FALSE when mm_clk and st_clk are the same, else use TRUE to cross the clock domain + g_diag_block_gen_rst => g_diag_block_gen_rst + ) + PORT MAP ( + mm_rst => mm_rst, -- Clocks and reset + mm_clk => mm_clk, + dp_rst => dp_rst, + dp_clk => dp_clk, + mm_mosi => reg_bg_ctrl_mosi, + mm_miso => reg_bg_ctrl_miso, + bg_ctrl => bg_ctrl + ); + + -- Combine the internal array of mm interfaces for the bg_data to one array that is connected to the port of the MM bus + u_mem_mux_bg_data : ENTITY common_lib.common_mem_mux + GENERIC MAP ( + g_nof_mosi => g_nof_output_streams, + g_mult_addr_w => g_buf_addr_w + ) + PORT MAP ( + mosi => ram_bg_data_mosi, + miso => ram_bg_data_miso, + mosi_arr => ram_bg_data_mosi_arr, + miso_arr => ram_bg_data_miso_arr + ); + + gen_wg_streams : FOR I IN 0 TO g_nof_output_streams-1 GENERATE + u_buffer_ram : ENTITY common_lib.common_ram_crw_crw + GENERIC MAP ( + g_ram => c_buf, + -- Sequence number and ".hex" extensie are added to the relative path in case a ram file is provided. + g_init_file => sel_a_b(g_file_name_prefix = "UNUSED", g_file_name_prefix, g_file_name_prefix & "_" & NATURAL'IMAGE(g_file_index_arr(I)) & c_post_buf_file) + ) + PORT MAP ( + -- MM side + rst_a => mm_rst, + clk_a => mm_clk, + wr_en_a => ram_bg_data_mosi_arr(I).wr, + wr_dat_a => ram_bg_data_mosi_arr(I).wrdata(c_buf.dat_w -1 DOWNTO 0), + adr_a => ram_bg_data_mosi_arr(I).address(c_buf.adr_w-1 DOWNTO 0), + rd_en_a => ram_bg_data_mosi_arr(I).rd, + rd_dat_a => ram_bg_data_miso_arr(I).rddata(c_buf.dat_w -1 DOWNTO 0), + rd_val_a => ram_bg_data_miso_arr(I).rdval, + -- Waveform side + rst_b => dp_rst, + clk_b => dp_clk, + wr_en_b => '0', + wr_dat_b => (OTHERS =>'0'), + adr_b => st_addr_arr(I), + rd_en_b => st_rd(I), + rd_dat_b => st_rddata_arr(I), + rd_val_b => st_rdval(I) + ); + + u_waveform_generator : ENTITY work.diag_block_gen + GENERIC MAP ( + g_blk_sync => g_blk_sync, + g_buf_dat_w => g_buf_dat_w, + g_buf_addr_w => g_buf_addr_w + ) + PORT MAP ( + rst => dp_rst, + clk => dp_clk, + buf_addr => st_addr_arr(I), + buf_rden => st_rd(I), + buf_rddat => st_rddata_arr(I), + buf_rdval => st_rdval(I), + ctrl => bg_ctrl, + en_sync => en_sync, + out_siso => out_siso_arr(I), + out_sosi => out_sosi_arr(I) + ); + END GENERATE; + +END rtl; diff --git a/libraries/base/diag/tb/vhdl/tb_diag_regression.vhd b/libraries/base/diag/tb/vhdl/tb_diag_regression.vhd new file mode 100644 index 0000000000000000000000000000000000000000..36ea670b44e2356de4aa417554614f4cde2551d5 --- /dev/null +++ b/libraries/base/diag/tb/vhdl/tb_diag_regression.vhd @@ -0,0 +1,45 @@ +------------------------------------------------------------------------------- +-- +-- Copyright (C) 2010 +-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +-- JIVE (Joint Institute for VLBI in Europe) <http://www.jive.nl/> +-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +------------------------------------------------------------------------------- + +-- Purpose: Regression multi TB for DIAG library +-- Description: +-- All TB are self checking. If some component TB fails then simulate that TB +-- seperately to find the cause. +-- Usage: +-- > as 3 +-- > run -all + + +LIBRARY IEEE; +USE IEEE.std_logic_1164.ALL; + +ENTITY tb_diag_regression IS +END tb_diag_regression; + + +ARCHITECTURE tb OF tb_diag_regression IS +BEGIN + + u_tb_diag_block_gen : ENTITY work.tb_diag_block_gen; + u_tb_mms_diag_block_gen : ENTITY work.tb_mms_diag_block_gen; + +END tb;