diff options
Diffstat (limited to 'testsuite/gna')
-rw-r--r-- | testsuite/gna/issue816/repro.vhdl | 40 | ||||
-rw-r--r-- | testsuite/gna/issue816/test.vhdl | 74 | ||||
-rwxr-xr-x | testsuite/gna/issue816/testsuite.sh | 10 |
3 files changed, 124 insertions, 0 deletions
diff --git a/testsuite/gna/issue816/repro.vhdl b/testsuite/gna/issue816/repro.vhdl new file mode 100644 index 000000000..f67e38825 --- /dev/null +++ b/testsuite/gna/issue816/repro.vhdl @@ -0,0 +1,40 @@ +library ieee; +context ieee.ieee_std_context; + +package integer_vector_ptr_pkg is + subtype index_t is integer range -1 to integer'high; + type integer_vector_ptr_t is record + index : index_t; + end record; + + impure function get(ptr : integer_vector_ptr_t; index : integer) + return integer; + +end package; + +entity tb_test is + generic ( runner_cfg : string ); +end entity; + +use work.integer_vector_ptr_pkg.all; + +architecture tb of tb_test is + + constant params: integer_vector_ptr_t := (index => 0); + + type time_t is array (natural range 0 to 1) of natural; + + procedure get_time(variable t: inout time_t) is begin + t(0) := get(params, 0); + t(1) := get(params, 1); + end; + +begin + + run: process(all) + variable r: time_t; + begin + get_time(r); + end process; + +end architecture; diff --git a/testsuite/gna/issue816/test.vhdl b/testsuite/gna/issue816/test.vhdl new file mode 100644 index 000000000..c7ed25851 --- /dev/null +++ b/testsuite/gna/issue816/test.vhdl @@ -0,0 +1,74 @@ +library ieee; +context ieee.ieee_std_context; + +library vunit_lib; +context vunit_lib.vunit_context; + +entity tb_test is + generic ( runner_cfg : string ); +end entity; + +architecture tb of tb_test is + + constant params: integer_vector_ptr_t := new_integer_vector_ptr(2, -1); + + constant clk_period : time := 20 ns; + + type time_t is array (natural range 0 to 1) of natural; + + procedure set_time(t: time_t) is begin + set(params, 0, t(0)); + set(params, 1, t(1)); + end; + + procedure get_time(variable t: inout time_t) is begin + t(0) := get(params, 0); + t(1) := get(params, 1); + end; + + impure function get_time return time_t is + variable t: time_t; + begin +-- t(0) := get(params, 0); +-- t(1) := get(params, 1); + return t; + end; + + constant null_time: time_t := (others => 0); + + impure function to_string(t: time_t) return string is begin + return to_string(t(0)) & " " & to_string(t(1)); + end; + + signal clk: std_logic; + +begin + + clk <= not clk after (clk_period/2); + + run: process(all) + variable r: time_t; + begin + if rising_edge(clk) then +-- info("Time: " & to_string(get_time)); +-- get_time(r); + end if; + end process; + + main: process + variable t: time_t; + begin + test_runner_setup(runner, runner_cfg); + get_time(t); + if t = null_time then + set_time((others=>natural'high)); + end if; + get_time(t); + info("Init test | time: " & to_string(t)); + info("Test done"); + test_runner_cleanup(runner); + wait; + end process; + test_runner_watchdog(runner, 500 ms); + +end architecture; diff --git a/testsuite/gna/issue816/testsuite.sh b/testsuite/gna/issue816/testsuite.sh new file mode 100755 index 000000000..7b37332aa --- /dev/null +++ b/testsuite/gna/issue816/testsuite.sh @@ -0,0 +1,10 @@ +#! /bin/sh + +. ../../testenv.sh + +export GHDL_STD_FLAGS=--std=08 +analyze repro.vhdl + +clean + +echo "Test successful" |