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;
|