aboutsummaryrefslogtreecommitdiffstats
path: root/testsuite/gna/issue1597/proc_pkg.vhdl
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/gna/issue1597/proc_pkg.vhdl')
-rw-r--r--testsuite/gna/issue1597/proc_pkg.vhdl212
1 files changed, 212 insertions, 0 deletions
diff --git a/testsuite/gna/issue1597/proc_pkg.vhdl b/testsuite/gna/issue1597/proc_pkg.vhdl
new file mode 100644
index 000000000..7a12aafda
--- /dev/null
+++ b/testsuite/gna/issue1597/proc_pkg.vhdl
@@ -0,0 +1,212 @@
+------------------------------------------------
+--! Test intent : declaration of procedure in package
+--! Test scope : function with active checking
+--! Keywords : [function, attribute, active]
+--! References : [VH2000 1.1:]
+--! [Rlink REQ00:2.1.1.2.1]
+--! [Rlink REQ00:14.1.38]
+--
+-------------------------------------------------
+-- declare a procedures and functions to demonstrate
+-- attributes.
+-- with partially driven bus we should see ativity as expected.
+--
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.std_logic_arith.all;
+use ieee.std_logic_unsigned.all;
+use work.subs_pkg.all;
+
+package proc_pkg is
+
+ type ctl_if_t is record
+ d1 : std_logic_vector(31 downto 0);
+ d2 : std_logic_vector(31 downto 0);
+ a1 : std_logic_vector(15 downto 0);
+ wr : std_logic;
+ di : std_logic_vector(63 downto 0);
+ dv : std_logic;
+ end record;
+
+ type rsp_if_t is record
+ do1 : std_logic_vector(31 downto 0);
+ do2 : std_logic_vector(31 downto 0);
+ sel : std_logic_vector(3 downto 0);
+ addr : std_logic_vector(11 downto 0);
+ do : std_logic_vector(63 downto 0);
+ end record;
+
+ type marr_t is array(15 downto 0) of std_logic_vector(63 downto 0);
+ type arr_marr_t is array(3 downto 0) of marr_t;
+
+ procedure mem_access(signal ctl : in ctl_if_t;
+ signal rsp : out rsp_if_t;
+ signal mem : inout arr_marr_t;
+ signal ack : out std_logic);
+
+ procedure mem_obj(signal mem : in marr_t;
+ signal addr : in std_logic_vector(11 downto 0);
+ signal wr : in std_logic;
+ signal w_in : in std_logic_vector(63 downto 0);
+ signal mem_out : out marr_t;
+ signal dout : out std_logic_vector(63 downto 0)
+ );
+
+ procedure proc_mix(signal val1 : in std_logic_vector;
+ signal val2 : in std_logic_vector);
+
+ function kslv2int(vec : std_logic_vector) return integer;
+
+ function active_bit(signal vec : std_logic_vector;
+ idx : integer) return boolean;
+
+ function active_bits(signal vec : std_logic_vector) return std_logic_vector;
+
+ procedure act_mon(signal ctl : in ctl_if_t;
+ signal rsp : in rsp_if_t;
+ signal act : out boolean
+ );
+
+end package proc_pkg;
+
+package body proc_pkg is
+
+ -- activity functions.
+ function active_bit(signal vec : std_logic_vector;
+ idx : integer) return boolean is
+ begin
+ return vec(idx)'active;
+ end function;
+
+
+ function active_bits(signal vec : std_logic_vector) return std_logic_vector is
+ variable rtnv : std_logic_vector(vec'range);
+ begin
+ for i in vec'range loop
+ if active_bit(vec, i) then
+ rtnv(i) := '1';
+ else
+ rtnv(i) := '0';
+ end if;
+ end loop;
+ return rtnv;
+ end function;
+
+
+ -- convert std_logic_vector to integer.
+ function kslv2int(vec : std_logic_vector) return integer is
+ variable rtn : integer := 0;
+ variable len : integer := (vec'length) - 1;
+ begin
+ --report "Vector in: " & slv2str(vec);
+ for i in vec'range loop
+ if vec(i) = '1' then
+ rtn := rtn + (2**i);
+ end if;
+ end loop;
+ --report "Integer out: " & integer'image(rtn);
+ return rtn;
+ end function;
+
+ procedure act_mon(signal ctl : in ctl_if_t;
+ signal rsp : in rsp_if_t;
+ signal act : out boolean
+ ) is
+ variable delta : integer := 0;
+ variable ltime : time;
+ begin
+ while true loop
+ act <= false;
+ if ctl'active then
+ report "ctl is active ...";
+ end if;
+
+ if rsp'active then
+ report "rsp is active ...";
+ end if;
+
+ if ctl'active or rsp'active then
+ if ltime = now then
+ delta := delta + 1;
+ else
+ delta := 0;
+ end if;
+ report "delta now at: " & integer'image(delta);
+ act <= true;
+ end if;
+ ltime := now;
+ --wait for 0 ps;
+ wait on ctl, rsp;
+ end loop;
+ end procedure;
+
+
+
+ -- access the memory passed.
+ procedure mem_obj(signal mem : in marr_t;
+ signal addr : in std_logic_vector(11 downto 0);
+ signal wr : in std_logic;
+ signal w_in : in std_logic_vector(63 downto 0);
+ signal mem_out : out marr_t;
+ signal dout : out std_logic_vector(63 downto 0)
+ ) is
+ variable idx : integer := 0;
+ begin
+ idx := kslv2int(addr);
+ --report integer'image(idx);
+ dout(63 downto 16) <= mem(kslv2int(addr(3 downto 0)))(63 downto 16);
+ mem_out <= mem;
+ if wr = '1' then
+ --report "Writing mem ...";
+ mem_out(kslv2int(addr(3 downto 0))) <= w_in;
+ end if;
+ wait for 0 ps;
+ end procedure;
+
+ -- do a request for memory access.
+ procedure mem_access(signal ctl : in ctl_if_t;
+ signal rsp : out rsp_if_t;
+ signal mem : inout arr_marr_t;
+ signal ack : out std_logic) is
+ --variable rsp_v : std_logic;
+ variable idx : integer;
+ begin
+ ack <= '0';
+ case ctl.a1(7 downto 4) is
+ when "0000" =>
+ mem_obj(mem(0), ctl.a1(11 downto 0), ctl.wr, ctl.di, mem(0), rsp.do);
+ when "0001" =>
+ mem_obj(mem(1), ctl.a1(11 downto 0), ctl.wr, ctl.di, mem(1), rsp.do);
+ when "0010" =>
+ mem_obj(mem(2), ctl.a1(11 downto 0), ctl.wr, ctl.di, mem(2), rsp.do);
+ when "0011" =>
+ mem_obj(mem(3), ctl.a1(11 downto 0), ctl.wr, ctl.di, mem(3), rsp.do);
+ when others =>
+ mem_obj(mem(0), ctl.a1(11 downto 0), ctl.wr, ctl.di, mem(0), rsp.do);
+ end case;
+
+ ack <= '1';
+ --wait until = '1';
+ end procedure;
+
+ -- the test procedure implemenation
+ procedure proc_mix(signal val1 : in std_logic_vector;
+ signal val2 : in std_logic_vector) is
+ variable tmp : bit_vector(val1'high downto val1'low);
+ variable tmp2 : bit_vector(val2'high downto val2'low);
+ begin
+ report "----- start of call ----";
+ wait for 0.5 ns; --<< get us off the rising edge event let data settle
+ tmp := to_bitvector(val1);
+ report "val1 got: " & bv2str(tmp);
+ tmp2 := to_bitvector(val2);
+ report "val2 got: " & bv2str(tmp2);
+ wait for 2 ns; --<< get us off the rising edge after next data change.
+ report "----- then ----";
+ tmp := to_bitvector(val1);
+ report "val1 got: " & bv2str(tmp);
+ tmp2 := to_bitvector(val2);
+ report "val2 got: " & bv2str(tmp2);
+ end procedure;
+
+end proc_pkg;