blob: 2d81b101bde4c13ce7dd0a681490a4ed9cab0873 (
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
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;
|