OpenCores
URL https://opencores.org/ocsvn/astron_ram/astron_ram/trunk

Subversion Repositories astron_ram

[/] [astron_ram/] [trunk/] [tb_common_paged_ram_crw_crw.vhd] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 danv
-------------------------------------------------------------------------------
2
--
3 3 danv
-- Copyright 2020
4 2 danv
-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
5
-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
6 3 danv
-- 
7
-- Licensed under the Apache License, Version 2.0 (the "License");
8
-- you may not use this file except in compliance with the License.
9
-- You may obtain a copy of the License at
10
-- 
11
--     http://www.apache.org/licenses/LICENSE-2.0
12
-- 
13
-- Unless required by applicable law or agreed to in writing, software
14
-- distributed under the License is distributed on an "AS IS" BASIS,
15
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
-- See the License for the specific language governing permissions and
17
-- limitations under the License.
18 2 danv
--
19
-------------------------------------------------------------------------------
20
 
21
LIBRARY IEEE, common_pkg_lib;
22
USE IEEE.std_logic_1164.ALL;
23
USE IEEE.numeric_std.ALL;
24
USE common_pkg_lib.common_pkg.ALL;
25
USE common_pkg_lib.tb_common_pkg.ALL;
26
 
27
-- Purpose: Test bench for common_paged_ram_crw_crw
28
--
29
-- Features:
30
-- . Use c_gap_sz = 0 to try writing and reading multiple page without idle
31
--   cycles
32
-- . Most applications use c_nof_pages = 2, but use > 2 is supported too.
33
--
34
-- Usage:
35
-- > as 10
36
-- > run -all
37
 
38
 
39
ENTITY tb_common_paged_ram_crw_crw IS
40
END tb_common_paged_ram_crw_crw;
41
 
42
ARCHITECTURE tb OF tb_common_paged_ram_crw_crw IS
43
 
44
  CONSTANT clk_period        : TIME := 10 ns;
45
 
46
  CONSTANT c_data_w          : NATURAL := 8;
47
  CONSTANT c_nof_pages       : NATURAL := 2;  -- >= 2
48
  CONSTANT c_page_sz         : NATURAL := 8;
49
  CONSTANT c_start_page_a    : NATURAL := 0;
50
  CONSTANT c_start_page_b    : NATURAL := 1;
51
  CONSTANT c_gap_sz          : NATURAL := 0;  -- >= 0
52
  CONSTANT c_rl              : NATURAL := 1;
53
 
54
  SIGNAL rst               : STD_LOGIC;
55
  SIGNAL clk               : STD_LOGIC := '1';
56
  SIGNAL tb_end            : STD_LOGIC := '0';
57
 
58
  -- DUT
59
  SIGNAL next_page         : STD_LOGIC;
60
 
61
  SIGNAL next_page_a       : STD_LOGIC;
62
  SIGNAL adr_a             : STD_LOGIC_VECTOR(ceil_log2(c_page_sz)-1 DOWNTO 0) := (OTHERS=>'0');
63
  SIGNAL wr_en_a           : STD_LOGIC;
64
  SIGNAL wr_dat_a          : STD_LOGIC_VECTOR(c_data_w-1 DOWNTO 0) := (OTHERS=>'0');
65
 
66
  SIGNAL next_page_b       : STD_LOGIC;
67
  SIGNAL adr_b             : STD_LOGIC_VECTOR(ceil_log2(c_page_sz)-1 DOWNTO 0) := (OTHERS=>'0');
68
  SIGNAL rd_en_b           : STD_LOGIC := '0';
69
 
70
  SIGNAL mux_rd_dat_b      : STD_LOGIC_VECTOR(c_data_w-1 DOWNTO 0);
71
  SIGNAL mux_rd_val_b      : STD_LOGIC;
72
 
73
  SIGNAL adr_rd_dat_b      : STD_LOGIC_VECTOR(c_data_w-1 DOWNTO 0);
74
  SIGNAL adr_rd_val_b      : STD_LOGIC;
75
 
