verilog: add sv_maps iterators
[ghdl-vlg.git] / testsuite / synth / issue1781 / imem.vhdl
blob0ece4ebf69772cf094856dd2599d29b598c9882c
1 library ieee;
2 use ieee.std_logic_1164.all;
3 use ieee.numeric_std.all;
5 entity imem is
6   generic (
7     IMEM_BASE : std_ulogic_vector(31 downto 0) := x"00000000";
8     IMEM_SIZE : natural := 4*1024
9   );
10   port (
11     clk_i  : in  std_ulogic;
12     rden_i : in  std_ulogic;
13     wren_i : in  std_ulogic;
14     ben_i  : in  std_ulogic_vector(03 downto 0);
15     addr_i : in  std_ulogic_vector(31 downto 0);
16     data_i : in  std_ulogic_vector(31 downto 0);
17     data_o : out std_ulogic_vector(31 downto 0);
18     ack_o  : out std_ulogic
19   );
20 end entity;
22 architecture ok of imem is
23   signal addr : std_ulogic_vector(15 downto 0);
24   type ram_t is array(0 to 2**15-1) of std_ulogic_vector(31 downto 0);
25   signal acc_en : std_ulogic;
26   constant abb_c : std_logic_vector(31 downto 16) := (others=>'0');
27 begin
28   addr <= addr_i(addr'left+2 downto 2); -- word aligned
29   acc_en <= addr_i(abb_c'range) ?= IMEM_BASE(abb_c'range);
30   process(clk_i)
31   variable memory : ram_t;
32   begin
33   if rising_edge(clk_i) then
34     if acc_en then
35       ack_o <= rden_i or wren_i;
36     end if;
37     if acc_en and wren_i then
38       for x in 0 to 3 loop
39         if ben_i(x) then
40           memory(to_integer(unsigned(addr)))((x+1)*8-1 downto x*8) := data_i((x+1)*8-1 downto x*8);
41         end if;
42       end loop;
43     end if;
44     if acc_en and rden_i then
45       data_o <= memory(to_integer(unsigned(addr)));
46     end if;
47   end if;
48   end process;
49 end architecture;
51 architecture notok of imem is
52   signal addr : std_ulogic_vector(15 downto 0);
53   type ram_t is array(0 to 2**15-1) of std_ulogic_vector(31 downto 0);
54   signal acc_en : std_ulogic;
55   constant abb_c : std_logic_vector(31 downto 16) := (others=>'0');
56 begin
57   addr <= addr_i(addr'left+2 downto 2); -- word aligned
58   acc_en <= addr_i(abb_c'range) ?= IMEM_BASE(abb_c'range);
59   process(clk_i)
60   variable memory : ram_t;
61   begin
62   if rising_edge(clk_i) and acc_en='1' then
63     ack_o <= rden_i or wren_i;
64     if wren_i then
65       for x in 0 to 3 loop
66         if ben_i(x) then
67           memory(to_integer(unsigned(addr)))((x+1)*8-1 downto x*8) := data_i((x+1)*8-1 downto x*8);
68         end if;
69       end loop;
70     end if;
71     if rden_i then
72       data_o <= memory(to_integer(unsigned(addr)));
73     end if;
74   end if;
75   end process;
76 end architecture;
78 architecture neitherok of imem is
79     signal addr : std_ulogic_vector(15 downto 0);
80     type ram_t is array(0 to 2**15-1) of std_ulogic_vector(31 downto 0);
81     signal acc_en : std_ulogic;
82     constant abb_c : std_logic_vector(31 downto 16) := (others=>'0');
83   begin
84     addr <= addr_i(addr'left+2 downto 2); -- word aligned
85     acc_en <= addr_i(abb_c'range) ?= IMEM_BASE(abb_c'range);
86     process(clk_i)
87     variable memory : ram_t;
88     begin
89     if rising_edge(clk_i) then
90       if acc_en then
91         ack_o <= rden_i or wren_i;
92         if wren_i then
93           for x in 0 to 3 loop
94             if ben_i(x) then
95               memory(to_integer(unsigned(addr)))((x+1)*8-1 downto x*8) := data_i((x+1)*8-1 downto x*8);
96             end if;
97           end loop;
98         end if;
99         if rden_i then
100           data_o <= memory(to_integer(unsigned(addr)));
101         end if;
102       end if;
103     end if;
104     end process;
105   end architecture;