aboutsummaryrefslogtreecommitdiffstats
path: root/testsuite/gna/issue1833/test.vhdl
blob: 15e3edb8a6b4d91ff58cfe520a83e9801e27d51a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
library ieee;

entity shared2 is

  type scounter is protected
    use ieee.std_logic_1164.all;    ---<<<<   test target
    impure function inc (by : integer) return integer;
    impure function get return integer;
  end protected;

  type scounter is protected body
    variable cnt : integer := 0;

    impure function inc (by : integer) return integer is
    begin
      cnt := cnt + by;
      return cnt;
    end function;

    impure function get return integer is
    begin
      return cnt;
    end function;
  end protected body;

end entity shared2;

architecture rtl of shared2 is

  shared variable tcnt : scounter;
  signal clk : bit := '0';
  signal term : integer := 0;

begin

  process(clk)
    variable tv : integer;
  begin
    if clk'event and clk = '1' then
      tv := tcnt.inc(1);
    end if;
  end process;


  process(clk)
    variable tv : integer;
  begin
    if clk'event and clk = '0' then
      tv := tcnt.inc(2);
    end if;
  end process;


  process
  begin
    clk <= not clk;
    wait for 1 ns;
  end process;

  process
  begin
    if clk'event and clk = '0' then
      if term >= 20 then
        report "Sim end ...."; -- severity failure;
        std.env.finish;
      end if;
      term <= term + 1;
      report integer'image(tcnt.get);
    end if;
    wait on clk;
  end process;


end rtl;