@@ -71,6 +71,7 @@ entity RX_DMA_CALYPTE_HDR_MANAGER is
7171 ADDR_HEADER_BASE : in std_logic_vector (ADDR_WIDTH- 1 downto 0 );
7272 ADDR_HEADER_MASK : in std_logic_vector (POINTER_WIDTH- 1 downto 0 );
7373 ADDR_HEADER_SW_POINTER : in std_logic_vector (POINTER_WIDTH- 1 downto 0 );
74+ ADDR_HEADER_P2P_EN : in std_logic ;
7475
7576 -- =====================================================================
7677 -- HW POINTER UPDATE INTERFACE
@@ -195,7 +196,7 @@ architecture FULL of RX_DMA_CALYPTE_HDR_MANAGER is
195196 -- PCIe header FIFOs
196197 -- =============================================================================================
197198 -- Width of data in the FIFO for PCIe headers of transactions carrying DMA header
198- constant PCIE_HDR_DMA_TRAN_FIFO_W : natural := 128 ;
199+ constant PCIE_HDR_DMA_TRAN_FIFO_W : natural := 128 + 1 + 1 ;
199200 constant PCIE_HDR_DMA_TRAN_FIFO_SIZE : natural := 8 ;
200201 -- Width of data in the FIFO for PCIe headers of transactions carrying user data
201202 constant PCIE_HDR_DATA_TRAN_FIFO_W : natural := 128 ;
@@ -237,11 +238,14 @@ architecture FULL of RX_DMA_CALYPTE_HDR_MANAGER is
237238 -- Address for a DMA header PCIe transaction
238239 signal dma_hdr_pcie_addr : std_logic_vector (ADDR_WIDTH - 1 downto 0 );
239240 signal dma_hdr_pcie_addr_reg : std_logic_vector (ADDR_WIDTH - 1 downto 0 );
241+ signal dma_hdr_ptr : std_logic_vector (POINTER_WIDTH - 1 downto 0 );
240242 signal dma_hdr_pcie_addr_vld : std_logic ;
241243 -- determines if the PCIe header is the size of 3 or 4 DWs
242244 signal pcie_addr_len_dma_hdr_tran : std_logic ;
243245 -- Content of a PCIe header for a transaction with DMA header
244246 signal pcie_hdr_dma_hdr_tran : std_logic_vector (128 - 1 downto 0 );
247+ signal dma_hdr_p2p_en : std_logic ;
248+ signal dma_hdr_p2p_en_reg : std_logic ;
245249
246250 -- =============================================================================================
247251 -- FSM that tracks the current state of the packet reception
@@ -266,6 +270,10 @@ architecture FULL of RX_DMA_CALYPTE_HDR_MANAGER is
266270 signal dma_hdr_addr_next : std_logic ;
267271 signal dma_hdr_addr_next_n : std_logic ;
268272 signal dma_hdr_addr_next_wr : std_logic ;
273+ signal vld_bits_per_ch : std_logic_vector (CHANNELS - 1 downto 0 );
274+ signal vld_bit_sel : std_logic ;
275+ signal vld_bit_out : std_logic ;
276+ signal p2p_en_out : std_logic ;
269277
270278 signal pkt_chan_reg : std_logic_vector (log2 (CHANNELS) - 1 downto 0 );
271279 signal pkt_chan_new : std_logic_vector (log2 (CHANNELS) - 1 downto 0 );
@@ -761,6 +769,7 @@ begin
761769 ADDR_BASE => ADDR_DATA_BASE,
762770 ADDR_MASK => ADDR_DATA_MASK,
763771 ADDR_SW_POINTER => ADDR_DATA_SW_POINTER,
772+ ADDR_P2P_EN => '0' ,
764773
765774 POINTER_UPDATE_CHAN => HDP_UPDATE_CHAN,
766775 POINTER_UPDATE_DATA => HDP_UPDATE_DATA,
@@ -774,6 +783,7 @@ begin
774783
775784 ADDR => data_pcie_addr,
776785 OFFSET => data_ptr,
786+ P2P_EN => open ,
777787 ADDR_VLD => data_pcie_addr_vld
778788 );
779789
@@ -813,6 +823,7 @@ begin
813823 ADDR_BASE => ADDR_HEADER_BASE,
814824 ADDR_MASK => ADDR_HEADER_MASK,
815825 ADDR_SW_POINTER => ADDR_HEADER_SW_POINTER,
826+ ADDR_P2P_EN => ADDR_HEADER_P2P_EN,
816827
817828 POINTER_UPDATE_CHAN => HHP_UPDATE_CHAN,
818829 POINTER_UPDATE_DATA => HHP_UPDATE_DATA,
@@ -825,7 +836,8 @@ begin
825836 START_REQ_CHANNEL => START_REQ_CHANNEL,
826837
827838 ADDR => dma_hdr_pcie_addr,
828- OFFSET => open ,
839+ OFFSET => dma_hdr_ptr,
840+ P2P_EN => dma_hdr_p2p_en,
829841 ADDR_VLD => dma_hdr_pcie_addr_vld
830842 );
831843
@@ -856,10 +868,29 @@ begin
856868 dma_hdr_pcie_addr_reg <= dma_hdr_pcie_addr;
857869 pcie_hdr_dma_hdr_tran_fifo_wr <= dma_hdr_pcie_addr_vld;
858870 pcie_addr_len_dma_hdr_tran <= '1' when (DEVICE = " ULTRASCALE" or dma_hdr_pcie_addr(64 - 1 downto 32 ) /= (32 - 1 downto 0 => '0' )) else '0' ;
871+ dma_hdr_p2p_en_reg <= dma_hdr_p2p_en;
872+ vld_bit_sel <= vld_bits_per_ch(to_integer (unsigned (dma_hdr_addr_chan)));
859873 end if ;
860874 end process ;
861875
862- pcie_hdr_dma_hdr_tran_fifo_in <= pcie_hdr_dma_hdr_tran;
876+ vld_bit_flip_p : process (CLK) is
877+ begin
878+ if (rising_edge (CLK)) then
879+ if (RESET = '1' ) then
880+ vld_bits_per_ch <= (others => '1' );
881+ else
882+ if (dma_hdr_pcie_addr_vld = '1' and dma_hdr_ptr = ADDR_HEADER_MASK) then
883+ vld_bits_per_ch(to_integer (unsigned (dma_hdr_addr_chan))) <= not vld_bits_per_ch(to_integer (unsigned (dma_hdr_addr_chan)));
884+ end if ;
885+
886+ if (START_REQ_VLD = '1' ) then
887+ vld_bits_per_ch(to_integer (unsigned (START_REQ_CHANNEL))) <= '1' ;
888+ end if ;
889+ end if ;
890+ end if ;
891+ end process ;
892+
893+ pcie_hdr_dma_hdr_tran_fifo_in <= pcie_hdr_dma_hdr_tran & vld_bit_sel & dma_hdr_p2p_en_reg;
863894
864895 pcie_hdr_dma_hdr_tran_fifo_i : entity work.FIFOX
865896 generic map (
@@ -887,9 +918,9 @@ begin
887918 AEMPTY => open
888919 );
889920
890- DMA_PCIE_HDR <= pcie_hdr_dma_hdr_tran_fifo_do;
891- DMA_PCIE_HDR_SRC_RDY <= not pcie_hdr_dma_hdr_tran_fifo_empty;
892- pcie_hdr_dma_hdr_tran_fifo_rd <= DMA_PCIE_HDR_DST_RDY;
921+ ( DMA_PCIE_HDR, vld_bit_out, p2p_en_out) <= pcie_hdr_dma_hdr_tran_fifo_do;
922+ DMA_PCIE_HDR_SRC_RDY <= not pcie_hdr_dma_hdr_tran_fifo_empty;
923+ pcie_hdr_dma_hdr_tran_fifo_rd <= DMA_PCIE_HDR_DST_RDY;
893924
894925 pcie_hdr_data_tran_reg_p : process (CLK) is
895926 begin
@@ -1059,8 +1090,9 @@ begin
10591090 DMA_DISCARD <= discard_fifo_do(0 );
10601091 DMA_HDR <= (24 - 1 downto METADATA_SIZE => '0' )
10611092 & hdr_meta_fifo_do
1062- & (7 - 1 downto 0 => '0' )
1063- & '1'
1093+ & (6 - 1 downto 0 => '0' )
1094+ & p2p_en_out
1095+ & vld_bit_out
10641096 & std_logic_vector (resize (unsigned (ptr_fifo_do), 16 ))
10651097 & (16 - 1 downto log2 (PKT_MTU+ 1 ) => '0' )
10661098 & pkt_size_fifo_do;
0 commit comments