diff --git a/libraries/base/dp/src/vhdl/dp_repack_dev.vhd b/libraries/base/dp/src/vhdl/dp_repack_dev.vhd index e75ec1a07fa79788b236eb6ce590ee56c30437d7..f79e29edcf95dbd15e208c2deaaff996948e2503 100644 --- a/libraries/base/dp/src/vhdl/dp_repack_dev.vhd +++ b/libraries/base/dp/src/vhdl/dp_repack_dev.vhd @@ -24,68 +24,47 @@ -- -- Block diagram: -- --- A) Functional --- g_in_nof_words=4 g_out_nof_words=2 --- --- r_in r_out --- ___ r_out_ready ___ <-- src_in.ready --- | |<---------------------| |--> src_out.data +-- A) Functional +-- The drawing shows g_in_nof_words=4 and g_out_nof_words=2 as example: +-- +-- dp_repack_in dp_repack_out +-- ___ ___ +-- | | pack_sosi | |--> src_out -- | 3 |--------------------->| 1 | --- | | load | | --- | 2 | | | --- | | ^ | | ^ --- | 1 | |valid | 0 | |shift --- | | |flush | | | --- | 0 | | | | | --- snk_in.data -->|___| |___| --- snk_out.ready <-- +-- | | | | +-- | 2 | ^ | | ^ +-- | | |valid | | |shift +-- | 1 | |flush | 0 | | +-- | | | | | | +-- | 0 | | | +-- snk_in -->|___| pack_siso |___| +-- snk_out.ready <-- <--------------------- <-- src_in.ready -- snk_out.xon <------------------------------------- src_in.xon -- -- --- B) No src_in flow control, but can issue local comb_snk_out flow control --- --- /----------------------------\ --- | nxt_r r | --- | /------\ . . | --- \-->| |----> p_reg -----*--> src_out --- | | . . --- snk_in -------->| | . . --- comb_snk_out <---|p_comb| . . --- . \------/ . . --- . . . --- RL=1 RL=1 RL=2 --- --- C) Add src_in flow control using dp_pipeline --- --- /----------------------------\ --- | nxt_r r | --- | /------\ . . | --- \-->| |----> p_reg -----/ ____ --- | | | |dp | --- snk_in -------->| | \------------------|pipe|---> src_out --- /--|p_comb| . |line| --- | \------/ . | | --- comb_snk_out | . | | --- v . | | --- /-\ . pipe_snk_out | | --- snk_out <----| |<-----------------------------| |<--- src_in --- . \-/ . |____| . --- . . . --- RL=1 RL=1 RL=1 +-- B) Flow control -- --- Default flow control: --- snk_out.ready <= comb_snk_out.ready AND pipe_snk_out.ready -- when function maintains or increases the data valid rate --- snk_out.ready <= '0' WHEN comb_snk_out.ready='0' ELSE pipe_snk_out.ready; -- when function increases the data valid rate (equivalent boolean condition) --- --- Advanced flow control for maximum throughput: --- snk_out.ready <= '1' WHEN comb_snk_out.ready='1' ELSE pipe_snk_out.ready; -- when function reduces the data valid rate --- --- The default flow control condition is that both the local function and --- the downstream function have to be ready. The default flow control --- condition works in any case, but if the local function reduces the valid --- data output rate, then the throughput can be increased by using the --- advanced flow control condition. The local function can reduce the valid --- data rate by packing data into larger words or by removing data. +-- RL=1 RL=1 RL=1 +-- . . . +-- . /-----------------------------------------\ +-- . | . _____ . | +-- . | /------\ nxt_r | | r | +-- . \-->| |---*-------*----->|p_reg|-----*---> src_out +-- . | | | | |_____| +-- snk_in -------->|p_comb|<--|-------|--------------*-------- src_in +-- | | | | | +-- | | | v | +-- | | | /-------\ | +-- | | | |p_flow | | +-- \------/ | \-------/ | +-- | | | +-- nxt_r.hold_out.valid | | | +-- v | | +-- /| |r_snk_out | +-- |1|------/ | +-- snk_out <------------------| | | +-- |0|---------------------/ +-- \| -- -- Description: -- The dp_repack_dev repacks g_in_nof_words of width g_in_dat_w into @@ -94,80 +73,58 @@ -- . bypass -- If g_in_nof_words=g_out_nof_words then snk_in is simply passed on directly -- to src_out via wires. +-- If g_in_nof_words=1 then the dp_repack_in stage is bypassed to safe logic. +-- If g_out_nof_words=1 then the dp_repack_out stage is bypassed to safe logic. +-- Both the dp_repack_in and dp_repack_out stage do work correctly when +-- nof_words=1. They then merely add a transparant pipeline delay. It is +-- important that they also work for nof_words=1 because that gives confidence +-- that their implementation structure is ok. -- -- . g_in_nof_words and input block size -- The input block size in words is indicated by snk_in.sop and snk_in.eop. -- Each subsection of g_in_nof_words is packed into g_out_nof_words. The -- input block size does not have to be a multiple of g_in_nof_words. When --- the snk_in.eop --- occurs the last repack is initiated without need for input data padding. --- --- . c_out_buf_dat_w >= c_in_buf_dat_w --- To avoid loss of input data the c_out_buf_dat_w must be >= c_in_buf_dat_w. --- If c_out_buf_dat_w > c_in_buf_dat_w then there will be unused LSbits in --- the output data. +-- the snk_in.eop occurs the last repack is initiated without need for input +-- data padding. If the block length is an integer multiple of +-- g_in_nof_words then the dp_repack_dev introduces no gaps between blocks. +-- If the block length is a fractional multiple of g_in_nof_words then there +-- will be a gap after the block due to that the dp_repack_in needs to +-- shift up the last subsection for the 'missing' input words. -- --- Remark: +-- Remarks: -- . Originally reused from LOFAR rad_repack.vhd and rad_repack(rtl).vhd. This -- dp_repack_dev still uses the shift in input register in and the shift out -- output register, but no longer the intermediate buffer register. --- Using shift in and shift out probably eases timing closure compared to --- using a demultiplexer to put the input data in the input register and a --- multiplexer to get the data directly from the output register. For the --- demultiplexer / multiplexer it would be possible to only use one internal --- register. +-- Using shift in and shift out may ease timing closure because the routing +-- is more local compared to using a demultiplexer to put the input data in +-- the input register and a multiplexer to get the data directly from the +-- output register. For the demultiplexer / multiplexer it would be possible +-- to only use one internal register. +-- Using shift up is sufficient, the shift down option is not needed. With +-- shift up the data is input a [0] and output the high index. -- Instead of requiring an snk_in.valid duty cycle this dp_repack_dev uses -- snk_out.ready flow control and can handle src_in.ready flow control. +-- . The case of g_in_dat_w*g_in_nof_words /= g_out_dat_w*g_out_nof_words +-- needs to be supported for both < and also > to be able to use a pack and +-- a unpack instance. -- -- Design steps: --- * Day 1 --- . Studied original dp_repack with shift in stage, buffer stage and shift --- out stage. Concluded that: --- - the buffer stage is not needed --- - using shift in and shift out stages is better than using one stage --- with input demux and output mux. --- - using shift up is sufficient, the shift down optionvis not needed. --- With shift up the data is input a [0] and output the high index. --- . Design improvements: --- - Treat the input stage and output stage as two separate components, --- each introducing 1 cycle pipeline and each with its own set of --- registers (r_in and r_out). Describe them using the Gaisler two --- process method. --- - Support c_out_buf_dat_w > c_in_buf_dat_w --- . Started the new dp_repack with streaming interfaces and flow control --- in a new file dp_repack_dev.vhd. Copied tb_dp_repack.vhd to --- tb_dp_repack_dev.vhd. --- . Treat the input stage and output stage as two separate components, --- each introducing 1 cycle pipeline and each with its own registers --- (r_in and r_out). Describe them using the Gaisler two process method. --- . Distinghuised generate cases for g_in_nof_words=1 or >1 and similar --- for g_out_nof_words=1 or >1. Started with implementing >1 first for --- r_in and then for r_out. --- . Defined flow control between r_in and r_out using r_in.load (which acts --- as sosi.valid) and r_out_ready (which acts as siso.ready with RL=1). --- * Day 2 --- . Added g_no_unpack to the tb_dp_repack.vhd to be able to verify one DUT --- instead of DUT and inverse opertion DUT together. Being able to verify --- a single DUT and using e_active eases the checking that no clock --- cycles are lost unnecessarily. --- . Verified that the gap between input blocks can be 0, it does not have --- to be >= g_out_nof_words. --- . Added r_out.eos to avoid loosing a clk cycle after loading a new --- subsection. --- . Corrected src_out.empty --- . Corrected src_out.data. --- . Added block diagram drawing in the description. --- . Added multi testbench tb_tb_repack_dev.vhd --- . Committed all. --- --- * Day 3 --- . Panic and distress : I can not get it to work for blocks with multiple --- subsections and also not for flow control. Need to rethink. --- . Split dp_repack_dev into separate dp_repack_in input stage component --- and dp_repack_out output stage component for more clarity. --- --- * Day 4 - +-- * In total the development took 5 days. On day 3 I was in distress because +-- I could not get it to work so I needed to rethink. After changing to the +-- new flow control scheme that uses nxt_r the design was gradually improved +-- by getting the dp_repack_dev instances in tb_tb_dp_repack_dev to work one +-- by one. First only for e_active stimuli and then also for e_random and +-- e_pulse. This step by step approach makes that the bugs appear one by one +-- instead of all together. +-- * The development used the tb_dp_repack_dev testbench that does a pack and +-- an unpack to be able to verify the data. The g_no_unpack and +-- c_enable_repack_in / c_enable_repack_out parameters in the tb were useful +-- to be able to isolate a component for debugging. +-- * First the cases with g_in_nof_words=1 and g_out_nof_words were made to +-- work for different g_pkt_len. Then the empty functionality was added. +-- Then apply external flow control using c_dp_flow_control_enum_arr in +-- the tb_tb_dp_repack_dev was verified resulting in small corrections. +-- Then verified g_in_dat_w*g_in_nof_words /= g_out_dat_w*g_out_nof_words. LIBRARY IEEE, common_lib, dp_lib; USE IEEE.std_logic_1164.ALL; @@ -207,23 +164,23 @@ ARCHITECTURE rtl OF dp_repack_in IS hold_out : t_dp_sosi; -- hold snk_in.sync/sop/eop until end of section and then hold valid src_out until src_in.ready flush : STD_LOGIC; -- shift when snk_in.valid or flush in case the last subsection has < g_in_nof_words dat_bit_cnt : NATURAL RANGE 0 TO c_bit_cnt_max; -- actual nof bits in subsection - pack_bit_cnt : NATURAL RANGE 0 TO c_bit_cnt_max; -- count nof bits in subsection + pack_bit_cnt : NATURAL RANGE 0 TO c_bit_cnt_max; -- count nof bits in subsection END RECORD; - + SIGNAL data_vec : STD_LOGIC_VECTOR(c_in_buf_dat_w-1 DOWNTO 0); - + SIGNAL r_snk_out : t_dp_siso := c_dp_siso_rdy; SIGNAL r : t_reg; SIGNAL nxt_r : t_reg; - + -- Debug signals SIGNAL snk_in_data : STD_LOGIC_VECTOR(g_in_dat_w-1 DOWNTO 0); SIGNAL src_out_data : STD_LOGIC_VECTOR(c_in_buf_dat_w-1 DOWNTO 0); - + SIGNAL dbg_g_in_dat_w : NATURAL := g_in_dat_w; SIGNAL dbg_in_nof_words : NATURAL := g_in_nof_words; SIGNAL dbg_in_symbol_w : NATURAL := g_in_symbol_w; - + BEGIN p_comb : PROCESS(rst, r, snk_in, data_vec, src_in) @@ -240,25 +197,25 @@ BEGIN -------------------------------------------------------------------------- -- Function IF r.hold_out.valid='0' THEN - + -- Clear hold_out for new output valid (= new subsection) IF r.src_out.valid='1' THEN v.hold_out := c_dp_sosi_rst; END IF; - - -- Capture the snk_in block info that is valid at sop and eop + + -- Capture the snk_in block info that is valid at sop and eop IF snk_in.sop='1' THEN v.hold_out.sop := '1'; v.hold_out.sync := snk_in.sync; v.src_out.bsn := snk_in.bsn; v.src_out.channel := snk_in.channel; - END IF; + END IF; IF snk_in.eop='1' THEN v.hold_out.eop := '1'; v.hold_out.empty := SHIFT_UVEC(snk_in.empty, -c_in_empty_lo); -- use snk_in.empty as offset for src_out.empty in nof bits v.src_out.err := snk_in.err; END IF; - + -- Capture the data per subsection in a block IF snk_in.valid='1' OR r.flush='1' THEN -- shift in during block @@ -268,11 +225,11 @@ BEGIN ELSE v.dat_arr(0) := snk_in.data(g_in_dat_w-1 DOWNTO 0); -- shift in valid data END IF; - + -- pack subsection IF r.pack_bit_cnt<c_in_buf_dat_w-g_in_dat_w THEN v.pack_bit_cnt := r.pack_bit_cnt + g_in_dat_w; - + -- early end of pack subsection IF snk_in.eop='1' THEN v.flush := '1'; -- enable flush in case eop occurs before end of pack subsection @@ -285,7 +242,7 @@ BEGIN IF r.flush='0' THEN v.dat_bit_cnt := c_in_buf_dat_w; -- set default subsection pack_bit_cnt END IF; - + -- output input stage into output stage when ready, else hold_out.valid to signal pending output IF src_in.ready='1' THEN v.src_out.valid := '1'; @@ -295,28 +252,28 @@ BEGIN ELSE v.hold_out.valid := '1'; END IF; - END IF; + END IF; END IF; - + -- pass on the v.dat_arr as data vector v.src_out.data := RESIZE_DP_DATA(data_vec); - - -- pass on dat_bit_cnt via DP empty field + + -- pass on dat_bit_cnt via DP empty field v.src_out.empty := INCR_UVEC(v.hold_out.empty, c_in_buf_dat_w - v.dat_bit_cnt); - + ELSE -- pending output IF src_in.ready='1' THEN v.src_out.valid := '1'; - v.src_out.sync := v.hold_out.sync; - v.src_out.sop := v.hold_out.sop; - v.src_out.eop := v.hold_out.eop; + v.src_out.sync := r.hold_out.sync; + v.src_out.sop := r.hold_out.sop; + v.src_out.eop := r.hold_out.eop; v.hold_out.valid := '0'; END IF; END IF; - + ------------------------------------------------------------------------ - -- Reset and nxt_r + -- Reset and nxt_r IF rst = '1' THEN v.src_out := c_dp_sosi_rst; v.hold_out := c_dp_sosi_rst; @@ -327,11 +284,11 @@ BEGIN nxt_r <= v; END PROCESS; - + -------------------------------------------------------------------------- - -- p_in_reg + -- p_reg r <= nxt_r WHEN rising_edge(clk); - + -------------------------------------------------------------------------- -- Wires p_data_vec : PROCESS(nxt_r) @@ -340,30 +297,30 @@ BEGIN data_vec((I+1)*g_in_dat_w-1 DOWNTO I*g_in_dat_w) <= nxt_r.dat_arr(I); END LOOP; END PROCESS; - + -------------------------------------------------------------------------- -- Wired output snk_in_data <= snk_in.data(g_in_dat_w-1 DOWNTO 0); - - src_out <= r.src_out; + + src_out <= r.src_out; src_out_data <= r.src_out.data(c_in_buf_dat_w-1 DOWNTO 0); - + -------------------------------------------------------------------------- -- Flow control - + -- local function flow control - p_flow_control : PROCESS(nxt_r) + p_flow : PROCESS(nxt_r) BEGIN - r_snk_out <= c_dp_siso_rdy; + r_snk_out <= c_dp_siso_rdy; IF nxt_r.flush='1' THEN r_snk_out.ready <= '0'; -- input shift in stage function is always ready except when flushing END IF; END PROCESS; - + -- combined local and remote src_in flow control snk_out.ready <= r_snk_out.ready WHEN nxt_r.hold_out.valid='0' ELSE src_in.ready; -- if there is pending output then the src_in ready determines the flow control snk_out.xon <= src_in.xon; -- just pass on the xon/off frame flow control - + END rtl; @@ -407,26 +364,26 @@ ARCHITECTURE rtl OF dp_repack_out IS hold_out : t_dp_sosi; -- hold src_out valid and sync/sop/eop until src_in.ready shift : STD_LOGIC; -- shift out the dat_arr dat_bit_cnt : NATURAL RANGE 0 TO c_bit_cnt_max; -- actual nof bits in subsection - pack_bit_cnt : NATURAL RANGE 0 TO c_bit_cnt_max; -- count nof bits in subsection - empty_bit_cnt : NATURAL RANGE 0 TO c_bit_cnt_max; -- empty nof bits in subsection - eos : STD_LOGIC; -- end of subsection + pack_bit_cnt : NATURAL RANGE 0 TO c_bit_cnt_max; -- count nof bits in subsection + empty_bit_cnt : NATURAL RANGE 0 TO c_bit_cnt_max; -- empty nof bits in subsection + eos : STD_LOGIC; -- end of subsection END RECORD; - + SIGNAL data_vec : STD_LOGIC_VECTOR(c_out_buf_dat_w-1 DOWNTO 0) := (OTHERS=>'0'); - + SIGNAL r_snk_out : t_dp_siso := c_dp_siso_rdy; SIGNAL r : t_reg; SIGNAL nxt_r : t_reg; - + -- Debug signals SIGNAL snk_in_data : STD_LOGIC_VECTOR(g_in_buf_dat_w-1 DOWNTO 0); SIGNAL src_out_data : STD_LOGIC_VECTOR(g_out_dat_w-1 DOWNTO 0); - + SIGNAL dbg_g_in_buf_dat_w : NATURAL := g_in_buf_dat_w; SIGNAL dbg_g_out_dat_w : NATURAL := g_out_dat_w; SIGNAL dbg_out_nof_words : NATURAL := g_out_nof_words; SIGNAL dbg_out_symbol_w : NATURAL := g_out_symbol_w; - + BEGIN p_comb : PROCESS(rst, snk_in, r, data_vec, src_in) @@ -439,12 +396,11 @@ BEGIN v.src_out.valid := '0'; v.src_out.sop := '0'; v.src_out.eop := '0'; - v.eos := '0'; - + ------------------------------------------------------------------------ -- Function IF r.hold_out.valid='0' THEN - + -- Clear hold_out for new output valid IF r.src_out.valid='1' THEN v.hold_out.sync := '0'; @@ -453,55 +409,55 @@ BEGIN IF r.src_out.eop='1' THEN v.hold_out.eop := '0'; END IF; - - -- Capture the snk_in block info that is valid at sop and eop + + -- Capture the snk_in block info that is valid at sop and eop IF snk_in.sop='1' THEN v.hold_out.sop := '1'; v.hold_out.sync := snk_in.sync; v.src_out.bsn := snk_in.bsn; v.src_out.channel := snk_in.channel; - END IF; + END IF; IF snk_in.eop='1' THEN v.hold_out.eop := '1'; -- local function will calculate src_out.empty based on snk_in.empty v.src_out.err := snk_in.err; END IF; - + IF r.shift='1' THEN -- shift out rest of subsection v.hold_out.valid := '1'; - + v.dat_arr(g_out_nof_words-1 DOWNTO 1) := r.dat_arr(g_out_nof_words-2 DOWNTO 0); -- shift up from low to high and shift out at high index v.dat_arr(0) := (OTHERS=>'0'); -- shift in data=0 - + v.pack_bit_cnt := r.pack_bit_cnt - g_out_dat_w; - + -- end of pack subsection IF v.pack_bit_cnt<=r.empty_bit_cnt THEN v.eos := '1'; -- end of subsection, so ready for new snk_in v.shift := '0'; -- stop shifting END IF; - + ELSIF snk_in.valid='1' THEN -- start of pack subsection v.hold_out.valid := '1'; - + FOR I IN 0 TO g_out_nof_words-1 LOOP v.dat_arr(I) := data_vec((I+1)*g_out_dat_w-1 DOWNTO I*g_out_dat_w); END LOOP; - + v.dat_bit_cnt := g_in_buf_dat_w - TO_UINT(snk_in.empty); -- pass on dat_bit_cnt via DP empty field v.pack_bit_cnt := c_out_buf_dat_w - g_out_dat_w; v.empty_bit_cnt := c_out_buf_dat_w - v.dat_bit_cnt; v.eos := '0'; v.shift := '1'; - + -- end of pack subsection IF v.pack_bit_cnt<=v.empty_bit_cnt THEN v.eos := '1'; -- end of subsection, so ready for new snk_in v.shift := '0'; END IF; END IF; - + -- fill in local empty if this is the last subsection of a block IF v.eos='1' THEN IF v.hold_out.eop='1' THEN @@ -509,7 +465,7 @@ BEGIN v.src_out.empty := SHIFT_UVEC(v.src_out.empty, c_out_empty_lo); -- in nof symbols END IF; END IF; - + -- pass on the v.dat_arr as data vector v.src_out.data := RESIZE_DP_DATA(v.dat_arr(g_out_nof_words-1)); @@ -525,20 +481,20 @@ BEGIN v.hold_out.valid := '0'; END IF; END IF; - + ELSE -- pending output IF src_in.ready='1' THEN v.src_out.valid := '1'; - v.src_out.sync := v.hold_out.sync; - v.src_out.sop := v.hold_out.sop; - IF v.eos='1' THEN - v.src_out.eop := v.hold_out.eop; -- output eop at end of subsection + v.src_out.sync := r.hold_out.sync; + v.src_out.sop := r.hold_out.sop; + IF r.eos='1' THEN + v.src_out.eop := r.hold_out.eop; -- output eop at end of subsection END IF; v.hold_out.valid := '0'; END IF; END IF; - + ------------------------------------------------------------------------ -- Reset and nxt_r IF rst = '1' THEN @@ -553,38 +509,38 @@ BEGIN nxt_r <= v; END PROCESS; - + -------------------------------------------------------------------------- - -- p_out_reg + -- p_reg r <= nxt_r WHEN rising_edge(clk); -------------------------------------------------------------------------- -- Wires data_vec(c_out_buf_dat_w-1 DOWNTO c_out_buf_dat_lo) <= snk_in.data(g_in_buf_dat_w-1 DOWNTO 0); - + -------------------------------------------------------------------------- -- Wired output snk_in_data <= snk_in.data(g_in_buf_dat_w-1 DOWNTO 0); - - src_out <= r.src_out; + + src_out <= r.src_out; src_out_data <= r.src_out.data(g_out_dat_w-1 DOWNTO 0); - + -------------------------------------------------------------------------- -- Flow control - + -- local function flow control - p_flow_control : PROCESS(nxt_r) + p_flow : PROCESS(nxt_r) BEGIN - r_snk_out <= c_dp_siso_rdy; + r_snk_out <= c_dp_siso_rdy; IF nxt_r.shift='1' AND nxt_r.eos='0' THEN r_snk_out.ready <= '0'; -- output shift out stage function is only ready when it is not shifting or at the end of the subsection END IF; END PROCESS; - + -- combined local and remote src_in flow control snk_out.ready <= r_snk_out.ready WHEN nxt_r.hold_out.valid='0' ELSE src_in.ready; -- if there is pending output then the src_in ready determines the flow control snk_out.xon <= src_in.xon; -- just pass on the xon/off frame flow control - + END rtl; @@ -621,34 +577,34 @@ END dp_repack_dev; ARCHITECTURE str OF dp_repack_dev IS CONSTANT c_in_buf_dat_w : NATURAL := g_in_dat_w * g_in_nof_words; - + SIGNAL snk_in_data : STD_LOGIC_VECTOR(g_in_dat_w-1 DOWNTO 0); SIGNAL i_snk_out : t_dp_siso; - + SIGNAL pack_siso : t_dp_siso; SIGNAL pack_sosi : t_dp_sosi; SIGNAL pack_sosi_data : STD_LOGIC_VECTOR(c_in_buf_dat_w-1 DOWNTO 0); - + SIGNAL i_src_out : t_dp_sosi; SIGNAL src_out_data : STD_LOGIC_VECTOR(g_out_dat_w-1 DOWNTO 0); - + SIGNAL snk_out_ready_reg : STD_LOGIC_VECTOR(0 TO c_dp_stream_rl); SIGNAL pack_ready_reg : STD_LOGIC_VECTOR(0 TO c_dp_stream_rl); - + BEGIN snk_out <= i_snk_out; src_out <= i_src_out; - + snk_in_data <= snk_in.data(g_in_dat_w-1 DOWNTO 0); pack_sosi_data <= pack_sosi.data(c_in_buf_dat_w-1 DOWNTO 0); src_out_data <= i_src_out.data(g_out_dat_w-1 DOWNTO 0); - + no_dp_repack_in : IF g_enable_repack_in=FALSE GENERATE i_snk_out <= pack_siso; pack_sosi <= snk_in; END GENERATE; - + gen_dp_repack_in : IF g_enable_repack_in=TRUE GENERATE u_dp_repack_in : ENTITY work.dp_repack_in GENERIC MAP ( @@ -659,20 +615,20 @@ BEGIN PORT MAP ( rst => rst, clk => clk, - + snk_out => i_snk_out, snk_in => snk_in, - + src_in => pack_siso, src_out => pack_sosi ); END GENERATE; - + no_dp_repack_out : IF g_enable_repack_out=FALSE GENERATE pack_siso <= src_in; i_src_out <= pack_sosi; END GENERATE; - + gen_dp_repack_out : IF g_enable_repack_out=TRUE GENERATE u_dp_repack_out : ENTITY work.dp_repack_out GENERIC MAP ( @@ -684,17 +640,17 @@ BEGIN PORT MAP ( rst => rst, clk => clk, - + snk_out => pack_siso, snk_in => pack_sosi, - + src_in => src_in, src_out => i_src_out ); END GENERATE; - + -- Simulation only: internal stream RL verification - --proc_dp_siso_alert(clk, snk_in, i_snk_out, snk_out_ready_reg); - --proc_dp_siso_alert(clk, pack_sosi, pack_siso, pack_ready_reg); - + proc_dp_siso_alert(clk, snk_in, i_snk_out, snk_out_ready_reg); + proc_dp_siso_alert(clk, pack_sosi, pack_siso, pack_ready_reg); + END str;