verilog: add sv_maps iterators
[ghdl-vlg.git] / testsuite / synth / issue2053 / generic_fifo_fwft.vhdl
blobc226aade0367af32a6be1e958400d591c97c428f
1 library ieee;
2 use ieee.numeric_std.all;
3 use ieee.std_logic_1164.all;
5 entity generic_fifo_fwft is 
6   generic (
7     type stream_t;
8     size : integer := 256;
9     async_reset : boolean := false
10   );
11   port (
12          clk     : in  std_logic;
13          rst     : in  std_logic;
14          datain  : in  stream_t;
15          dataout : out stream_t;
16          empty   : out std_logic;
17          full    : out std_logic;
18          wr      : in  std_logic;
19          rd      : in  std_logic
20        );
21 end;
22 architecture a_generic_fifo_fwft of generic_fifo_fwft is 
23   type memory_t is array(size-1 downto 0) of stream_t;
24   signal wrptr : integer range 0 to size - 1;
25   signal rdptr : integer range 0 to size - 1;
26   signal mem : memory_t;
27   signal inverted : boolean;
28 begin
30   empty <= '1' when (rdptr = wrptr) and not inverted else '0';
31   full  <= '1' when (rdptr = wrptr) and     inverted else '0';
33   dataout <= mem(rdptr);
35   process (all) is
36   begin
37     if rising_edge(clk) then
38       if wr and not full then
39         mem(wrptr) <= datain;
40         wrptr <= wrptr + 1;
41       end if;
42       if rd and not empty then
43         rdptr <= rdptr + 1;
44       end if;
45       if wr and rd then
46         null;
47       elsif wr and not full then
48         inverted <= not inverted when wrptr + 1 mod size < wrptr;
49       elsif rd and not empty then
50         inverted <= not inverted when rdptr + 1 mod size < rdptr;
51       end if;
52       if not async_reset then
53         if rst then
54           inverted <= false;
55           rdptr <= 0;
56           wrptr <= 0;
57         end if;
58       end if;
59     end if;
60     if async_reset then
61       if rst then
62         inverted <= false;
63         rdptr <= 0;
64         wrptr <= 0;
65       end if;
66     end if;
67   end process;
68 end;