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

Merge branch 'L2SDP-115' into 'master'

Resolve L2SDP-115

Closes L2SDP-115

See merge request desp/hdl!53
parents 990c2eba 955f1f2f
No related branches found
No related tags found
2 merge requests!100Removed text for XSub that is now written in Confluence Subband correlator...,!53Resolve L2SDP-115
......@@ -162,11 +162,12 @@ synth_files =
src/vhdl/dp_complex_add.vhd
src/vhdl/dp_selector_arr.vhd
src/vhdl/dp_selector.vhd
src/vhdl/mms_dp_scale.vhd
tb/vhdl/dp_stream_player.vhd
tb/vhdl/dp_sosi_recorder.vhd
tb/vhdl/dp_stream_rec_play.vhd
tb/vhdl/dp_statistics.vhd
tb/vhdl/tb_dp_pkg.vhd
test_bench_files =
......@@ -296,6 +297,7 @@ test_bench_files =
tb/vhdl/tb_dp_offload_tx_v3.vhd
tb/vhdl/tb_dp_offload_rx_filter.vhd
tb/vhdl/tb_dp_selector_arr.vhd
tb/vhdl/tb_mms_dp_scale.vhd
regression_test_vhdl =
tb/vhdl/tb_dp_fifo_to_mm.vhd
......@@ -350,6 +352,7 @@ regression_test_vhdl =
tb/vhdl/tb_tb_dp_throttle_xon.vhd
tb/vhdl/tb_tb_dp_xonoff.vhd
tb/vhdl/tb_dp_selector_arr.vhd
tb/vhdl/tb_mms_dp_scale.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: R. van der Walle
-- Purpose: Scale samples per block of valid samples in a stream via MM
-- Description:
-- The mms_dp_scale.vhd component consists of mms_dp_gain.vhd and dp_requantize.
-- 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 work.dp_stream_pkg.ALL;
ENTITY mms_dp_scale IS
GENERIC (
-- mms_dp_gain generics
g_complex_data : BOOLEAN := TRUE;
g_complex_gain : BOOLEAN := FALSE;
g_gain_init_re : INTEGER := 1;
g_gain_init_im : INTEGER := 0;
g_gain_w : NATURAL := 16;
g_in_dat_w : NATURAL := 9;
-- dp_requantize generics
g_out_dat_w : NATURAL := 8;
g_lsb_w : NATURAL := 16;
g_lsb_round : BOOLEAN := TRUE; -- when TRUE ROUND else TRUNCATE the input LSbits
g_lsb_round_clip : BOOLEAN := FALSE; -- when TRUE round clip to +max to avoid wrapping to output -min (signed) or 0 (unsigned) due to rounding
g_msb_clip : BOOLEAN := TRUE; -- when TRUE CLIP else WRAP the input MSbits
g_msb_clip_symmetric : BOOLEAN := FALSE -- when TRUE CLIP signed symmetric to +c_smax and -c_smax, else to +c_smax and c_smin_symm
-- for wrapping when g_msb_clip=FALSE the g_msb_clip_symmetric is ignored, so signed wrapping is done asymmetric
);
PORT (
-- System
mm_rst : IN STD_LOGIC;
mm_clk : IN STD_LOGIC;
dp_rst : IN STD_LOGIC;
dp_clk : IN STD_LOGIC;
-- MM interface
reg_gain_re_mosi : IN t_mem_mosi := c_mem_mosi_rst;
reg_gain_re_miso : OUT t_mem_miso;
reg_gain_im_mosi : IN t_mem_mosi := c_mem_mosi_rst;
reg_gain_im_miso : OUT t_mem_miso;
-- ST interface
in_sosi : IN t_dp_sosi;
out_sosi : OUT t_dp_sosi
);
END mms_dp_scale;
ARCHITECTURE str OF mms_dp_scale IS
CONSTANT c_dp_requantize_complex : BOOLEAN := g_complex_gain OR g_complex_data;
CONSTANT c_gain_out_dat_w : NATURAL := g_gain_w + g_in_dat_w -1; -- -1 to compensate for double sign-bit
SIGNAL dp_gain_out_sosi : t_dp_sosi;
BEGIN
---------------------------------------------------------------
-- Gain
---------------------------------------------------------------
u_mms_dp_gain : ENTITY work.mms_dp_gain
GENERIC MAP (
g_complex_data => g_complex_data,
g_complex_gain => g_complex_gain,
g_gain_init_re => g_gain_init_re,
g_gain_init_im => g_gain_init_im,
g_gain_w => g_gain_w,
g_in_dat_w => g_in_dat_w,
g_out_dat_w => c_gain_out_dat_w
)
PORT MAP (
-- System
mm_rst => mm_rst,
mm_clk => mm_clk,
dp_rst => dp_rst,
dp_clk => dp_clk,
-- MM interface
reg_gain_re_mosi => reg_gain_re_mosi,
reg_gain_re_miso => reg_gain_re_miso,
reg_gain_im_mosi => reg_gain_im_mosi,
reg_gain_im_miso => reg_gain_im_miso,
in_sosi => in_sosi,
out_sosi => dp_gain_out_sosi
);
---------------------------------------------------------------
-- Requantize
---------------------------------------------------------------
u_dp_requantize : ENTITY work.dp_requantize
GENERIC MAP (
g_complex => c_dp_requantize_complex,
g_representation => "SIGNED",
g_lsb_w => g_lsb_w,
g_lsb_round => g_lsb_round,
g_lsb_round_clip => g_lsb_round_clip,
g_msb_clip => g_msb_clip,
g_msb_clip_symmetric => g_msb_clip_symmetric,
g_in_dat_w => c_gain_out_dat_w,
g_out_dat_w => g_out_dat_w
)
PORT MAP (
rst => dp_rst,
clk => dp_clk,
-- ST sink
snk_in => dp_gain_out_sosi,
-- ST source
src_out => out_sosi
);
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: R. van der Walle
-- Purpose: Verify mms_dp_scale
-- Description:
-- Usage:
-- > as 10
-- > run -all
-- The tb is self stopping and self checking.
-- The tb tests if input data is scaled by the expected scaling factor.
-- The tb can be simple as the components in the DUT are already verified.
LIBRARY IEEE, common_lib, technology_lib;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL;
USE common_lib.common_pkg.ALL;
USE common_lib.common_lfsr_sequences_pkg.ALL;
USE common_lib.tb_common_pkg.ALL;
USE common_lib.common_mem_pkg.ALL;
USE common_lib.tb_common_mem_pkg.ALL;
USE work.dp_stream_pkg.ALL;
USE work.tb_dp_pkg.ALL;
USE technology_lib.technology_select_pkg.ALL;
ENTITY tb_mms_dp_scale IS
END tb_mms_dp_scale;
ARCHITECTURE tb OF tb_mms_dp_scale IS
CONSTANT c_mm_clk_period : TIME := 20 ns;
CONSTANT c_dp_clk_period : TIME := 10 ns;
CONSTANT c_cross_clock_domain_latency : NATURAL := 20;
CONSTANT c_complex_data : BOOLEAN := TRUE;
CONSTANT c_complex_gain : BOOLEAN := FALSE;
CONSTANT c_gain_w : NATURAL := 8;
CONSTANT c_in_dat_w : NATURAL := 9;
CONSTANT c_in_length : INTEGER := 2**(c_in_dat_w-3)-1; -- Expected sosi does not take clipping into account
CONSTANT c_in_max : INTEGER := 2**(c_in_dat_w-3)-1;
CONSTANT c_in_min : INTEGER := -2**(c_in_dat_w-3);
CONSTANT c_out_dat_w : NATURAL := c_in_dat_w;
-- Configure DUT by setting gain to 2**2(=4) and lsb to 1
-- resulting in an expected scale factor (c_exp_gain_re) of 2.0
-- which is used in the verification process.
CONSTANT c_lsb_w : NATURAL := 1;
CONSTANT c_gain_re : INTEGER := 2**2;
CONSTANT c_exp_gain_re : INTEGER := 2**(2-c_lsb_w);
SIGNAL tb_end : STD_LOGIC := '0';
SIGNAL mm_clk : STD_LOGIC := '1';
SIGNAL mm_rst : STD_LOGIC := '1';
SIGNAL dp_clk : STD_LOGIC := '1';
SIGNAL dp_rst : STD_LOGIC := '1';
SIGNAL stimuli_en : STD_LOGIC := '0';
SIGNAL verify_en : STD_LOGIC := '0';
SIGNAL cnt_re : STD_LOGIC_VECTOR(c_in_dat_w-1 DOWNTO 0) := (OTHERS=>'0');
SIGNAL cnt_im : STD_LOGIC_VECTOR(c_in_dat_w-1 DOWNTO 0) := (OTHERS=>'0');
SIGNAL cnt_val : STD_LOGIC;
SIGNAL in_sosi : t_dp_sosi;
SIGNAL in_sosi_dly : t_dp_sosi;
SIGNAL exp_sosi : t_dp_sosi;
SIGNAL out_sosi : t_dp_sosi;
SIGNAL reg_gain_re_mosi : t_mem_mosi := c_mem_mosi_rst;
SIGNAL reg_gain_re_miso : t_mem_miso;
SIGNAL reg_gain_im_mosi : t_mem_mosi := c_mem_mosi_rst;
SIGNAL reg_gain_im_miso : t_mem_miso;
BEGIN
dp_clk <= (NOT dp_clk) OR tb_end AFTER c_dp_clk_period/2;
mm_clk <= (NOT mm_clk) OR tb_end AFTER c_mm_clk_period/2;
dp_rst <= '1', '0' AFTER c_dp_clk_period*7;
mm_rst <= '1', '0' AFTER c_mm_clk_period*7;
------------------------------------------------------------------------------
-- DATA GENERATION
------------------------------------------------------------------------------
proc_dp_cnt_dat(dp_rst, dp_clk, stimuli_en, cnt_val, cnt_re);
-- derive cnt_im linearly from cnt_re such that abs(complex(cnt_re, cnt_im)) <= amplitude
-- the principle is: suppose re normalized to 1 then im = 1-re when re>=0 else im = -1-re when re<0
cnt_im <= TO_SVEC(sel_a_b(TO_SINT(cnt_re)>=0, c_in_max, c_in_min) - TO_SINT(cnt_re), c_in_dat_w);
in_sosi.data <= RESIZE_DP_SDATA(cnt_re);
in_sosi.re <= RESIZE_DP_DSP_DATA(cnt_re);
in_sosi.im <= RESIZE_DP_DSP_DATA(cnt_im);
in_sosi.valid <= cnt_val;
u_in_sosi_dly : ENTITY work.dp_pipeline
GENERIC MAP (
g_pipeline => 3 -- latency of DUT
)
PORT MAP (
rst => dp_rst,
clk => dp_clk,
snk_in => in_sosi,
src_out => in_sosi_dly
);
p_mm_stimuli : PROCESS
BEGIN
proc_common_wait_until_low(dp_clk, dp_rst);
proc_common_wait_some_cycles(dp_clk, 5);
proc_mem_mm_bus_wr(0, c_gain_re, mm_clk, reg_gain_re_miso, reg_gain_re_mosi);
proc_common_wait_some_cycles(mm_clk, c_cross_clock_domain_latency);
proc_common_wait_some_cycles(dp_clk, c_cross_clock_domain_latency);
stimuli_en <= '1';
proc_common_wait_some_cycles(dp_clk, 4);
verify_en <= '1';
proc_common_wait_some_cycles(dp_clk, c_in_length);
verify_en <= '0';
tb_end <= '1';
WAIT;
END PROCESS;
-- Verify out_sosi_arr
p_exp_sosi : PROCESS(in_sosi_dly)
BEGIN
exp_sosi.re <= TO_DP_DSP_DATA(c_exp_gain_re * TO_SINT(in_sosi_dly.re));
exp_sosi.im <= TO_DP_DSP_DATA(c_exp_gain_re * TO_SINT(in_sosi_dly.im));
END PROCESS;
p_verify : PROCESS(dp_clk)
BEGIN
IF rising_edge(dp_clk) THEN
IF verify_en='1' THEN
ASSERT SIGNED(out_sosi.re)=SIGNED(exp_sosi.re) REPORT "Unexpected complex real data, with real gain" SEVERITY ERROR;
ASSERT SIGNED(out_sosi.im)=SIGNED(exp_sosi.im) REPORT "Unexpected complex imag data, with real gain" SEVERITY ERROR;
END IF;
END IF;
END PROCESS;
------------------------------------------------------------------------------
-- DUT
------------------------------------------------------------------------------
u_dut : ENTITY work.mms_dp_scale
GENERIC MAP (
g_complex_data => c_complex_data,
g_complex_gain => c_complex_gain,
g_gain_w => c_gain_w,
g_in_dat_w => c_in_dat_w,
g_out_dat_w => c_out_dat_w,
g_lsb_w => c_lsb_w
)
PORT MAP (
-- Clocks and reset
mm_rst => mm_rst,
mm_clk => mm_clk,
dp_rst => dp_rst,
dp_clk => dp_clk,
-- MM access to gain
reg_gain_re_mosi => reg_gain_re_mosi,
reg_gain_re_miso => reg_gain_re_miso,
reg_gain_im_mosi => reg_gain_im_mosi,
reg_gain_im_miso => reg_gain_im_miso,
-- ST
in_sosi => in_sosi,
out_sosi => out_sosi
);
END tb;
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