From 708cbe6c1ff75f5bccb09af043577b50982529b9 Mon Sep 17 00:00:00 2001 From: Tristan Gingold <tgingold@free.fr> Date: Tue, 29 Dec 2020 18:33:35 +0100 Subject: testsuite/gna: add tests for #1549 --- testsuite/gna/issue1549/ent.vhdl | 67 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 testsuite/gna/issue1549/ent.vhdl (limited to 'testsuite/gna/issue1549/ent.vhdl') diff --git a/testsuite/gna/issue1549/ent.vhdl b/testsuite/gna/issue1549/ent.vhdl new file mode 100644 index 000000000..46cab39c3 --- /dev/null +++ b/testsuite/gna/issue1549/ent.vhdl @@ -0,0 +1,67 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity ent is + generic ( + TUSER_WIDTH : natural := 1); -- Changing TUSER_WIDTH to a local constant inside ent fixes the issue +end ent; + +architecture ent of ent is + + -- constant TUSER_WIDTH : natural := 1; + + type data_t is record + tuser : std_logic_vector; + end record; + + type data_array_t is array (natural range <>) of data_t; + type std_logic_array_t is array (natural range <>) of std_logic_vector; + subtype tuser_array_t is std_logic_array_t(open)(TUSER_WIDTH - 1 downto 0); + +begin + + process + ------------------------------------------------------------------------------------ + procedure write_data ( + constant tuser : tuser_array_t -- Fails! + -- constant tuser : std_logic_array_t(open)(open) -- Works + -- constant tuser : std_logic_array_t -- Works + ) is + begin + + -- All entries will show as zero when it fails! + for i in tuser'range loop + report integer'image(i) & " =>" & integer'image(to_integer(unsigned(tuser(i)))); + end loop; + + assert tuser(1)(0) = '1'; -- <<<<<====== This should not fail + end procedure; + + ------------------------------------------------------------------------------------ + procedure handle_data_array ( constant data : data_array_t) is + variable local_tuser : std_logic_array_t(data'range)(TUSER_WIDTH - 1 downto 0); + -- variable local_tuser : tuser_array_t(data'range); -- This fails in this procedure! + begin + -- Convert a list of tuples into two lists + for i in data'range loop + local_tuser(i) := data(i).tuser; + -- This assertion fails when local_tuser type is one of + -- tuser_array_t(data'range) + -- tuser_array_t(0 to 1) + -- It will pass if the local_tuser is of type std_logic_array_t(data'range)(TUSER_WIDTH - 1 downto 0); + assert local_tuser(i) = data(i).tuser + report "local_tuser and data(i).tuser should not be different here"; + end loop; + + write_data(tuser => local_tuser); + end; + + ------------------------------------------------------------------------------------ + constant data : data_array_t(0 to 1)(tuser(0 downto 0)) := (0 => (tuser => (0 downto 0 => '0')), + 1 => (tuser => (0 downto 0 => '1'))); + begin + handle_data_array(data); + wait; + end process; +end ent; -- cgit v1.2.3