76
  SIGNAL ofs_rd_dat_b      : STD_LOGIC_VECTOR(c_data_w-1 DOWNTO 0);
77
  SIGNAL ofs_rd_val_b      : STD_LOGIC;
78
 
79
  -- Verify
80
  SIGNAL verify_en         : STD_LOGIC;
81
  SIGNAL ready             : STD_LOGIC := '1';
82
 
83
  SIGNAL prev_mux_rd_dat_b : STD_LOGIC_VECTOR(c_data_w-1 DOWNTO 0);
84
  SIGNAL prev_adr_rd_dat_b : STD_LOGIC_VECTOR(c_data_w-1 DOWNTO 0);
85
  SIGNAL prev_ofs_rd_dat_b : STD_LOGIC_VECTOR(c_data_w-1 DOWNTO 0);
86
 
87
BEGIN
88
 
89
  clk <= NOT clk AND NOT tb_end AFTER clk_period/2;
90
  rst <= '1', '0' AFTER clk_period*7;
91
 
92
  verify_en <= '0', '1' AFTER clk_period*(15+(c_nof_pages-1)*c_page_sz);
93
 
94
  -- Apply stimuli via port 'a', do write 'a' and read 'b', and derive the 'b' stimuli from the 'a' stimuli with 1 clock cycle latency
95
  next_page_a <= next_page;
96
  next_page_b <= next_page WHEN rising_edge(clk);
97
 
98
  wr_dat_a <= INCR_UVEC(wr_dat_a, 1) WHEN rising_edge(clk) AND wr_en_a='1';
99
  adr_a    <= INCR_UVEC(   adr_a, 1) WHEN rising_edge(clk) AND wr_en_a='1';
100
  adr_b    <=              adr_a     WHEN rising_edge(clk);
101
  rd_en_b  <=            wr_en_a     WHEN rising_edge(clk);
102
 
103
  p_stimuli : PROCESS
104
  BEGIN
105
    next_page <= '0';
106
    wr_en_a   <= '0';
107
    proc_common_wait_until_low(clk, rst);
108
    proc_common_wait_some_cycles(clk, 3);
109
 
110
    -- Access the pages several times
111
    FOR I IN 0 TO c_nof_pages*3 LOOP
112
      wr_en_a <= '1';
113
      proc_common_wait_some_cycles(clk, c_page_sz-1);
114
      next_page <= '1';
115
      proc_common_wait_some_cycles(clk, 1);
116
      next_page <= '0';
117
      wr_en_a <= '0';
118
      proc_common_wait_some_cycles(clk, c_gap_sz);  -- optinal gap between the pages
119
    END LOOP;
120
 
121
    wr_en_a <= '0';
122
    proc_common_wait_some_cycles(clk, c_page_sz);
123
    tb_end <= '1';
124
    WAIT;
125
  END PROCESS;
126
 
127
  u_dut_mux : ENTITY work.common_paged_ram_crw_crw
128
  GENERIC MAP (
129
    g_str           => "use_mux",
130
    g_data_w        => c_data_w,
131
    g_nof_pages     => c_nof_pages,
132
    g_page_sz       => c_page_sz,
133
    g_start_page_a  => c_start_page_a,
134
    g_start_page_b  => c_start_page_b
135
  )
136
  PORT MAP (
137
    rst_a       => rst,
138
    rst_b       => rst,
139
    clk_a       => clk,
140
    clk_b       => clk,
141
    clken_a     => '1',
142
    clken_b     => '1',
143
    next_page_a => next_page_a,
144
    adr_a       => adr_a,
145
    wr_en_a     => wr_en_a,
146
    wr_dat_a    => wr_dat_a,
147
    rd_en_a     => '0',
148
    rd_dat_a    => OPEN,
149
    rd_val_a    => OPEN,
150
    next_page_b => next_page_b,
151
    adr_b       => adr_b,
152
    wr_en_b     => '0',
153
    wr_dat_b    => (OTHERS=>'0'),
154
    rd_en_b     => rd_en_b,
155
    rd_dat_b    => mux_rd_dat_b,
156
    rd_val_b    => mux_rd_val_b
157
  );
