aboutsummaryrefslogtreecommitdiffstats
path: root/testsuite/gna
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/gna')
-rw-r--r--testsuite/gna/issue1376/pkg.vhdl11
-rw-r--r--testsuite/gna/issue1376/repro1.vhdl103
-rwxr-xr-xtestsuite/gna/issue1376/testsuite.sh15
-rw-r--r--testsuite/gna/issue1376/window_splitter_1D.vhdl109
4 files changed, 238 insertions, 0 deletions
diff --git a/testsuite/gna/issue1376/pkg.vhdl b/testsuite/gna/issue1376/pkg.vhdl
new file mode 100644
index 000000000..f7aa1f201
--- /dev/null
+++ b/testsuite/gna/issue1376/pkg.vhdl
@@ -0,0 +1,11 @@
+package int_arr is
+ type int_array_t is array(natural range <>) of integer;
+end package;
+
+library ieee;
+use ieee.std_logic_1164.all;
+
+package slv_arr is
+ type slv_array_t is array(natural range <>) of std_logic_vector;
+ type slv_arr_array_t is array(natural range <>) of slv_array_t;
+end package ;
diff --git a/testsuite/gna/issue1376/repro1.vhdl b/testsuite/gna/issue1376/repro1.vhdl
new file mode 100644
index 000000000..97f1509a0
--- /dev/null
+++ b/testsuite/gna/issue1376/repro1.vhdl
@@ -0,0 +1,103 @@
+package repro1_pkg is
+ type bv_array_t is array(natural range <>) of bit_vector;
+end package ;
+
+use work.repro1_pkg.all;
+
+entity repro1 is
+ generic (
+ WINDOW_COUNT : integer; -- 4
+ WINDOW_SIZE : integer; -- 3
+ BIT_WIDTH : integer;
+ WINDOW_STRIDE : integer -- 1
+ );
+ port (
+ i_in : in bv_array_t;--(0 to INPUT_SIZE-1)(BIT_WIDTH-1 downto 0);
+ o_windows : out bv_array_t(0 to WINDOW_COUNT*WINDOW_SIZE-1)(BIT_WIDTH-1 downto 0)
+ );
+
+ constant IN_LEN1 : integer := i_in'length;
+ constant WINDOW_COUNT_1 : integer :=
+ 1 + (IN_LEN1 - WINDOW_SIZE)/WINDOW_STRIDE;
+end entity;
+
+architecture comb of repro1 is
+begin
+ assert WINDOW_COUNT = 4 severity failure;
+ assert IN_LEN1 = 6 severity failure;
+ assert WINDOW_COUNT_1 = 4 severity failure;
+
+ gen_w1 : for c1 in 0 to WINDOW_COUNT_1 - 1 generate
+ gen_wj : for j in 0 to WINDOW_SIZE - 1 generate
+ o_windows(c1*WINDOW_SIZE + j) <= i_in(c1*WINDOW_STRIDE + j);
+ end generate gen_wj;
+ end generate gen_w1;
+end architecture;
+
+library ieee;
+use ieee.numeric_bit.all;
+
+use work.repro1_pkg.all;
+use std.textio.all;
+
+entity repro1_tb is
+ generic (
+ WINDOW_SIZE : integer := 3;
+ WINDOW_STRIDE : integer := 1;
+ IN_SIZE : integer := 6;
+ BIT_WIDTH : positive := 4
+ );
+
+ constant WINDOW_COUNT : integer := 1 + (IN_SIZE - WINDOW_SIZE)/WINDOW_STRIDE;
+end entity;
+
+architecture behav of repro1_tb is
+ signal s_in : bv_array_t(0 to IN_SIZE-1)(BIT_WIDTH-1 downto 0) := (others => (others => '1'));
+ signal s_windows : bv_array_t(0 to WINDOW_COUNT*WINDOW_SIZE-1)(BIT_WIDTH-1 downto 0) := (others => (others => '0'));
+begin
+ s : entity work.repro1
+ generic map (
+ -- INPUT_SIZE => IN_SIZE,
+ WINDOW_COUNT => WINDOW_COUNT,
+ BIT_WIDTH => BIT_WIDTH,
+ WINDOW_SIZE => WINDOW_SIZE,
+ WINDOW_STRIDE => WINDOW_STRIDE
+ )
+ port map (
+ i_in => s_in,
+ o_windows => s_windows
+ );
+
+ process
+ begin
+ s_in(0)<=x"E";
+ s_in(1)<=x"C";
+ s_in(2)<=x"A";
+ s_in(3)<=x"8";
+ s_in(4)<=x"6";
+ s_in(5)<=x"4";
+
+ wait for 10 ns;
+
+ for i in s_in'range loop
+ write(output,
+ "s_in(" & natural'image(i) & ")=" & to_hstring(s_in(i)) & LF);
+ end loop;
+
+ for i in s_windows'range loop
+ write(output,
+ "s_windows(" & natural'image(i) & ")="
+ & to_hstring(s_windows(i)) & LF);
+ end loop;
+
+ for c1 in 0 to WINDOW_COUNT-1 loop
+ for j in 0 to WINDOW_SIZE-1 loop
+ assert s_windows(c1*WINDOW_SIZE + j) = s_in(c1*WINDOW_STRIDE+j)
+ report "Test: incorrect SLV on output.";
+ end loop;
+ end loop;
+
+ wait;
+ end process;
+
+end architecture;
diff --git a/testsuite/gna/issue1376/testsuite.sh b/testsuite/gna/issue1376/testsuite.sh
new file mode 100755
index 000000000..a7dbc8fff
--- /dev/null
+++ b/testsuite/gna/issue1376/testsuite.sh
@@ -0,0 +1,15 @@
+#! /bin/sh
+
+. ../../testenv.sh
+
+export GHDL_STD_FLAGS=--std=08
+analyze repro1.vhdl
+elab_simulate repro1_tb
+
+analyze pkg.vhdl
+analyze window_splitter_1D.vhdl
+elab_simulate window_splitter_1D_tb
+
+clean
+
+echo "Test successful"
diff --git a/testsuite/gna/issue1376/window_splitter_1D.vhdl b/testsuite/gna/issue1376/window_splitter_1D.vhdl
new file mode 100644
index 000000000..2d81b101b
--- /dev/null
+++ b/testsuite/gna/issue1376/window_splitter_1D.vhdl
@@ -0,0 +1,109 @@
+library ieee;
+use ieee.std_logic_1164.all;
+
+use work.int_arr.all;
+use work.slv_arr.all;
+
+entity window_splitter_1D is
+ generic (
+ -- INPUT_SIZE : integer;
+ WINDOW_COUNT : integer;
+ WINDOW_SIZE : integer;
+ BIT_WIDTH : integer;
+ WINDOW_STRIDE : integer
+ );
+ port (
+ i_in : in slv_array_t;--(0 to INPUT_SIZE-1)(BIT_WIDTH-1 downto 0);
+ o_windows : out slv_array_t(0 to WINDOW_COUNT*WINDOW_SIZE-1)(BIT_WIDTH-1 downto 0)
+ );
+
+ constant IN_LEN1 : integer := i_in'length;
+ constant WINDOW_COUNT_1 : integer := 1 + (IN_LEN1 - WINDOW_SIZE)/WINDOW_STRIDE;
+end entity;
+
+architecture comb of window_splitter_1D is
+begin
+ gen_w1 : for c1 in 0 to WINDOW_COUNT_1-1 generate
+ gen_wj : for j in 0 to WINDOW_SIZE-1 generate
+ o_windows(c1*WINDOW_SIZE + j) <= i_in(c1*WINDOW_STRIDE+j);
+ end generate gen_wj;
+ end generate gen_w1;
+end architecture;
+-----------------------------------------------------------
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+use work.int_arr.all;
+use work.slv_arr.all;
+
+entity window_splitter_1D_tb is
+ generic (
+ WINDOW_SIZE : integer := 3;
+ WINDOW_STRIDE : integer := 1;
+ IN_SIZE : integer := 6;
+ BIT_WIDTH : positive := 16
+ );
+
+ constant WINDOW_COUNT : integer := 1 + (IN_SIZE - WINDOW_SIZE)/WINDOW_STRIDE;
+
+ --function rand return integer is
+ --begin assert false report "VHPIDIRECT rand" severity failure; end;
+ --attribute foreign of rand : function is "VHPIDIRECT rand";
+
+end entity;
+
+architecture behav of window_splitter_1D_tb is
+ signal s_in : slv_array_t(0 to IN_SIZE-1)(BIT_WIDTH-1 downto 0) := (others => (others => '1'));
+ signal s_windows : slv_array_t(0 to WINDOW_COUNT*WINDOW_SIZE-1)(BIT_WIDTH-1 downto 0) := (others => (others => '0'));
+begin
+ s : entity work.window_splitter_1D
+ generic map (
+ -- INPUT_SIZE => IN_SIZE,
+ WINDOW_COUNT => WINDOW_COUNT,
+ BIT_WIDTH => BIT_WIDTH,
+ WINDOW_SIZE => WINDOW_SIZE,
+ WINDOW_STRIDE => WINDOW_STRIDE
+ )
+ port map (
+ i_in => s_in,
+ o_windows => s_windows
+ );
+
+ process
+ variable v_in : int_array_t(0 to IN_SIZE-1) := (others => 0);
+ variable v_windows : int_array_t(0 to WINDOW_COUNT*WINDOW_SIZE-1) := (others => 0);
+ variable v_in_val : integer := 0;
+ begin
+
+ for t in 1 to 100 loop
+
+ for i in 0 to IN_SIZE-1 loop
+ v_in(i) := (i * 17 + t * 5) mod 256 - 128;
+ s_in(i) <= std_logic_vector(to_signed(v_in(i), BIT_WIDTH));
+ end loop;
+
+ wait for 10 ns;
+
+ for i in 0 to IN_SIZE-1 loop
+ v_in_val := to_integer(signed(s_in(i)));
+ assert v_in_val = v_in(i) report "[" & integer'image(i) & "] = " & integer'image(v_in_val) & " != " & integer'image(v_in(i));
+ end loop;
+
+ for c1 in 0 to WINDOW_COUNT-1 loop
+ for j in 0 to WINDOW_SIZE-1 loop
+ v_in_val := to_integer(signed(s_windows(c1*WINDOW_SIZE + j)));
+ assert s_windows(c1*WINDOW_SIZE + j) = s_in(c1*WINDOW_STRIDE+j) report "Test " & integer'image(t) & " 'window_splitter_1D': incorrect SLV on output.";
+ -- assert v_in_val = v_in(c1*WINDOW_STRIDE+j)
+ -- report "Test " & integer'image(t) & " 'window_splitter_1D': Window(" & integer'image(c1) & ")(" & integer'image(j) & ") = "
+ -- & integer'image(v_in_val) & " != " & integer'image(v_in(c1*WINDOW_STRIDE)) & " In(" & integer'image(c1*WINDOW_STRIDE+j) & ")." severity note;
+ end loop;
+ end loop;
+
+ end loop;
+
+ report "Test 'window_splitter_1D': Success.";
+ wait;
+ end process;
+
+end architecture;