library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity fwft_fifo is generic ( Formal : boolean := true; Depth : positive := 16; Width : positive := 16 ); port ( Reset_n_i : in std_logic; Clk_i : in std_logic; -- write Wen_i : in std_logic; Din_i : in std_logic_vector(Width-1 downto 0); Full_o : out std_logic; Werror_o : out std_logic; -- read Ren_i : in std_logic; Dout_o : out std_logic_vector(Width-1 downto 0); Empty_o : out std_logic; Rerror_o : out std_logic ); end entity fwft_fifo; architecture rtl of fwft_fifo is signal s_empty : std_logic; signal s_ren : std_logic; begin i_fifo : entity work.fifo generic map ( Formal => Formal, Depth => Depth, Width => Width ) port map ( Reset_n_i => Reset_n_i, Clk_i => Clk_i, -- write Wen_i => Wen_i, Din_i => Din_i, Full_o => Full_o, Werror_o => Werror_o, -- read Ren_i => s_ren, Dout_o => Dout_o, Empty_o => s_empty, Rerror_o => open ); s_ren <= not s_empty and (Empty_o or Ren_i); ReadFlagsP : process (Reset_n_i, Clk_i) is begin if (Reset_n_i = '0') then Empty_o <= '1'; Rerror_o <= '0'; elsif (rising_edge(Clk_i)) then Rerror_o <= Ren_i and Empty_o; if (s_ren = '1') then Empty_o <= '0'; elsif (Ren_i = '1') then Empty_o <= '1'; end if; end if; end process ReadFlagsP; FormalG : if Formal generate default clock is rising_edge(Clk_i); -- Initial reset RESTRICT_RESET : restrict {not Reset_n_i[*3]; Reset_n_i[+]}[*1]; -- Inputs are low during reset for simplicity ASSUME_INPUTS_DURING_RESET : assume always not Reset_n_i -> not Wen_i and not Ren_i; end generate FormalG; end architecture rtl;