158
 
159
  u_dut_adr : ENTITY work.common_paged_ram_crw_crw
160
  GENERIC MAP (
161
    g_str           => "use_adr",
162
    g_data_w        => c_data_w,
163
    g_nof_pages     => c_nof_pages,
164
    g_page_sz       => c_page_sz,
165
    g_start_page_a  => c_start_page_a,
166
    g_start_page_b  => c_start_page_b
167
  )
168
  PORT MAP (
169
    rst_a       => rst,
170
    rst_b       => rst,
171
    clk_a       => clk,
172
    clk_b       => clk,
173
    clken_a     => '1',
174
    clken_b     => '1',
175
    next_page_a => next_page_a,
176
    adr_a       => adr_a,
177
    wr_en_a     => wr_en_a,
178
    wr_dat_a    => wr_dat_a,
179
    rd_en_a     => '0',
180
    rd_dat_a    => OPEN,
181
    rd_val_a    => OPEN,
182
    next_page_b => next_page_b,
183
    adr_b       => adr_b,
184
    wr_en_b     => '0',
185
    wr_dat_b    => (OTHERS=>'0'),
186
    rd_en_b     => rd_en_b,
187
    rd_dat_b    => adr_rd_dat_b,
188
    rd_val_b    => adr_rd_val_b
189
  );
190
 
191
  u_dut_ofs : ENTITY work.common_paged_ram_crw_crw
192
  GENERIC MAP (
193
    g_str           => "use_ofs",
194
    g_data_w        => c_data_w,
195
    g_nof_pages     => c_nof_pages,
196
    g_page_sz       => c_page_sz,
197
    g_start_page_a  => c_start_page_a,
198
    g_start_page_b  => c_start_page_b
199
  )
200
  PORT MAP (
201
    rst_a       => rst,
202
    rst_b       => rst,
203
    clk_a       => clk,
204
    clk_b       => clk,
205
    clken_a     => '1',
206
    clken_b     => '1',
207
    next_page_a => next_page_a,
208
    adr_a       => adr_a,
209
    wr_en_a     => wr_en_a,
210
    wr_dat_a    => wr_dat_a,
211
    rd_en_a     => '0',
212
    rd_dat_a    => OPEN,
213
    rd_val_a    => OPEN,
214
    next_page_b => next_page_b,
215
    adr_b       => adr_b,
216
    wr_en_b     => '0',
217
    wr_dat_b    => (OTHERS=>'0'),
218
    rd_en_b     => rd_en_b,
219
    rd_dat_b    => ofs_rd_dat_b,
220
    rd_val_b    => ofs_rd_val_b
221
  );
222
 
223
  -- Verify that the read data is incrementing data
224
  proc_common_verify_data(c_rl, clk, verify_en, ready, mux_rd_val_b, mux_rd_dat_b, prev_mux_rd_dat_b);
225
  proc_common_verify_data(c_rl, clk, verify_en, ready, adr_rd_val_b, adr_rd_dat_b, prev_adr_rd_dat_b);
226
  proc_common_verify_data(c_rl, clk, verify_en, ready, ofs_rd_val_b, ofs_rd_dat_b, prev_ofs_rd_dat_b);
227
 
228
  -- Verify that the read data is the same for all three DUT variants
229
  p_verify_equal : PROCESS(clk)
230
  BEGIN
231
    IF rising_edge(clk) THEN
232
      IF UNSIGNED(mux_rd_dat_b) /= UNSIGNED(adr_rd_dat_b) OR UNSIGNED(mux_rd_dat_b) /= UNSIGNED(ofs_rd_dat_b) THEN
233
        REPORT "DUT : read data differs between two implementations" SEVERITY ERROR;
234
      END IF;
235
      IF mux_rd_val_b /= adr_rd_val_b OR mux_rd_val_b /= ofs_rd_val_b THEN
236
        REPORT "DUT : read valid differs between two implementations" SEVERITY ERROR;
237
      END IF;
238
    END IF;
239
  END PROCESS;
240
 
241
END tb;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.