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

Subversion Repositories xmatchpro

[/] [xmatchpro/] [trunk/] [xmw4-comdec/] [xmatch_sim7/] [ipcore_dir/] [fifo_2048x8wr_256x64rd_prog_full_fifo_gen_v9_3/] [simulation/] [fifo_2048x8wr_256x64rd_prog_full_fifo_gen_v9_3_pctrl.vhd] - Blame information for rev 9

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 9 eejlny
 
2
--------------------------------------------------------------------------------
3
--
4
-- FIFO Generator Core Demo Testbench 
5
--
6
--------------------------------------------------------------------------------
7
--
8
-- (c) Copyright 2009 - 2010 Xilinx, Inc. All rights reserved.
9
-- 
10
-- This file contains confidential and proprietary information
11
-- of Xilinx, Inc. and is protected under U.S. and
12
-- international copyright and other intellectual property
13
-- laws.
14
-- 
15
-- DISCLAIMER
16
-- This disclaimer is not a license and does not grant any
17
-- rights to the materials distributed herewith. Except as
18
-- otherwise provided in a valid license issued to you by
19
-- Xilinx, and to the maximum extent permitted by applicable
20
-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
21
-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
22
-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
23
-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
24
-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
25
-- (2) Xilinx shall not be liable (whether in contract or tort,
26
-- including negligence, or under any other theory of
27
-- liability) for any loss or damage of any kind or nature
28
-- related to, arising under or in connection with these
29
-- materials, including for any direct, or any indirect,
30
-- special, incidental, or consequential loss or damage
31
-- (including loss of data, profits, goodwill, or any type of
32
-- loss or damage suffered as a result of any action brought
33
-- by a third party) even if such damage or loss was
34
-- reasonably foreseeable or Xilinx had been advised of the
35
-- possibility of the same.
36
-- 
37
-- CRITICAL APPLICATIONS
38
-- Xilinx products are not designed or intended to be fail-
39
-- safe, or for use in any application requiring fail-safe
40
-- performance, such as life-support or safety devices or
41
-- systems, Class III medical devices, nuclear facilities,
42
-- applications related to the deployment of airbags, or any
43
-- other applications that could lead to death, personal
44
-- injury, or severe property or environmental damage
45
-- (individually and collectively, "Critical
46
-- Applications"). Customer assumes the sole risk and
47
-- liability of any use of Xilinx products in Critical
48
-- Applications, subject only to applicable laws and
49
-- regulations governing limitations on product liability.
50
-- 
51
-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
52
-- PART OF THIS FILE AT ALL TIMES.
53
--------------------------------------------------------------------------------
54
--
55
-- Filename: fifo_2048x8wr_256x64rd_prog_full_fifo_gen_v9_3_pctrl.vhd
56
--
57
-- Description:
58
--   Used for protocol control on write and read interface stimulus and status generation
59
--
60
--------------------------------------------------------------------------------
61
-- Library Declarations
62
--------------------------------------------------------------------------------
63
LIBRARY ieee;
64
USE ieee.std_logic_1164.ALL;
65
USE ieee.std_logic_unsigned.all;
66
USE IEEE.std_logic_arith.all;
67
USE IEEE.std_logic_misc.all;
68
 
69
LIBRARY work;
70
USE work.fifo_2048x8wr_256x64rd_prog_full_fifo_gen_v9_3_pkg.ALL;
71
 
72
ENTITY fifo_2048x8wr_256x64rd_prog_full_fifo_gen_v9_3_pctrl IS
73
  GENERIC(
74
   AXI_CHANNEL         : STRING  :="NONE";
75
   C_APPLICATION_TYPE  : INTEGER := 0;
76
   C_DIN_WIDTH         : INTEGER := 0;
77
   C_DOUT_WIDTH        : INTEGER := 0;
78
   C_WR_PNTR_WIDTH     : INTEGER := 0;
79
   C_RD_PNTR_WIDTH     : INTEGER := 0;
80
   C_CH_TYPE           : INTEGER := 0;
81
   FREEZEON_ERROR      : INTEGER := 0;
82
   TB_STOP_CNT         : INTEGER := 2;
83
   TB_SEED             : INTEGER := 2
84
  );
85
  PORT(
86
       RESET_WR        : IN STD_LOGIC;
87
       RESET_RD        : IN STD_LOGIC;
88
       WR_CLK          : IN STD_LOGIC;
89
       RD_CLK          : IN STD_LOGIC;
90
       FULL            : IN STD_LOGIC;
91
       EMPTY           : IN STD_LOGIC;
92
       ALMOST_FULL     : IN STD_LOGIC;
93
       ALMOST_EMPTY    : IN STD_LOGIC;
94
       DATA_IN         : IN STD_LOGIC_VECTOR(C_DIN_WIDTH-1 DOWNTO 0);
95
       DATA_OUT        : IN STD_LOGIC_VECTOR(C_DOUT_WIDTH-1 DOWNTO 0);
96
       DOUT_CHK        : IN STD_LOGIC;
97
       PRC_WR_EN       : OUT STD_LOGIC;
98
       PRC_RD_EN       : OUT STD_LOGIC;
99
       RESET_EN        : OUT STD_LOGIC;
100
       SIM_DONE        : OUT STD_LOGIC;
101
       STATUS          : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
102
      );
103
END ENTITY;
104
 
105
 
106
ARCHITECTURE fg_pc_arch OF fifo_2048x8wr_256x64rd_prog_full_fifo_gen_v9_3_pctrl IS
107
 
108
 CONSTANT C_DATA_WIDTH   : INTEGER := if_then_else(C_DIN_WIDTH > C_DOUT_WIDTH,C_DIN_WIDTH,C_DOUT_WIDTH);
109
 CONSTANT LOOP_COUNT     : INTEGER := divroundup(C_DATA_WIDTH,8);
110
 CONSTANT D_WIDTH_DIFF   :   INTEGER := log2roundup(C_DOUT_WIDTH/C_DIN_WIDTH);
111
 
112
 SIGNAL data_chk_i       : STD_LOGIC := if_then_else(C_CH_TYPE /= 2,'1','0');
113
 SIGNAL full_chk_i       : STD_LOGIC := if_then_else(C_CH_TYPE /= 2,'1','0');
114
 SIGNAL empty_chk_i      : STD_LOGIC := if_then_else(C_CH_TYPE /= 2,'1','0');
115
 SIGNAL status_i         : STD_LOGIC_VECTOR(4 DOWNTO 0):= (OTHERS => '0');
116
 SIGNAL status_d1_i      : STD_LOGIC_VECTOR(4 DOWNTO 0):= (OTHERS => '0');
117
 SIGNAL wr_en_gen        : STD_LOGIC_VECTOR(7 DOWNTO 0):= (OTHERS => '0');
118
 SIGNAL rd_en_gen        : STD_LOGIC_VECTOR(7 DOWNTO 0):= (OTHERS => '0');
119
 SIGNAL wr_cntr          : STD_LOGIC_VECTOR(C_WR_PNTR_WIDTH-2 DOWNTO 0)   := (OTHERS => '0');
120
 SIGNAL full_as_timeout  : STD_LOGIC_VECTOR(C_WR_PNTR_WIDTH DOWNTO 0)   := (OTHERS => '0');
121
 SIGNAL full_ds_timeout  : STD_LOGIC_VECTOR(C_WR_PNTR_WIDTH DOWNTO 0) := (OTHERS => '0');
122
 SIGNAL rd_cntr          : STD_LOGIC_VECTOR(C_RD_PNTR_WIDTH-2 DOWNTO 0)   := (OTHERS => '0');
123
 SIGNAL empty_as_timeout : STD_LOGIC_VECTOR(C_RD_PNTR_WIDTH DOWNTO 0)  := (OTHERS => '0');
124
 SIGNAL empty_ds_timeout : STD_LOGIC_VECTOR(C_RD_PNTR_WIDTH DOWNTO 0):= (OTHERS => '0');
125
 SIGNAL wr_en_i          : STD_LOGIC := '0';
126
 SIGNAL rd_en_i          : STD_LOGIC := '0';
127
 SIGNAL state            : STD_LOGIC := '0';
128
 SIGNAL wr_control       : STD_LOGIC := '0';
129
 SIGNAL rd_control       : STD_LOGIC := '0';
130
 SIGNAL stop_on_err      : STD_LOGIC := '0';
131
 SIGNAL sim_stop_cntr    : STD_LOGIC_VECTOR(7 DOWNTO 0):= conv_std_logic_vector(if_then_else(C_CH_TYPE=2,64,TB_STOP_CNT),8);
132
 SIGNAL sim_done_i       : STD_LOGIC := '0';
133
 SIGNAL rdw_gt_wrw       : STD_LOGIC_VECTOR(D_WIDTH_DIFF-1 DOWNTO 0) := (OTHERS => '1');
134
 SIGNAL wrw_gt_rdw       : STD_LOGIC_VECTOR(D_WIDTH_DIFF-1 DOWNTO 0) := (OTHERS => '1');
135
 SIGNAL rd_activ_cont    : STD_LOGIC_VECTOR(25 downto 0):= (OTHERS => '0');
136
 SIGNAL prc_we_i         : STD_LOGIC := '0';
137
 SIGNAL prc_re_i         : STD_LOGIC := '0';
138
 SIGNAL reset_en_i       : STD_LOGIC := '0';
139
 SIGNAL sim_done_d1      : STD_LOGIC := '0';
140
 SIGNAL sim_done_wr1     : STD_LOGIC := '0';
141
 SIGNAL sim_done_wr2     : STD_LOGIC := '0';
142
 SIGNAL empty_d1         : STD_LOGIC := '0';
143
 SIGNAL empty_wr_dom1    : STD_LOGIC := '0';
144
 SIGNAL state_d1         : STD_LOGIC := '0';
145
 SIGNAL state_rd_dom1    : STD_LOGIC := '0';
146
 SIGNAL rd_en_d1         : STD_LOGIC := '0';
147
 SIGNAL rd_en_wr1        : STD_LOGIC := '0';
148
 SIGNAL wr_en_d1         : STD_LOGIC := '0';
149
 SIGNAL wr_en_rd1        : STD_LOGIC := '0';
150
 SIGNAL full_chk_d1      : STD_LOGIC := '0';
151
 SIGNAL full_chk_rd1     : STD_LOGIC := '0';
152
 SIGNAL empty_wr_dom2    : STD_LOGIC := '0';
153
 
154
 SIGNAL state_rd_dom2    : STD_LOGIC := '0';
155
 SIGNAL state_rd_dom3    : STD_LOGIC := '0';
156
 SIGNAL rd_en_wr2        : STD_LOGIC := '0';
157
 SIGNAL wr_en_rd2        : STD_LOGIC := '0';
158
 SIGNAL full_chk_rd2     : STD_LOGIC := '0';
159
 SIGNAL reset_en_d1      : STD_LOGIC := '0';
160
 SIGNAL reset_en_rd1     : STD_LOGIC := '0';
161
 SIGNAL reset_en_rd2     : STD_LOGIC := '0';
162
 
163
 SIGNAL data_chk_wr_d1   : STD_LOGIC := '0';
164
 SIGNAL data_chk_rd1     : STD_LOGIC := '0';
165
 SIGNAL data_chk_rd2     : STD_LOGIC := '0';
166
 SIGNAL post_rst_dly_wr  : STD_LOGIC_VECTOR(4 DOWNTO 0) := (OTHERS => '1');
167
 SIGNAL post_rst_dly_rd  : STD_LOGIC_VECTOR(4 DOWNTO 0) := (OTHERS => '1');
168
BEGIN
169
 status_i  <= data_chk_i & full_chk_rd2 & empty_chk_i & '0' & '0';
170
 STATUS    <= status_d1_i & '0' & '0' & rd_activ_cont(rd_activ_cont'high);
171
 
172
 prc_we_i <= wr_en_i  WHEN sim_done_wr2 = '0' ELSE '0';
173
 prc_re_i <= rd_en_i  WHEN sim_done_i   = '0' ELSE '0';
174
 
175
 SIM_DONE   <= sim_done_i;
176
 wrw_gt_rdw <= (OTHERS => '1');
177
 
178
 PROCESS(RD_CLK)
179
 BEGIN
180
   IF (RD_CLK'event AND RD_CLK='1') THEN
181
     IF(prc_re_i = '1') THEN
182
       rd_activ_cont <= rd_activ_cont + "1";
183
     END IF;
184
   END IF;
185
 END PROCESS;
186
 
187
 
188
 PROCESS(sim_done_i)
189
 BEGIN
190
    assert sim_done_i = '0'
191
    report "Simulation Complete for:" & AXI_CHANNEL
192
    severity note;
193
 END PROCESS;
194
 
195
-----------------------------------------------------
196
-- SIM_DONE SIGNAL GENERATION
197
-----------------------------------------------------
198
PROCESS (RD_CLK,RESET_RD)
199
BEGIN
200
    IF(RESET_RD = '1') THEN
201
      --sim_done_i <= '0';
202
    ELSIF(RD_CLK'event AND RD_CLK='1') THEN
203
      IF((OR_REDUCE(sim_stop_cntr) = '0' AND TB_STOP_CNT /= 0) OR stop_on_err = '1') THEN
204
        sim_done_i <= '1';
205
      END IF;
206
    END IF;
207
END PROCESS;
208
 
209
 -- TB Timeout/Stop
210
 fifo_tb_stop_run:IF(TB_STOP_CNT /= 0) GENERATE
211
   PROCESS (RD_CLK)
212
   BEGIN
213
       IF (RD_CLK'event AND RD_CLK='1') THEN
214
         IF(state_rd_dom2 = '0' AND state_rd_dom3 = '1') THEN
215
           sim_stop_cntr <= sim_stop_cntr - "1";
216
         END IF;
217
       END IF;
218
   END PROCESS;
219
 END GENERATE fifo_tb_stop_run;
220
 
221
 
222
  -- Stop when error found
223
  PROCESS (RD_CLK)
224
  BEGIN
225
    IF (RD_CLK'event AND RD_CLK='1') THEN
226
      IF(sim_done_i = '0') THEN
227
        status_d1_i <= status_i OR status_d1_i;
228
      END IF;
229
      IF(FREEZEON_ERROR = 1 AND status_i /= "0") THEN
230
        stop_on_err <= '1';
231
      END IF;
232
    END IF;
233
  END PROCESS;
234
  -----------------------------------------------------
235
 
236
  -----------------------------------------------------
237
  -- CHECKS FOR FIFO
238
  -----------------------------------------------------
239
 
240
 
241
  PROCESS(RD_CLK,RESET_RD)
242
  BEGIN
243
    IF(RESET_RD = '1') THEN
244
      post_rst_dly_rd <= (OTHERS => '1');
245
    ELSIF (RD_CLK'event AND RD_CLK='1') THEN
246
      post_rst_dly_rd <= post_rst_dly_rd-post_rst_dly_rd(4);
247
    END IF;
248
  END PROCESS;
249
 
250
  PROCESS(WR_CLK,RESET_WR)
251
  BEGIN
252
    IF(RESET_WR = '1') THEN
253
      post_rst_dly_wr <= (OTHERS => '1');
254
    ELSIF (WR_CLK'event AND WR_CLK='1') THEN
255
      post_rst_dly_wr <= post_rst_dly_wr-post_rst_dly_wr(4);
256
    END IF;
257
  END PROCESS;
258
 
259
 
260
  -- FULL de-assert Counter
261
  PROCESS(WR_CLK,RESET_WR)
262
  BEGIN
263
    IF(RESET_WR = '1') THEN
264
      full_ds_timeout <= (OTHERS => '0');
265
    ELSIF(WR_CLK'event AND WR_CLK='1') THEN
266
      IF(state = '1') THEN
267
        IF(rd_en_wr2 = '1' AND wr_en_i = '0' AND FULL = '1' AND AND_REDUCE(wrw_gt_rdw) = '1') THEN
268
          full_ds_timeout <= full_ds_timeout + '1';
269
        END IF;
270
      ELSE
271
        full_ds_timeout <= (OTHERS => '0');
272
      END IF;
273
    END IF;
274
  END PROCESS;
275
 
276
 
277
   PROCESS(RD_CLK,RESET_RD)
278
   BEGIN
279
     IF(RESET_RD = '1') THEN
280
      rdw_gt_wrw <= (OTHERS => '1');
281
     ELSIF (RD_CLK'event AND RD_CLK='1') THEN
282
       IF(wr_en_rd2 = '1' AND rd_en_i= '0' AND EMPTY = '1') THEN
283
         rdw_gt_wrw <= rdw_gt_wrw + '1';
284
       END IF;
285
     END IF;
286
   END PROCESS;
287
 
288
 -- EMPTY deassert counter
289
  PROCESS(RD_CLK,RESET_RD)
290
  BEGIN
291
    IF(RESET_RD = '1') THEN
292
      empty_ds_timeout <= (OTHERS => '0');
293
    ELSIF(RD_CLK'event AND RD_CLK='1') THEN
294
      IF(state = '0') THEN
295
        IF(wr_en_rd2 = '1' AND rd_en_i = '0' AND EMPTY = '1' AND AND_REDUCE(rdw_gt_wrw) = '1') THEN
296
          empty_ds_timeout <= empty_ds_timeout + '1';
297
        END IF;
298
      ELSE
299
        empty_ds_timeout <= (OTHERS => '0');
300
      END IF;
301
    END IF;
302
  END PROCESS;
303
 
304
  -- Full check signal generation
305
  PROCESS(WR_CLK,RESET_WR)
306
  BEGIN
307
    IF(RESET_WR = '1') THEN
308
      full_chk_i <= '0';
309
    ELSIF(WR_CLK'event AND WR_CLK='1') THEN
310
      IF(C_APPLICATION_TYPE = 1 AND (AXI_CHANNEL = "WACH" OR AXI_CHANNEL = "RACH" OR AXI_CHANNEL = "AXI4_Stream")) THEN
311
        full_chk_i <= '0';
312
      ELSE
313
        full_chk_i <= AND_REDUCE(full_as_timeout) OR
314
                      AND_REDUCE(full_ds_timeout);
315
      END IF;
316
    END IF;
317
  END PROCESS;
318
 
319
  -- Empty checks
320
  PROCESS(RD_CLK,RESET_RD)
321
  BEGIN
322
    IF(RESET_RD = '1') THEN
323
      empty_chk_i <= '0';
324
    ELSIF(RD_CLK'event AND RD_CLK='1') THEN
325
      IF(C_APPLICATION_TYPE = 1 AND (AXI_CHANNEL = "WACH" OR AXI_CHANNEL = "RACH" OR AXI_CHANNEL = "AXI4_Stream")) THEN
326
        empty_chk_i <= '0';
327
      ELSE
328
        empty_chk_i <= AND_REDUCE(empty_as_timeout) OR
329
                       AND_REDUCE(empty_ds_timeout);
330
      END IF;
331
    END IF;
332
  END PROCESS;
333
 
334
  fifo_d_chk:IF(C_CH_TYPE /= 2) GENERATE
335
    PRC_WR_EN  <= prc_we_i  AFTER 50 ns;
336
    PRC_RD_EN  <= prc_re_i  AFTER 100 ns;
337
    data_chk_i <= dout_chk;
338
  END GENERATE fifo_d_chk;
339
  -----------------------------------------------------
340
 
341
 
342
 -----------------------------------------------------
343
 -- SYNCHRONIZERS B/W WRITE AND READ DOMAINS
344
 -----------------------------------------------------
345
   PROCESS(WR_CLK,RESET_WR)
346
   BEGIN
347
     IF(RESET_WR = '1') THEN
348
       empty_wr_dom1  <= '1';
349
       empty_wr_dom2  <= '1';
350
       state_d1       <= '0';
351
       wr_en_d1       <= '0';
352
       rd_en_wr1      <= '0';
353
       rd_en_wr2      <= '0';
354
       full_chk_d1    <= '0';
355
       reset_en_d1    <= '0';
356
       sim_done_wr1   <= '0';
357
       sim_done_wr2   <= '0';
358
     ELSIF (WR_CLK'event AND WR_CLK='1') THEN
359
       sim_done_wr1   <= sim_done_d1;
360
       sim_done_wr2   <= sim_done_wr1;
361
       reset_en_d1    <= reset_en_i;
362
       state_d1       <= state;
363
       empty_wr_dom1  <= empty_d1;
364
       empty_wr_dom2  <= empty_wr_dom1;
365
       wr_en_d1       <= wr_en_i;
366
       rd_en_wr1      <= rd_en_d1;
367
       rd_en_wr2      <= rd_en_wr1;
368
       full_chk_d1    <= full_chk_i;
369
     END IF;
370
   END PROCESS;
371
 
372
   PROCESS(RD_CLK,RESET_RD)
373
   BEGIN
374
     IF(RESET_RD = '1') THEN
375
         empty_d1       <= '1';
376
         state_rd_dom1  <= '0';
377
         state_rd_dom2  <= '0';
378
         state_rd_dom3  <= '0';
379
         wr_en_rd1      <= '0';
380
         wr_en_rd2      <= '0';
381
         rd_en_d1       <= '0';
382
         full_chk_rd1   <= '0';
383
         full_chk_rd2   <= '0';
384
         reset_en_rd1   <= '0';
385
         reset_en_rd2   <= '0';
386
         sim_done_d1    <= '0';
387
     ELSIF (RD_CLK'event AND RD_CLK='1') THEN
388
         sim_done_d1    <= sim_done_i;
389
         reset_en_rd1   <= reset_en_d1;
390
         reset_en_rd2   <= reset_en_rd1;
391
         empty_d1       <= EMPTY;
392
         rd_en_d1       <= rd_en_i;
393
         state_rd_dom1  <= state_d1;
394
         state_rd_dom2  <= state_rd_dom1;
395
         state_rd_dom3  <= state_rd_dom2;
396
         wr_en_rd1      <= wr_en_d1;
397
         wr_en_rd2      <= wr_en_rd1;
398
         full_chk_rd1   <= full_chk_d1;
399
         full_chk_rd2   <= full_chk_rd1;
400
     END IF;
401
   END PROCESS;
402
 
403
   RESET_EN   <= reset_en_rd2;
404
 
405
 
406
   data_fifo_en:IF(C_CH_TYPE /= 2) GENERATE
407
    -----------------------------------------------------
408
    -- WR_EN GENERATION
409
    -----------------------------------------------------
410
    gen_rand_wr_en:fifo_2048x8wr_256x64rd_prog_full_fifo_gen_v9_3_rng
411
    GENERIC MAP(
412
                 WIDTH => 8,
413
                 SEED  => TB_SEED+1
414
               )
415
    PORT MAP(
416
              CLK        => WR_CLK,
417
              RESET      => RESET_WR,
418
              RANDOM_NUM => wr_en_gen,
419
              ENABLE     => '1'
420
            );
421
 
422
    PROCESS(WR_CLK,RESET_WR)
423
    BEGIN
424
      IF(RESET_WR = '1') THEN
425
        wr_en_i   <=  '0';
426
      ELSIF(WR_CLK'event AND WR_CLK='1') THEN
427
        IF(state = '1') THEN
428
          wr_en_i <= wr_en_gen(0) AND wr_en_gen(7) AND wr_en_gen(2) AND wr_control;
429
        ELSE
430
          wr_en_i <= (wr_en_gen(3) OR wr_en_gen(4) OR wr_en_gen(2)) AND (NOT post_rst_dly_wr(4));
431
        END IF;
432
      END IF;
433
    END PROCESS;
434
 
435
    -----------------------------------------------------
436
    -- WR_EN CONTROL
437
    -----------------------------------------------------
438
    PROCESS(WR_CLK,RESET_WR)
439
    BEGIN
440
      IF(RESET_WR = '1') THEN
441
        wr_cntr         <= (OTHERS => '0');
442
        wr_control      <= '1';
443
        full_as_timeout <= (OTHERS => '0');
444
      ELSIF(WR_CLK'event AND WR_CLK='1') THEN
445
        IF(state = '1') THEN
446
          IF(wr_en_i = '1') THEN
447
            wr_cntr <= wr_cntr + "1";
448
          END IF;
449
          full_as_timeout <= (OTHERS => '0');
450
        ELSE
451
          wr_cntr <= (OTHERS => '0');
452
          IF(rd_en_wr2 = '0') THEN
453
            IF(wr_en_i = '1') THEN
454
              full_as_timeout <= full_as_timeout + "1";
455
            END IF;
456
          ELSE
457
            full_as_timeout <= (OTHERS => '0');
458
          END IF;
459
        END IF;
460
 
461
        wr_control <= NOT wr_cntr(wr_cntr'high);
462
 
463
      END IF;
464
    END PROCESS;
465
 
466
    -----------------------------------------------------
467
    -- RD_EN GENERATION
468
    -----------------------------------------------------
469
    gen_rand_rd_en:fifo_2048x8wr_256x64rd_prog_full_fifo_gen_v9_3_rng
470
    GENERIC MAP(
471
                 WIDTH => 8,
472
                 SEED  => TB_SEED
473
               )
474
    PORT MAP(
475
              CLK        => RD_CLK,
476
              RESET      => RESET_RD,
477
              RANDOM_NUM => rd_en_gen,
478
              ENABLE     => '1'
479
            );
480
 
481
    PROCESS(RD_CLK,RESET_RD)
482
    BEGIN
483
      IF(RESET_RD = '1') THEN
484
        rd_en_i    <= '0';
485
      ELSIF(RD_CLK'event AND RD_CLK='1') THEN
486
        IF(state_rd_dom2 = '0') THEN
487
            rd_en_i <= rd_en_gen(1) AND rd_en_gen(5) AND rd_en_gen(3) AND rd_control AND (NOT post_rst_dly_rd(4));
488
        ELSE
489
          rd_en_i <= rd_en_gen(0) OR rd_en_gen(6);
490
        END IF;
491
      END IF;
492
    END PROCESS;
493
 
494
    -----------------------------------------------------
495
    -- RD_EN CONTROL
496
    -----------------------------------------------------
497
    PROCESS(RD_CLK,RESET_RD)
498
    BEGIN
499
      IF(RESET_RD = '1') THEN
500
        rd_cntr    <= (OTHERS => '0');
501
        rd_control <= '1';
502
        empty_as_timeout <= (OTHERS => '0');
503
      ELSIF(RD_CLK'event AND RD_CLK='1') THEN
504
        IF(state_rd_dom2 = '0') THEN
505
          IF(rd_en_i = '1') THEN
506
            rd_cntr <= rd_cntr + "1";
507
          END IF;
508
          empty_as_timeout <= (OTHERS => '0');
509
        ELSE
510
          rd_cntr <= (OTHERS => '0');
511
          IF(wr_en_rd2 = '0') THEN
512
            IF(rd_en_i = '1') THEN
513
              empty_as_timeout <= empty_as_timeout + "1";
514
            END IF;
515
          ELSE
516
            empty_as_timeout <= (OTHERS => '0');
517
          END IF;
518
        END IF;
519
 
520
        rd_control <= NOT rd_cntr(rd_cntr'high);
521
 
522
      END IF;
523
    END PROCESS;
524
 
525
    -----------------------------------------------------
526
    -- STIMULUS CONTROL
527
    -----------------------------------------------------
528
    PROCESS(WR_CLK,RESET_WR)
529
    BEGIN
530
      IF(RESET_WR = '1') THEN
531
        state      <= '0';
532
        reset_en_i <= '0';
533
      ELSIF(WR_CLK'event AND WR_CLK='1') THEN
534
        CASE state IS
535
          WHEN '0' =>
536
            IF(FULL = '1' AND empty_wr_dom2 = '0') THEN
537
              state      <= '1';
538
              reset_en_i <= '0';
539
            END IF;
540
          WHEN '1' =>
541
            IF(empty_wr_dom2 = '1' AND FULL = '0') THEN
542
              state      <= '0';
543
              reset_en_i <= '1';
544
            END IF;
545
          WHEN OTHERS => state <= state;
546
        END CASE;
547
      END IF;
548
    END PROCESS;
549
  END GENERATE data_fifo_en;
550
 
551
END ARCHITECTURE;

powered by: WebSVN 2.1.0

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