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

Merge branch 'L2SDP-551' into 'master'

Resolve L2SDP-551

Closes L2SDP-551

See merge request desp/hdl!182
parents 488b9f08 e75d1fa7
No related branches found
No related tags found
1 merge request!182Resolve L2SDP-551
Pipeline #22552 passed
......@@ -505,10 +505,14 @@ PACKAGE sdp_pkg is
FUNCTION func_sdp_get_stat_marker(g_statistics_type : STRING) RETURN NATURAL;
FUNCTION func_sdp_get_stat_nof_signal_inputs(g_statistics_type : STRING) RETURN NATURAL;
-- nof_statistics_per_packet = mm_nof_data * mm_data_size / c_sdp_W_statistic_sz
FUNCTION func_sdp_get_stat_from_mm_user_size(g_statistics_type : STRING) RETURN NATURAL;
FUNCTION func_sdp_get_stat_from_mm_data_size(g_statistics_type : STRING) RETURN NATURAL;
FUNCTION func_sdp_get_stat_from_mm_step_size(g_statistics_type : STRING) RETURN NATURAL;
FUNCTION func_sdp_get_stat_from_mm_nof_data(g_statistics_type : STRING) RETURN NATURAL;
FUNCTION func_sdp_get_stat_nof_statistics_per_packet(g_statistics_type : STRING) RETURN NATURAL;
FUNCTION func_sdp_get_stat_app_total_length(g_statistics_type : STRING) RETURN NATURAL;
FUNCTION func_sdp_get_stat_udp_total_length(g_statistics_type : STRING) RETURN NATURAL;
FUNCTION func_sdp_get_stat_ip_total_length(g_statistics_type : STRING) RETURN NATURAL;
......@@ -575,11 +579,19 @@ PACKAGE BODY sdp_pkg IS
1)); -- SST
END func_sdp_get_stat_nof_signal_inputs;
FUNCTION func_sdp_get_stat_from_mm_data_size(g_statistics_type : STRING) RETURN NATURAL IS
FUNCTION func_sdp_get_stat_from_mm_user_size(g_statistics_type : STRING) RETURN NATURAL IS
-- see sdp_statistics_offload.vhd for description
BEGIN
RETURN sel_a_b(g_statistics_type="BST", c_sdp_N_pol_bf * c_sdp_W_statistic_sz, -- = 4
RETURN sel_a_b(g_statistics_type="BST", c_sdp_W_statistic_sz, -- = 2
sel_a_b(g_statistics_type="XST", c_nof_complex * c_sdp_W_statistic_sz, -- = 4
c_sdp_W_statistic_sz)); -- = 2, SST
c_sdp_W_statistic_sz)); -- = 2, SST
END func_sdp_get_stat_from_mm_user_size;
FUNCTION func_sdp_get_stat_from_mm_data_size(g_statistics_type : STRING) RETURN NATURAL IS
BEGIN
RETURN sel_a_b(g_statistics_type="BST", c_sdp_N_pol_bf * c_sdp_W_statistic_sz, -- = 4
sel_a_b(g_statistics_type="XST", c_nof_complex * c_sdp_W_statistic_sz, -- = 4
c_sdp_W_statistic_sz)); -- = 2, SST
END func_sdp_get_stat_from_mm_data_size;
FUNCTION func_sdp_get_stat_from_mm_step_size(g_statistics_type : STRING) RETURN NATURAL IS
......@@ -587,7 +599,7 @@ PACKAGE BODY sdp_pkg IS
BEGIN
RETURN sel_a_b(g_statistics_type="BST", c_data_size, -- = 4
sel_a_b(g_statistics_type="XST", c_data_size, -- = 4
c_sdp_Q_fft * c_data_size)); -- = 4, SST
c_data_size * c_sdp_Q_fft)); -- = 4, SST
END func_sdp_get_stat_from_mm_step_size;
FUNCTION func_sdp_get_stat_from_mm_nof_data(g_statistics_type : STRING) RETURN NATURAL IS
......@@ -597,6 +609,7 @@ PACKAGE BODY sdp_pkg IS
c_sdp_N_sub)); -- = 512, SST
END func_sdp_get_stat_from_mm_nof_data;
-- nof_statistics_per_packet = mm_nof_data * mm_data_size / c_sdp_W_statistic_sz
FUNCTION func_sdp_get_stat_nof_statistics_per_packet(g_statistics_type : STRING) RETURN NATURAL IS
BEGIN
RETURN sel_a_b(g_statistics_type="BST", c_sdp_S_sub_bf * c_sdp_N_pol_bf, -- = 976
......
......@@ -30,6 +30,61 @@
-- https://plm.astron.nl/polarion/#/project/LOFAR2System/wiki/L2%20Interface%20Control%20Documents/SC%20to%20SDP%20ICD
-- . See 2.9.4 Station Control (L3-SC) - SDP Firmware (L4-SDPFW)
--
-- . endianess
-- Within a 32bit MM word the values are stored with LSByte at lowest byte
-- address (so relative byte address 0) and MSByte at highest byte address
-- (so relative byte address 3). Internally in the RAM the MM words are thus
-- stored with LSByte first, which is called little endian. However,
-- externally the MM words are send with MSByte first, so in the statistics
-- offload header and offload payload the 32bit words are send with MSByte
-- first, which is called big endian.
-- The dp_offload_tx_v3 sends all multi byte header fields in big endian
-- order, hence also the 16bit, 24bit and 64bit values are send MSByte
-- first. The internet packet headers also use big endian, which is
-- therefore also called network order. Hence the entire statistics offload
-- packet is in big endian order.
-- If values are shown with first byte received left and last byte received
-- right, then big endian hex values can directly be interpreted when read
-- by a human, because they are shown in the normal order.
--
-- . g_reverse_word_order
-- The statistics consist of c_sdp_W_statistic_sz = 2 MM words that are
-- with LSWord at low (even) word address and MSWord at high (odd) word
-- address. Default the statistics offload reads the low address first, but
-- the statistics have to be send with MSWord first. Therefore the read
-- order needs to be reversed per statistic value, so g_reverse_word_order
-- = TRUE. The combination of sending the MSWord first and the MSByte first
-- results that the entire 64b statistics words are send in big endian
-- order.
--
-- Stored order:
-- word address: 0, 1, 2, 3
-- SST Ul, Uh
-- BST Xl, Xh, Yl, Yh
-- XST Rl, Rh, Il, Ih
--
-- The g_reverse_word_order = TRUE is needed to achieve have MSWord first
-- and 64bit big endian.
-- The g_user_size defines the number of words that get reversed:
-- . For the SST there is only one uint64 part, so g_user_size = 2.
-- . For the BST the X and Y polarization parts are treated as and array of
-- [N_pol_bf], so index 0 = X is send first and therefore g_user_size = 2
-- to preserve the polarization order.
-- . For the XST the Re and Im complex parts are treated as a cint64, so
-- the imaginary part is send first and therefore g_user_size = 4 to also
-- reverse the Re an Im parts. This is similar as with cint16 values that
-- are packed as Im << 16 + Re in a 32bit word. However it differs from
-- two diminensional arrays of [N_complex], because for arrays index 0
-- is send first and index 0 corresponds to Re.
--
-- The () show the parts that are contained in g_user_size and that got
-- reversed by g_reverse_word_order = TRUE compared to the stored order:
--
-- Transport order: (g_user_size)
-- SST (Uh, Ul), 2
-- BST (Xh, Xl), (Yh, Yl), 2 keep parts order
-- XST (Ih, Il, Rh, Rl), 4 also reverse parts order
--
-------------------------------------------------------------------------------
LIBRARY IEEE, common_lib, mm_lib, dp_lib, ring_lib;
......@@ -48,7 +103,8 @@ ENTITY sdp_statistics_offload IS
g_offload_time : NATURAL := c_sdp_offload_time;
g_beamset_id : NATURAL := 0;
g_P_sq : NATURAL := c_sdp_P_sq; -- use generic to support P_sq = 1 for one node and P_sq = c_sdp_P_sq for multiple nodes (with ring)
g_crosslets_direction : NATURAL := 1 -- > 0 for crosslet transport in positive direction (incrementing RN), else 0 for negative direction
g_crosslets_direction : NATURAL := 1; -- > 0 for crosslet transport in positive direction (incrementing RN), else 0 for negative direction
g_reverse_word_order : BOOLEAN := TRUE -- default word order is MSB after LSB, we need to stream LSB after MSB.
);
PORT (
-- Clocks and reset
......@@ -105,6 +161,7 @@ ARCHITECTURE str OF sdp_statistics_offload IS
CONSTANT c_beamlet_id : NATURAL := g_beamset_id * c_sdp_S_sub_bf;
-- MM access settings per packet for u_dp_block_from_mm_dc
CONSTANT c_mm_user_size : NATURAL := func_sdp_get_stat_from_mm_user_size(g_statistics_type);
CONSTANT c_mm_data_size : NATURAL := func_sdp_get_stat_from_mm_data_size(g_statistics_type);
CONSTANT c_mm_step_size : NATURAL := func_sdp_get_stat_from_mm_step_size(g_statistics_type);
CONSTANT c_mm_nof_data : NATURAL := func_sdp_get_stat_from_mm_nof_data(g_statistics_type);
......@@ -385,10 +442,12 @@ BEGIN
u_dp_block_from_mm_dc : ENTITY dp_lib.dp_block_from_mm_dc
GENERIC MAP (
g_user_size => c_mm_user_size,
g_data_size => c_mm_data_size,
g_step_size => c_mm_step_size,
g_nof_data => c_mm_nof_data,
g_reverse_word_order => TRUE -- default word order is MSB after LSB, we need to stream LSB after MSB.
g_word_w => c_word_w,
g_reverse_word_order => g_reverse_word_order
)
PORT MAP(
dp_rst => dp_rst,
......
......@@ -40,6 +40,7 @@ BEGIN
-- -- All
-- g_statistics_type : STRING := "SST";
-- g_offload_time : NATURAL := 500;
-- g_reverse_word_order : BOOLEAN := TRUE -- when TRUE then stream LSB word after MSB word.
-- g_gn_index : NATURAL := 1; -- global node (GN) index, use > 0 to see effect of g_offload_time
-- -- BST
-- g_beamset_id : NATURAL := 0;
......@@ -50,14 +51,17 @@ BEGIN
-- g_nof_crosslets : NATURAL := 1;
-- g_crosslets_direction : INTEGER := 1; -- +1 or -1
u_sst : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("SST", 50, 3, 0, 0);
u_bst_0 : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("BST", 50, 1, 0, 0);
u_bst_1 : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("BST", 50, 1, 1, 0);
u_xst_P1 : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("XST", 50, 1, 0, 0, 16, 1, 1, 1);
u_xst_P1_N3 : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("XST", 50, 1, 0, 0, 16, 1, 3, 1);
u_xst_P9 : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("XST", 50, 1, 0, 0, 16, 9, 1, 1);
u_xst_P9_N3 : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("XST", 50, 1, 0, 0, 16, 9, 3, 1);
u_xst_P9_N3_neg : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("XST", 50, 1, 0, 0, 16, 9, 3, 0);
u_xst_P8_N7_RN1_15 : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("XST", 50, 1, 0, 1, 15, 8, 7, 0);
u_sst : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("SST", 50, TRUE, 3, 0, 0);
u_sst_no_reverse : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("SST", 50, FALSE, 3, 0, 0);
u_bst_0 : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("BST", 50, TRUE, 1, 0, 0);
u_bst_0_no_reverse : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("BST", 50, FALSE, 1, 0, 0);
u_bst_1 : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("BST", 50, TRUE, 1, 1, 0);
u_xst_P1 : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("XST", 50, TRUE, 1, 0, 0, 16, 1, 1, 1);
u_xst_P1_N3 : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("XST", 50, TRUE, 1, 0, 0, 16, 1, 3, 1);
u_xst_P9 : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("XST", 50, TRUE, 1, 0, 0, 16, 9, 1, 1);
u_xst_P9_N3 : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("XST", 50, TRUE, 1, 0, 0, 16, 9, 3, 1);
u_xst_P9_N3_no_reverse : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("XST", 50, FALSE, 1, 0, 0, 16, 9, 3, 1);
u_xst_P9_N3_neg : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("XST", 50, TRUE, 1, 0, 0, 16, 9, 3, 0);
u_xst_P8_N7_RN1_15 : ENTITY work.tb_sdp_statistics_offload GENERIC MAP("XST", 50, TRUE, 1, 0, 1, 15, 8, 7, 0);
END tb;
......@@ -18,11 +18,42 @@
-- --------------------------------------------------------------------------
-- Author:
-- . Pieter Donker, R van der Walle
-- . Pieter Donker, R van der Walle, E. Kooistra
-- Purpose:
-- . Read a block of data from memory mapped (MM) location and stream it as a block of data.
-- Description:
-- . https://support.astron.nl/confluence/display/L2M/L5+SDPFW+Design+Document%3A+Subband+filterbank
--
-- . g_*_size, g_word_w:
-- The g_*_size values are in number of g_word_w memory words, so e.g.
-- 32bit words. The 32bit words are read in data blocks of g_data_size
-- words. The data block contains U = g_data_size / g_user_size
-- number of user words. U is and integer. This occurs e.g. for U = 2
-- when the data block contains:
-- - a complex value, so with real part and imag part
-- - dual polarization value, so with X polarization and Y polarization
-- The user words contain g_user_size number of g_word_w = 32bit words.
-- The output out_sosi.data width is also g_word_w bits.
--
-- . g_step_size:
-- The g_step_size = K * g_data_size, where K >= 1 to allow read out of
-- data blocks that are interleaved by a factor K.
--
-- . g_nof_data and start_pulse, start_address, mm_mosi, mm_miso, mm_done:
-- The g_nof_data is the number of data blocks that are read out via
-- mm_mosi/mm_miso per start_pulse, to form a new aggregate output block
-- with out_sosi.sop and out_sosi.eop. When the read out is done, then
-- mm_done pulses and a new start_pulse can be issued. By incrementing
-- the start_address for every start_pulse it is possible to read out K
-- interleaved sets of data blocks from the memory.
--
-- . g_reverse_word_order per g_user_size:
-- The g_reverse_word_order has no effect when FALSE, but reverses the
-- read out order of the 32bit words per user word when TRUE. The
-- g_reverse_word_order has to apply per user word and not per data block,
-- to preserve the order of the user parts (e.g. real and imag, X and Y
-- polarization) in a data block.
--
-- --------------------------------------------------------------------------
LIBRARY IEEE,common_lib;
......@@ -34,10 +65,11 @@ USE work.dp_stream_pkg.ALL;
ENTITY dp_block_from_mm IS
GENERIC (
g_user_size : NATURAL;
g_data_size : NATURAL;
g_step_size : NATURAL;
g_nof_data : NATURAL;
g_data_w : NATURAL := c_word_w;
g_word_w : NATURAL := c_word_w;
g_mm_rd_latency : NATURAL := 1; -- default 1 from rd_en to rd_val, use 2 to ease timing closure
g_reverse_word_order : BOOLEAN := FALSE
);
......@@ -58,23 +90,25 @@ END dp_block_from_mm;
ARCHITECTURE rtl OF dp_block_from_mm IS
CONSTANT c_mem_size : NATURAL := g_step_size * g_nof_data;
CONSTANT c_word_index_rst : NATURAL := sel_a_b(g_reverse_word_order, g_data_size - 1, 0);
TYPE t_reg IS RECORD
busy : STD_LOGIC;
sop : STD_LOGIC;
eop : STD_LOGIC;
word_index : NATURAL;
step_index : NATURAL;
busy : STD_LOGIC;
sop : STD_LOGIC;
eop : STD_LOGIC;
user_index : NATURAL RANGE 0 TO g_user_size; -- word index in g_user_size
data_index : NATURAL RANGE 0 TO g_data_size; -- default word order index in g_data_size
word_index : NATURAL RANGE 0 TO g_data_size; -- default or reversed word order index in g_data_size
step_address : NATURAL RANGE 0 TO c_mem_size; -- step address offset
END RECORD;
CONSTANT c_reg_rst : t_reg := ('0', '0', '0', c_word_index_rst, 0);
CONSTANT c_reg_rst : t_reg := ('0', '0', '0', 0, 0, 0, 0);
SIGNAL r : t_reg;
SIGNAL nxt_r : t_reg;
SIGNAL mm_address : NATURAL := 0;
SIGNAL last_mm_address : NATURAL := 0;
SIGNAL mm_address : NATURAL := 0;
SIGNAL mm_address_rev : NATURAL := 0;
SIGNAL r_sop_p : STD_LOGIC;
SIGNAL r_eop_p : STD_LOGIC;
......@@ -84,8 +118,9 @@ ARCHITECTURE rtl OF dp_block_from_mm IS
BEGIN
last_mm_address <= g_step_size * (g_nof_data - 1) + g_data_size + start_address - 1;
mm_address <= start_address + r.word_index + r.step_index;
mm_address <= start_address + r.data_index + r.step_address; -- default word order per g_user_size
mm_address_rev <= start_address + r.word_index + r.step_address; -- reverse word order per g_user_size
-- Take care of g_mm_rd_latency for out_sosi.sop and out_sosi.eop
r_sop_p <= r.sop WHEN rising_edge(clk);
r_eop_p <= r.eop WHEN rising_edge(clk);
......@@ -95,7 +130,7 @@ BEGIN
u_sosi : PROCESS(r, mm_miso, out_sop, out_eop)
BEGIN
out_sosi <= c_dp_sosi_rst; -- To avoid Modelsim warnings on conversion to integer from unused fields.
out_sosi.data <= RESIZE_DP_DATA(mm_miso.rddata(g_data_w-1 DOWNTO 0));
out_sosi.data <= RESIZE_DP_DATA(mm_miso.rddata(g_word_w-1 DOWNTO 0));
out_sosi.valid <= mm_miso.rdval; -- read latency from mm_mosi.rd to mm_miso.rdval is 1, so same as the ready latency (RL = 1)
out_sosi.sop <= out_sop; -- read latency from mm_mosi.rd to mm_miso.rdval is 1, so r.sop can be used for output sop
out_sosi.eop <= out_eop; -- read latency from mm_mosi.rd to mm_miso.rdval is 1, so r.eop can be used for output eop
......@@ -112,17 +147,20 @@ BEGIN
END IF;
END PROCESS;
p_comb : PROCESS(r, start_pulse, out_siso, mm_address, last_mm_address)
VARIABLE v : t_reg;
p_comb : PROCESS(r, start_pulse, out_siso, mm_address, mm_address_rev, last_mm_address)
VARIABLE v : t_reg;
VARIABLE v_base : NATURAL;
VARIABLE v_reverse : NATURAL;
BEGIN
v := r;
v.sop := '0';
v.eop := '0';
mm_mosi <= c_mem_mosi_rst; -- use default 0 to avoid Warning: (vsim-8684) No drivers exist on out port .wr, .wrdata
mm_mosi.address <= TO_MEM_ADDRESS(mm_address); -- only use mosi.rd and mosi.address
-- Use default c_mem_mosi_rst to avoid Warning: (vsim-8684) No drivers exist on out port .wr, .wrdata
mm_mosi <= c_mem_mosi_rst;
IF r.busy = '0' AND start_pulse = '1' THEN
-- initiate next block
-- initiate next output block
v.busy := '1';
END IF;
......@@ -130,57 +168,54 @@ BEGIN
-- support zero gaps between output blocks
IF v.busy = '1' THEN
IF out_siso.ready = '1' THEN
-- continue with block
-- Continue with output block
mm_mosi.rd <= '1';
IF g_reverse_word_order THEN
IF r.word_index > 0 THEN
v.word_index := r.word_index - 1;
ELSE
v.word_index := g_data_size - 1;
v.step_index := r.step_index + g_step_size;
END IF;
-- check start of block
IF r.word_index = g_data_size - 1 AND r.step_index = 0 THEN
v.sop := '1';
END IF;
-- Calculate data_index for default word order
IF r.data_index < g_data_size - 1 THEN
v.data_index := r.data_index + 1;
ELSE
v.data_index := 0;
v.step_address := r.step_address + g_step_size;
END IF;
IF r.word_index < g_data_size - 1 THEN
v.word_index := r.word_index + 1;
ELSE
v.word_index := 0;
v.step_index := r.step_index + g_step_size;
END IF;
-- check start of block
IF r.word_index = 0 AND r.step_index = 0 THEN
v.sop := '1';
END IF;
-- maintain user_index within g_user_size
IF r.user_index < g_user_size - 1 THEN
v.user_index := r.user_index + 1;
ELSE
v.user_index := 0;
END IF;
-- check start of output block
IF r.data_index = 0 AND r.step_address = 0 THEN
v.sop := '1';
END IF;
-- check end of block
IF g_reverse_word_order THEN
IF mm_address = last_mm_address - (g_data_size - 1) THEN -- with reversed word order the last word to read is actually the first word of the last step index
v.eop := '1';
-- prepare for next block
v.busy := '0';
v.step_index := 0;
v.word_index := g_data_size - 1;
END IF;
ELSIF mm_address >= last_mm_address THEN -- g_reverse_word_order = False
-- check end of output block
IF mm_address >= last_mm_address THEN
v.eop := '1';
-- prepare for next block
-- prepare for next output block at next start_pulse
v.busy := '0';
v.step_index := 0;
v.word_index := 0;
v.step_address := 0;
v.data_index := 0;
v.user_index := 0;
END IF;
END IF;
END IF;
-- Default word order
v.word_index := v.data_index;
mm_mosi.address <= TO_MEM_ADDRESS(mm_address);
-- Account for g_reverse_word_order
IF g_reverse_word_order THEN
v_base := v.data_index - v.user_index; -- data_index of first word in g_user_size
v_reverse := g_user_size - 1 - v.user_index; -- reverse word index in g_user_size
v.word_index := v_base + v_reverse;
mm_mosi.address <= TO_MEM_ADDRESS(mm_address_rev);
END IF;
nxt_r <= v;
END PROCESS;
......
......@@ -24,6 +24,7 @@
-- this is a dual-clock wrapper around dp_block_from_mm.vhd
-- Description:
-- . https://support.astron.nl/confluence/display/L2M/L5+SDPFW+Design+Document%3A+Subband+filterbank
-- . see dp_block_from_mm.vhd
-- --------------------------------------------------------------------------
LIBRARY IEEE,common_lib;
......@@ -35,9 +36,11 @@ USE work.dp_stream_pkg.ALL;
ENTITY dp_block_from_mm_dc IS
GENERIC (
g_user_size : NATURAL;
g_data_size : NATURAL;
g_step_size : NATURAL;
g_nof_data : NATURAL;
g_word_w : NATURAL := c_word_w;
g_reverse_word_order : BOOLEAN := FALSE
);
PORT (
......@@ -135,9 +138,11 @@ BEGIN
u_dp_block_from_mm : ENTITY work.dp_block_from_mm
GENERIC MAP (
g_user_size => g_user_size,
g_data_size => g_data_size,
g_step_size => g_step_size,
g_nof_data => g_nof_data,
g_word_w => g_word_w,
g_reverse_word_order => g_reverse_word_order
)
PORT MAP (
......
......@@ -418,10 +418,11 @@ BEGIN
gen_mm_to_dp : FOR I IN 0 TO g_nof_streams-1 GENERATE
u_mm_to_dp: ENTITY work.dp_block_from_mm
GENERIC MAP (
g_user_size => 1,
g_data_size => 1,
g_step_size => 1,
g_nof_data => g_block_size,
g_data_w => g_data_w,
g_word_w => g_data_w,
g_mm_rd_latency => g_rd_latency,
g_reverse_word_order => FALSE
)
......
......@@ -33,6 +33,9 @@
-- . p_verify_read, set ram address (using g_data_size and g_step_size) to check and
-- read value from ram, also set expected ram value.
-- . p_verify_check, check if ram_value is equal to expected value.
--
-- Remark:
-- . g_user_size and g_reverse_word_order are verified in tb_sdp_statistics_offload.vhd
-- --------------------------------------------------------------------------
-- > as 10
......@@ -222,6 +225,7 @@ BEGIN
-- DUT, dp_block_from_mm
u_dp_block_from_mm: ENTITY work.dp_block_from_mm
GENERIC MAP (
g_user_size => g_data_size,
g_data_size => g_data_size,
g_step_size => g_step_size,
g_nof_data => g_nof_data
......
......@@ -603,10 +603,11 @@ BEGIN
gen_mm_to_dp : FOR I IN 0 TO g_nof_streams-1 GENERATE
u_mm_to_dp: ENTITY work.dp_block_from_mm
GENERIC MAP (
g_user_size => 1,
g_data_size => 1,
g_step_size => 1,
g_nof_data => g_block_size,
g_data_w => g_data_w,
g_word_w => g_data_w,
g_mm_rd_latency => g_rd_latency,
g_reverse_word_order => FALSE
)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment