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

Subversion Repositories pcie_ds_dma

[/] [pcie_ds_dma/] [trunk/] [projects/] [sp605_lx45t_wishbone/] [src/] [testbench/] [test_pkg.vhd] - Blame information for rev 10

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dsmv
---------------------------------------------------------------------------------------------------
2
--
3
-- Title       : test_pkg.vhd
4
-- Author      : Dmitry Smekhov 
5
-- Company     : Instrumental System
6
--      
7
-- Version     : 1.0
8
--
9
---------------------------------------------------------------------------------------------------
10
--
11
-- Description : Пакет для тестирования ambpex5.
12
--
13
---------------------------------------------------------------------------------------------------
14
--
15
--  Version 1.1 (25.10.2011) Kuzmi4
16
--      Description: add couple of simple tests for test WB stuff, let "test_num_1" unchanged.
17
--
18
---------------------------------------------------------------------------------------------------
19
library ieee;
20
use ieee.std_logic_1164.all;
21
use ieee.std_logic_arith.all;
22
use ieee.std_logic_unsigned.all;
23
use ieee.std_logic_textio.all;
24
use std.textio.all;
25
 
26
library work;
27
use work.cmd_sim_pkg.all;
28
use work.block_pkg.all;
29
use work.wb_block_pkg.all;
30
 
31
package test_pkg is
32
 
33 10 dsmv
--! Initialising
34 2 dsmv
procedure test_init(
35
                fname: in string        --! имя файла отчёта
36
        );
37
 
38 10 dsmv
--! Finished
39 2 dsmv
procedure test_close;
40
 
41
 
42
 
43 10 dsmv
--! Start DMA with incorrect descriptor
44 2 dsmv
procedure test_dsc_incorrect (
45
                signal  cmd:    out bh_cmd; --! команда
46
                signal  ret:    in  bh_ret  --! ответ
47
                );
48
 
49 10 dsmv
--! Start DMA for one block 4 kB
50 2 dsmv
procedure test_read_4kb (
51
                signal  cmd:    out bh_cmd; --! команда
52
                signal  ret:    in  bh_ret  --! ответ
53
                );
54
 
55
 
56 10 dsmv
--! Read block_test_check 8 kB
57 2 dsmv
procedure test_adm_read_8kb (
58
                signal  cmd:    out bh_cmd; --! команда
59
                signal  ret:    in  bh_ret  --! ответ
60
                );
61
 
62
----! Проверка обращений к блоку MAIN 
63
--procedure test_block_main (
64
--              signal  cmd:    out bh_cmd; --! команда
65
--              signal  ret:    in  bh_ret  --! ответ
66
--              );
67
--              
68
----! Чтение 16 кБ с использованием двух блоков дескрипторов
69
--procedure test_adm_read_16kb (
70
--              signal  cmd:    out bh_cmd; --! команда
71
--              signal  ret:    in  bh_ret  --! ответ
72
--              );
73
--              
74
--! Запись 16 кБ с использованием двух блоков дескрипторов
75
procedure test_adm_write_16kb (
76
                signal  cmd:    out bh_cmd; --! команда
77
                signal  ret:    in  bh_ret  --! ответ
78
                );
79
---------------------------------------------------------------------------------------------------
80
--
81
-- 
82
--
83
procedure test_num_1(
84
                            signal  cmd:    out bh_cmd; --! команда
85
                            signal  ret:    in  bh_ret  --! ответ
86
                    );
87
procedure test_num_2(
88
                            signal  cmd:    out bh_cmd; --! команда
89
                            signal  ret:    in  bh_ret  --! ответ
90
                    );
91
-- ==> TEST_CHECK.WB_CFG_SLAVE
92
procedure test_wb_1(
93
                            signal  cmd:    out bh_cmd; --! команда
94
                            signal  ret:    in  bh_ret  --! ответ
95
                    );
96
-- ==> TEST_GEN.WB_CFG_SLAVE
97
procedure test_wb_2(
98
                            signal  cmd:    out bh_cmd; --! команда
99
                            signal  ret:    in  bh_ret  --! ответ
100
                    );
101
end package     test_pkg;
102
---------------------------------------------------------------------------------------------------
103
package body test_pkg is
104
 
105
        FILE   log: text;
106
 
107
        shared variable cnt_ok, cnt_error: integer;
108
 
109 10 dsmv
        -- Initialising
110 2 dsmv
        procedure test_init(
111 10 dsmv
                fname: in string
112 2 dsmv
                ) is
113
        begin
114
 
115
                file_open( log, fname, WRITE_MODE );
116
                cnt_ok:=0;
117
                cnt_error:=0;
118
 
119
        end test_init;
120
 
121 10 dsmv
        --! Finished
122 2 dsmv
        procedure test_close is
123
                variable str : LINE;            -- pointer to string
124
        begin
125
 
126
                std.textio.write( str, string'(" " ));
127
                writeline( log, str );
128
                writeline( log, str );
129
 
130 10 dsmv
                write( str, string'("check completed" ));
131 2 dsmv
                writeline( log, str );
132 10 dsmv
                write( str, string'("the number of successful tests:  " ));
133 2 dsmv
                write( str, cnt_ok );
134
                writeline( log, str );
135 10 dsmv
                write( str, string'("the number of false test: " ));
136 2 dsmv
                write( str, cnt_error );
137
                writeline( log, str );
138
 
139
 
140
                file_close( log );
141
 
142 10 dsmv
                if( cnt_ok>0 and cnt_error=0 ) then
143
                        write( str, string'("TEST finished successfully") );
144
                        writeline( output, str );
145
                else
146
                        write( str, string'("TEST finished with ERR") );
147
                        writeline( output, str );
148
 
149
                end if;
150
 
151 2 dsmv
        end test_close;
152
 
153
 
154
 
155 10 dsmv
--! Start DMA with incorrect descriptor
156 2 dsmv
procedure test_dsc_incorrect (
157
                signal  cmd:    out bh_cmd; --! команда
158
                signal  ret:    in  bh_ret  --! ответ
159
                )
160
is
161
 
162
variable        adr             : std_logic_vector( 31 downto 0 );
163
variable        data    : std_logic_vector( 31 downto 0 );
164
variable        str             : line;
165
begin
166
 
167
        write( str, string'("TEST_DSC_INCORRECT" ));
168
        writeline( log, str );
169
 
170 10 dsmv
        ---- Init block of descriptor ---
171 2 dsmv
        for ii in 0 to 127 loop
172
                adr:= x"00100000";
173
                adr:=adr + ii*4;
174
                int_mem_write( cmd, ret, adr,  x"00000000" );
175
        end loop;
176
 
177
        int_mem_write( cmd, ret, x"00100000",  x"03020100" );
178
        int_mem_write( cmd, ret, x"001001FC",  x"FF00AA00" );
179
 
180 10 dsmv
        ---- DMA program ----
181 2 dsmv
        block_write( cmd, ret, 4, 8, x"00000027" );             -- DMA_MODE 
182
        block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
183
 
184
        block_write( cmd, ret, 4, 20, x"00100000" );    -- PCI_ADRL 
185
        block_write( cmd, ret, 4, 21, x"00100000" );    -- PCI_ADRH  
186
        block_write( cmd, ret, 4, 23, x"0000A400" );    -- LOCAL_ADR 
187
 
188
        block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START 
189
 
190 10 dsmv
        wait for 20 us;
191 2 dsmv
 
192
        block_read( cmd, ret, 4, 16, data );                    -- STATUS 
193
 
194
        write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
195
        if( data( 15 downto 0 )=x"A021" ) then
196
                write( str, string'(" - Ok" ));
197
                cnt_ok := cnt_ok + 1;
198
        else
199
                write( str, string'(" - Error" ));
200
                cnt_error := cnt_error + 1;
201
        end if;
202
 
203
        writeline( log, str );
204
 
205
        block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL - STOP  
206
 
207
end test_dsc_incorrect;
208
 
209
 
210 10 dsmv
--! Start DMA for one block 4 kB
211 2 dsmv
procedure test_read_4kb (
212
                signal  cmd:    out bh_cmd; --! команда
213
                signal  ret:    in  bh_ret  --! ответ
214
                )
215
is
216
 
217
variable        adr                             : std_logic_vector( 31 downto 0 );
218
variable        data                    : std_logic_vector( 31 downto 0 );
219
variable        str                             : line;
220
 
221
variable        error                   : integer:=0;
222
variable        dma_complete    : integer;
223
 
224
begin
225
 
226
        write( str, string'("TEST_READ_4KB" ));
227
        writeline( log, str );
228
 
229 10 dsmv
        ---- Init block of descriptor ---
230 2 dsmv
        for ii in 0 to 127 loop
231
                adr:= x"00100000";
232
                adr:=adr + ii*4;
233
                int_mem_write( cmd, ret, adr,  x"00000000" );
234
        end loop;
235
 
236
        int_mem_write( cmd, ret, x"00100000",  x"00008000" );
237
        int_mem_write( cmd, ret, x"00100004",  x"00000100" );
238
 
239
 
240
        int_mem_write( cmd, ret, x"001001F8",  x"00000000" );
241
        int_mem_write( cmd, ret, x"001001FC",  x"762C4953" );
242
 
243 10 dsmv
        --wb_block_gen_write( cmd, ret, REG_TEST_GEN_CTRL, x"00000001" ); -- reset
244 2 dsmv
        wb_block_gen_write( cmd, ret, REG_TEST_GEN_CTRL, x"00000000" );
245 10 dsmv
        wb_block_gen_read( cmd, ret, REG_BLOCK_ID, data ); -- read block id
246 2 dsmv
        write( str, string'("BLOCK TEST_GEN  ID: " ));
247
        hwrite( str, data );
248
        writeline( log, str );
249
 
250 10 dsmv
        wb_block_gen_write( cmd, ret, REG_TEST_GEN_SIZE, x"00000001" ); -- size of block = 4 kByte
251 2 dsmv
 
252
 
253 10 dsmv
        ---- DMA program ----
254
        block_write( cmd, ret, 4, 8, x"00000025" );             -- DMA_MODE - without request
255 2 dsmv
        block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
256
 
257
        block_write( cmd, ret, 4, 20, x"00100000" );    -- PCI_ADRL 
258
        block_write( cmd, ret, 4, 21, x"00100000" );    -- PCI_ADRH  
259
        block_write( cmd, ret, 4, 23, TEST_GEN_WB_BURST_SLAVE );        -- LOCAL_ADR 
260
 
261 10 dsmv
        wb_block_gen_write( cmd, ret, REG_TEST_GEN_CTRL, x"000006A0" ); -- start test sequence
262 2 dsmv
 
263
        wait for 1 us;
264
 
265
        block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START 
266
 
267
 
268
        --wb_block_gen_write( cmd, ret, REG_TEST_GEN_CTRL, x"000006A2" );
269
 
270
        wait for 20 us;
271
 
272
        block_read( cmd, ret, 4, 16, data );                    -- STATUS 
273
 
274
        write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
275
        if( data( 8 )='1' ) then
276 10 dsmv
                write( str, string'(" - descriptor is correct" ));
277 2 dsmv
        else
278 10 dsmv
                write( str, string'(" - descriptor is incorrect" ));
279 2 dsmv
                error := error + 1;
280
        end if;
281
 
282
        writeline( log, str );
283
 
284
        if( error=0 ) then
285
 
286 10 dsmv
                ---- Wait for DMA finished ----
287 2 dsmv
                dma_complete := 0;
288
                for ii in 0 to 100 loop
289
 
290
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
291
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
292
                        if( data(5)='1' ) then
293 10 dsmv
                                write( str, string'(" - DMA finished " ));
294 2 dsmv
                                dma_complete := 1;
295
                        end if;
296
                        writeline( log, str );
297
 
298
                        if( dma_complete=1 ) then
299
                                exit;
300
                        end if;
301
 
302
                        wait for 1 us;
303
 
304
                end loop;
305
 
306
                writeline( log, str );
307
 
308
                if( dma_complete=0 ) then
309 10 dsmv
                        write( str, string'("Error - DMA not finished" ));
310 2 dsmv
                        writeline( log, str );
311
                        error:=error+1;
312
                end if;
313
 
314
        end if;
315
 
316
        for ii in 0 to 3 loop
317
 
318
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
319
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
320
                writeline( log, str );
321
                wait for 500 ns;
322
 
323
        end loop;
324
 
325
 
326
        block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL - STOP      
327
 
328 10 dsmv
        write( str, string'(" Read: " ));
329 2 dsmv
        writeline( log, str );
330
 
331
        for ii in 0 to 15 loop
332
 
333
                adr:= x"00800000";
334
                adr:=adr + ii*4;
335
                int_mem_read( cmd, ret, adr,  data );
336
 
337
                write( str, ii ); write( str, string'("   " )); hwrite( str, data );
338
                writeline( log, str );
339
 
340
        end loop;
341
 
342
 
343
--      block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
344
--      block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL 
345
--      block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START     
346
 
347
 
348
        writeline( log, str );
349
        if( error=0 ) then
350 10 dsmv
                write( str, string'("Test is correct" ));
351 2 dsmv
                cnt_ok := cnt_ok + 1;
352
        else
353 10 dsmv
                write( str, string'("Test have ERRORS" ));
354 2 dsmv
                cnt_error := cnt_error + 1;
355
        end if;
356
        writeline( log, str );
357
        writeline( log, str );
358
 
359
end test_read_4kb;
360
 
361
 
362 10 dsmv
--! Read block_test_check 8 kB
363 2 dsmv
procedure test_adm_read_8kb (
364
                signal  cmd:    out bh_cmd; --! команда
365
                signal  ret:    in  bh_ret  --! ответ
366
                )
367
is
368
 
369
variable        adr                             : std_logic_vector( 31 downto 0 );
370
variable        data                    : std_logic_vector( 31 downto 0 );
371
variable        str                             : line;
372
 
373
variable        error                   : integer:=0;
374
variable        dma_complete    : integer;
375
 
376
begin
377
 
378
        write( str, string'("TEST_ADM_READ_8KB" ));
379
        writeline( log, str );
380
 
381 10 dsmv
        ---- Init block of descriptor ---
382 2 dsmv
        for ii in 0 to 127 loop
383
                adr:= x"00100000";
384
                adr:=adr + ii*4;
385
                int_mem_write( cmd, ret, adr,  x"00000000" );
386
        end loop;
387
 
388 10 dsmv
        --- Desctriptor 0 ---
389 2 dsmv
        int_mem_write( cmd, ret, x"00100000",  x"00008000" );
390 10 dsmv
        int_mem_write( cmd, ret, x"00100004",  x"00000111" );   -- jump to next descriptor
391 2 dsmv
 
392 10 dsmv
        --- Desctriptor 1 ---
393 2 dsmv
        int_mem_write( cmd, ret, x"00100008",  x"00008010" );
394 10 dsmv
        int_mem_write( cmd, ret, x"0010000C",  x"00000110" );   -- stop
395 2 dsmv
 
396
 
397
        int_mem_write( cmd, ret, x"001001F8",  x"00000000" );
398
        int_mem_write( cmd, ret, x"001001FC",  x"D6644953" );
399
 
400
 
401
        ---- Программирование канала DMA ----
402
        block_write( cmd, ret, 4, 8, x"00000027" );             -- DMA_MODE 
403
        block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
404
 
405
        block_write( cmd, ret, 4, 20, x"00100000" );    -- PCI_ADRL 
406
        block_write( cmd, ret, 4, 21, x"00100000" );    -- PCI_ADRH  
407
        block_write( cmd, ret, 4, 23, TEST_GEN_WB_BURST_SLAVE );        -- LOCAL_ADR 
408
 
409
 
410 10 dsmv
        wb_block_gen_write( cmd, ret, REG_TEST_GEN_CTRL, x"00000001" ); -- reset
411 2 dsmv
        wb_block_gen_write( cmd, ret, REG_TEST_GEN_CTRL, x"00000000" );
412 10 dsmv
        wb_block_gen_read( cmd, ret, REG_BLOCK_ID, data ); -- read block id
413 2 dsmv
        write( str, string'("BLOCK TEST_GEN  ID: " ));
414
        hwrite( str, data );
415
        writeline( log, str );
416
 
417 10 dsmv
        wb_block_gen_write( cmd, ret, REG_TEST_GEN_SIZE, x"00000001" ); -- size of block = 4 kByte
418 2 dsmv
 
419
        block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START 
420
 
421 10 dsmv
        wb_block_gen_write( cmd, ret, REG_TEST_GEN_CTRL, x"000006A0" ); -- start test sequence  
422 2 dsmv
 
423
        wait for 20 us;
424
 
425
        block_read( cmd, ret, 4, 16, data );                    -- STATUS 
426
 
427
        write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
428
        if( data( 8 )='1' ) then
429 10 dsmv
                write( str, string'(" - descriptor is correct" ));
430 2 dsmv
        else
431 10 dsmv
                write( str, string'(" - descriptor is incorrect" ));
432 2 dsmv
                error := error + 1;
433
        end if;
434
 
435
        writeline( log, str );
436
 
437
        if( error=0 ) then
438
 
439
                ---- Ожидание завершения DMA ----
440
                dma_complete := 0;
441
                for ii in 0 to 100 loop
442
 
443
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
444
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
445
                        if( data(5)='1' ) then
446 10 dsmv
                                write( str, string'(" - DMA finished " ));
447 2 dsmv
                                dma_complete := 1;
448
 
449 10 dsmv
                                block_write( cmd, ret, 4, 16#11#, x"00000010" );                -- FLAG_CLR - reset EOT 
450 2 dsmv
 
451
                        end if;
452
                        writeline( log, str );
453
 
454
                        if( dma_complete=1 ) then
455
                                exit;
456
                        end if;
457
 
458
                        wait for 1 us;
459
 
460
                end loop;
461
 
462
                writeline( log, str );
463
 
464
                if( dma_complete=0 ) then
465 10 dsmv
                        write( str, string'("Error - DMA not finished " ));
466 2 dsmv
                        writeline( log, str );
467
                        error:=error+1;
468
                end if;
469
 
470
        end if;
471
 
472
        for ii in 0 to 3 loop
473
 
474
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
475
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
476
                writeline( log, str );
477
                wait for 500 ns;
478
 
479
        end loop;
480
 
481
 
482
        block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL - STOP      
483
 
484 10 dsmv
        write( str, string'(" Block 0 - read: " ));
485 2 dsmv
        writeline( log, str );
486
 
487
        for ii in 0 to 15 loop
488
 
489
                adr:= x"00800000";
490
                adr:=adr + ii*4;
491
                int_mem_read( cmd, ret, adr,  data );
492
 
493
                write( str, ii ); write( str, string'("   " )); hwrite( str, data );
494
                writeline( log, str );
495
 
496
        end loop;
497
 
498
        writeline( log, str );
499
 
500 10 dsmv
        write( str, string'(" Block 1 - read: " ));
501 2 dsmv
        writeline( log, str );
502
 
503
        for ii in 0 to 15 loop
504
 
505
                adr:= x"00801000";
506
                adr:=adr + ii*4;
507
                int_mem_read( cmd, ret, adr,  data );
508
 
509
                write( str, ii ); write( str, string'("   " )); hwrite( str, data );
510
                writeline( log, str );
511
 
512
        end loop;
513
 
514
 
515
--      block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
516
--      block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL 
517
--      block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START     
518
 
519
 
520
        writeline( log, str );
521
        if( error=0 ) then
522 10 dsmv
                write( str, string'(" Test is correct " ));
523 2 dsmv
                cnt_ok := cnt_ok + 1;
524
        else
525 10 dsmv
                write( str, string'(" Test have ERRORS " ));
526 2 dsmv
                cnt_error := cnt_error + 1;
527
        end if;
528
        writeline( log, str );
529
        writeline( log, str );
530
 
531
end test_adm_read_8kb;
532
--
533
--
534
----! Проверка обращений к блоку MAIN 
535
--procedure test_block_main (
536
--              signal  cmd:    out bh_cmd; --! команда
537
--              signal  ret:    in  bh_ret  --! ответ
538
--              )
539
--is
540
--
541
--variable      adr                             : std_logic_vector( 31 downto 0 );
542
--variable      data                    : std_logic_vector( 31 downto 0 );
543
--variable      str                             : line;                    
544
--
545
--variable      error                   : integer:=0;
546
--variable      dma_complete    : integer;
547
--
548
--begin
549
--              
550
--      write( str, string'("TEST_BLOCK_MAIN" ));
551
--      writeline( log, str );  
552
--
553
--      block_read( cmd, ret, 4, 16#00#, data );                        
554
--      write( str,  string'("БЛОК 4: " )); hwrite( str, data ); writeline( log, str ); 
555
--
556
--      wait for 10 us;
557
--      
558
----    write( str, "Константы:" );
559
----    writeline( log, str );  
560
----    for ii in 0 to 5 loop
561
----            write( str, "Блок " );
562
----            write( str, ii );
563
----            for jj in 0 to 7 loop
564
----                    block_read( cmd, ret, ii, jj, data );                   
565
----                    write( str, "   " );
566
----                    hwrite( str, data );
567
----            end loop;
568
----            writeline( log, str );          
569
----    end loop;
570
----            
571
----    
572
----    writeline( log, str );                                                  
573
----    
574
----    block_read( cmd, ret, 0, 16#10#, data );                        
575
----    write( str,  "STATUS: " ); hwrite( str, data ); writeline( log, str );  
576
----    
577
----    block_write( cmd, ret, 80, 16#08#, x"00000100" );                       
578
----    
579
----    block_read( cmd, ret, 0, 16#10#, data );                        
580
----    write( str, "STATUS: " ); hwrite( str, data ); writeline( log, str );   
581
----    
582
----    block_write( cmd, ret, 80, 16#08#, x"00000200" );                       
583
----    
584
----    block_read( cmd, ret, 0, 16#10#, data );                        
585
----    write( str, "STATUS: " ); hwrite( str, data ); writeline( log, str );   
586
----    
587
----    
588
----    writeline( log, str );          
589
----    if( error=0 ) then
590
----            write( str, " Тест завершён успешно " );
591
----            cnt_ok := cnt_ok + 1;
592
----    else
593
----            write( str, " Тест не выполнен " );
594
----            cnt_error := cnt_error + 1;
595
----    end if;
596
--
597
--      for ii in 0 to 127 loop
598
--      
599
--              block_write( cmd, ret, 4, 16#08#, x"0000AA55" );                                
600
--              block_read( cmd, ret, 4, 8, data );
601
--              write( str, string'("READ: " )); hwrite( str, data( 15 downto 0 ) ); writeline( log, str );             
602
--              if( data/=x"0000AA55" ) then
603
--                      error:=error+1;
604
--              end if;
605
--      
606
--      end loop;
607
--      
608
--      
609
--
610
--
611
--      writeline( log, str );  
612
--      writeline( log, str );          
613
--
614
--end test_block_main;
615
--                      
616
--
617
--
618
--
619
----! Чтение 16 кБ с использованием двух блоков дескрипторов
620
--procedure test_adm_read_16kb (
621
--              signal  cmd:    out bh_cmd; --! команда
622
--              signal  ret:    in  bh_ret  --! ответ
623
--              )
624
--is
625
--
626
--variable      adr                             : std_logic_vector( 31 downto 0 );
627
--variable      data                    : std_logic_vector( 31 downto 0 );
628
--variable      str                             : line;                    
629
--
630
--variable      error                   : integer:=0;
631
--variable      dma_complete    : integer; 
632
--variable      kk                              : integer;       
633
--variable      status                  : std_logic_vector( 15 downto 0 );
634
--
635
--begin
636
--              
637
--      write( str, string'("TEST_ADM_READ_16KB" ));
638
--      writeline( log, str );  
639
--      
640
--      ---- Формирование блока дескрипторов ---
641
--      for ii in 0 to 256 loop
642
--              adr:= x"00100000";
643
--              adr:=adr + ii*4;
644
--              int_mem_write( cmd, ret, adr,  x"00000000" );
645
--      end loop;                                                                                
646
--      
647
--      --- Блок 0 ---
648
--      
649
--      --- Дескриптор 0 ---
650
--      int_mem_write( cmd, ret, x"00100000",  x"00008000" ); 
651
--      int_mem_write( cmd, ret, x"00100004",  x"00000111" );   -- переход к следующему дескриптору 
652
--
653
--      --- Дескриптор 1 ---
654
--      int_mem_write( cmd, ret, x"00100008",  x"00008010" ); 
655
--      int_mem_write( cmd, ret, x"0010000C",  x"00000112" );   -- переход к следующему блоку 
656
--
657
--      --- Дескриптор 2 ---
658
--      int_mem_write( cmd, ret, x"00100010",  x"00001002" );   -- адрес следующего дескриптора 
659
--      int_mem_write( cmd, ret, x"00100014",  x"00000000" );   
660
--      
661
--      
662
--      int_mem_write( cmd, ret, x"001001F8",  x"00000000" );
663
--      int_mem_write( cmd, ret, x"001001FC",  x"14644953" );      
664
--      
665
--
666
--      --- Блок 1 ---
667
--      
668
--      --- Дескриптор 0 ---
669
--      int_mem_write( cmd, ret, x"00100200",  x"00008020" ); 
670
--      int_mem_write( cmd, ret, x"00100204",  x"00000111" );   -- переход к следующему дескриптору 
671
--
672
--      --- Дескриптор 1 ---
673
--      int_mem_write( cmd, ret, x"00100208",  x"00008030" ); 
674
--      int_mem_write( cmd, ret, x"0010020C",  x"00000110" );   -- остановка
675
--      
676
--      
677
--      int_mem_write( cmd, ret, x"001003F8",  x"00000000" );
678
--      int_mem_write( cmd, ret, x"001003FC",  x"D67C4953" );      
679
--      
680
--      
681
--      
682
--      ---- Программирование канала DMA ----
683
--      block_write( cmd, ret, 4, 8, x"00000027" );             -- DMA_MODE 
684
--      block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
685
--      
686
--      block_write( cmd, ret, 4, 20, x"00100000" );    -- PCI_ADRL 
687
--      block_write( cmd, ret, 4, 21, x"00100000" );    -- PCI_ADRH  
688
--      block_write( cmd, ret, 4, 23, x"00019000" );    -- LOCAL_ADR 
689
--      
690
--      
691
--      ---- Подготовка тетрады ----
692
--      trd_test_mode( cmd, ret, 0 );   -- переход в рабочий режим --
693
--      trd_wait_cmd( cmd, ret, 0, 16, x"1600" );               -- DMAR0 - от тетрады 6 --
694
--
695
--      trd_wait_cmd( cmd, ret, 1, 16#1F#, x"0001" );   -- Размер блока = 4 кБ --
696
--
697
--      block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START 
698
--
699
--      trd_wait_cmd( cmd, ret, 1, 16#0F#, x"0001" );   -- Подключение выхода генератора к DIO_IN --
700
--      
701
--      trd_wait_cmd( cmd, ret, 6,      0, x"2038" );           -- запуск тетрады DIO_IN
702
--      
703
--      trd_wait_cmd( cmd, ret, 1, 16#1E#, x"0020" );   -- Запуск тестовой последовательности --
704
--      
705
--      wait for 20 us;
706
--      
707
--      block_read( cmd, ret, 4, 16, data );                    -- STATUS 
708
--      
709
--      write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
710
--      if( data( 8 )='1' ) then
711
--              write( str, string'(" - Дескриптор правильный" ));      
712
--      else
713
--              write( str, string'(" - Ошибка чтения дескриптора" ));
714
--              error := error + 1;
715
--      end if;
716
--      
717
--      writeline( log, str );  
718
--      
719
--      if( error=0 ) then                 
720
--              
721
--              kk:=0;
722
--              loop
723
--                      
724
--              trd_status( cmd, ret, 6, status );
725
--              write( str, string'("TRD_STATUS: " )); hwrite( str, status );
726
--                      
727
--              block_read( cmd, ret, 4, 16, data );                    -- STATUS 
728
--              write( str, string'("    STATUS: " )); hwrite( str, data( 15 downto 0 ) );
729
--              
730
--                      if( data(4)='1' ) then
731
--                              write( str, string'(" - завершено чтение блока " ));
732
--                              block_write( cmd, ret, 4, 16#11#, x"00000010" );                -- FLAG_CLR - сброс EOT 
733
--                              kk:=kk+1;
734
--                              if( kk=4 ) then
735
--                                      exit;
736
--                              end if;
737
--                      end if;
738
--                      writeline( log, str );                  
739
--                      
740
--                      wait for 500 ns;
741
--                      
742
--                      
743
--              end loop;
744
--              
745
--              ---- Ожидание завершения DMA ----
746
--              dma_complete := 0;
747
--              for ii in 0 to 100 loop
748
--                      
749
--              block_read( cmd, ret, 4, 16, data );                    -- STATUS 
750
--              write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
751
--                      if( data(5)='1' ) then
752
--                              write( str, string'(" - DMA завершён " ));
753
--                              dma_complete := 1;      
754
--                              
755
--                              block_write( cmd, ret, 4, 16#11#, x"00000010" );                -- FLAG_CLR - сброс EOT 
756
--                              
757
--                      end if;
758
--                      writeline( log, str );                  
759
--                      
760
--                      if( dma_complete=1 ) then
761
--                              exit;
762
--                      end if;            
763
--                      
764
--                      wait for 1 us;
765
--                      
766
--              end loop;
767
--      
768
--              writeline( log, str );                  
769
--              
770
--              if( dma_complete=0 ) then
771
--                      write( str, string'("Ошибка - DMA не завершён " ));
772
--                      writeline( log, str );                  
773
--                      error:=error+1;
774
--              end if;
775
--
776
--      end if; 
777
--      
778
--      for ii in 0 to 3 loop
779
--                      
780
--              block_read( cmd, ret, 4, 16, data );                    -- STATUS 
781
--              write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
782
--              writeline( log, str );                  
783
--              wait for 500 ns;
784
--              
785
--      end loop;
786
--      
787
--      
788
--      block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL - STOP      
789
--      
790
--      write( str, string'(" Блок 0 - прочитано: " ));
791
--      writeline( log, str );          
792
--      
793
--      for ii in 0 to 15 loop
794
--
795
--              adr:= x"00800000";
796
--              adr:=adr + ii*4;
797
--              int_mem_read( cmd, ret, adr,  data );
798
--              
799
--              write( str, ii ); write( str, string'("   " )); hwrite( str, data );
800
--              writeline( log, str );          
801
--              
802
--      end loop;
803
--
804
--      writeline( log, str );          
805
--      
806
--      write( str, string'(" Блок 1 - прочитано: " ));
807
--      writeline( log, str );          
808
--      
809
--      for ii in 0 to 15 loop
810
--
811
--              adr:= x"00801000";
812
--              adr:=adr + ii*4;
813
--              int_mem_read( cmd, ret, adr,  data );
814
--              
815
--              write( str, ii ); write( str, string'("   " )); hwrite( str, data );
816
--              writeline( log, str );          
817
--              
818
--      end loop;
819
--
820
--      write( str, string'(" Блок 2 - прочитано: " ));
821
--      writeline( log, str );          
822
--      
823
--      for ii in 0 to 15 loop
824
--
825
--              adr:= x"00802000";
826
--              adr:=adr + ii*4;
827
--              int_mem_read( cmd, ret, adr,  data );
828
--              
829
--              write( str, ii ); write( str, string'("   " )); hwrite( str, data );
830
--              writeline( log, str );          
831
--              
832
--      end loop;
833
--              
834
--      
835
--      write( str, string'(" Блок 3 - прочитано: " ));
836
--      writeline( log, str );          
837
--      
838
--      for ii in 0 to 15 loop
839
--
840
--              adr:= x"00803000";
841
--              adr:=adr + ii*4;
842
--              int_mem_read( cmd, ret, adr,  data );
843
--              
844
--              write( str, ii ); write( str, string'("   " )); hwrite( str, data );
845
--              writeline( log, str );          
846
--              
847
--      end loop;
848
--              
849
----    block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
850
----    block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL 
851
----    block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START     
852
--      
853
--      
854
--      writeline( log, str );          
855
--      if( error=0 ) then
856
--              write( str, string'(" Тест завершён успешно " ));
857
--              cnt_ok := cnt_ok + 1;
858
--      else
859
--              write( str, string'(" Тест не выполнен " ));
860
--              cnt_error := cnt_error + 1;
861
--      end if;
862
--      writeline( log, str );  
863
--      writeline( log, str );          
864
--
865
--end test_adm_read_16kb;
866
--
867
--
868
--
869
--
870
--! Запись 16 кБ с использованием двух блоков дескрипторов
871
procedure test_adm_write_16kb (
872
                signal  cmd:    out bh_cmd; --! команда
873
                signal  ret:    in  bh_ret  --! ответ
874
                )
875
is
876
 
877
variable        adr                             : std_logic_vector( 31 downto 0 );
878
variable        data                    : std_logic_vector( 31 downto 0 );
879
variable        str                             : line;
880
 
881
variable        error                   : integer:=0;
882
variable        dma_complete    : integer;
883
variable        kk                              : integer;
884
variable        status                  : std_logic_vector( 15 downto 0 );
885
 
886
variable        data64                  : std_logic_vector( 63 downto 0 );
887
variable        data64n                 : std_logic_vector( 63 downto 0 );
888
 
889
begin
890
 
891
        write( str, string'("TEST_ADM_WRITE_16KB" ));
892
        writeline( log, str );
893
 
894
        ---- Формирование блока дескрипторов ---
895
        for ii in 0 to 256 loop
896
                adr:= x"00100000";
897
                adr:=adr + ii*4;
898
                int_mem_write( cmd, ret, adr,  x"00000000" );
899
        end loop;
900
 
901
 
902
        data64 :=x"0000000000000000";
903
        data64n := not data64;
904
 
905
        ---- Заполнение блока 0 ----
906
        adr:= x"00800000";
907
    data:=x"A5A50123";
908
        int_mem_write( cmd, ret, adr,  data );
909
        adr:=adr + 4;
910
 
911
        data:=x"00000000";
912
        int_mem_write( cmd, ret, adr,  data );
913
        adr:=adr + 4;
914
 
915
        int_mem_write( cmd, ret, adr,  data64n( 31 downto 0 ) );
916
        adr:=adr + 4;
917
 
918
        int_mem_write( cmd, ret, adr,  data64n( 63 downto 32 ) );
919
        adr:=adr + 4;
920
 
921
        data64:=data64 + 1;
922
        data64n := not data64;
923
 
924
        for ii in 0 to 254 loop
925
                int_mem_write( cmd, ret, adr,  data64( 31 downto 0 ) );
926
                adr:=adr + 4;
927
                int_mem_write( cmd, ret, adr,  data64( 63 downto 32 ) );
928
                adr:=adr + 4;
929
 
930
                int_mem_write( cmd, ret, adr,  data64n( 31 downto 0 ) );
931
                adr:=adr + 4;
932
                int_mem_write( cmd, ret, adr,  data64n( 63 downto 32 ) );
933
                adr:=adr + 4;
934
 
935
                data64:=data64 + 1;
936
                data64n := not data64;
937
 
938
        end loop;
939
 
940
        ---- Заполнение блока 1 ----
941
        adr:= x"00801000";
942
    data:=x"A5A50123";
943
        int_mem_write( cmd, ret, adr,  data );
944
        adr:=adr + 4;
945
 
946
        data:=x"00000001";
947
        int_mem_write( cmd, ret, adr,  data );
948
        adr:=adr + 4;
949
 
950
        int_mem_write( cmd, ret, adr,  data64n( 31 downto 0 ) );
951
        adr:=adr + 4;
952
 
953
        int_mem_write( cmd, ret, adr,  data64n( 63 downto 32 ) );
954
        adr:=adr + 4;
955
 
956
        data64:=data64 + 1;
957
        data64n := not data64;
958
 
959
        for ii in 0 to 254 loop
960
                int_mem_write( cmd, ret, adr,  data64( 31 downto 0 ) );
961
                adr:=adr + 4;
962
                int_mem_write( cmd, ret, adr,  data64( 63 downto 32 ) );
963
                adr:=adr + 4;
964
 
965
                int_mem_write( cmd, ret, adr,  data64n( 31 downto 0 ) );
966
                adr:=adr + 4;
967
                int_mem_write( cmd, ret, adr,  data64n( 63 downto 32 ) );
968
                adr:=adr + 4;
969
 
970
                data64:=data64 + 1;
971
                data64n := not data64;
972
 
973
        end loop;
974
 
975
        ---- Заполнение блока 2 ----
976
        adr:= x"00802000";
977
    data:=x"A5A50123";
978
        int_mem_write( cmd, ret, adr,  data );
979
        adr:=adr + 4;
980
 
981
        data:=x"00000002";
982
        int_mem_write( cmd, ret, adr,  data );
983
        adr:=adr + 4;
984
 
985
        int_mem_write( cmd, ret, adr,  data64n( 31 downto 0 ) );
986
        adr:=adr + 4;
987
 
988
        int_mem_write( cmd, ret, adr,  data64n( 63 downto 32 ) );
989
        adr:=adr + 4;
990
 
991
        data64:=data64 + 1;
992
        data64n := not data64;
993
 
994
        for ii in 0 to 254 loop
995
                int_mem_write( cmd, ret, adr,  data64( 31 downto 0 ) );
996
                adr:=adr + 4;
997
                int_mem_write( cmd, ret, adr,  data64( 63 downto 32 ) );
998
                adr:=adr + 4;
999
 
1000
                int_mem_write( cmd, ret, adr,  data64n( 31 downto 0 ) );
1001
                adr:=adr + 4;
1002
                int_mem_write( cmd, ret, adr,  data64n( 63 downto 32 ) );
1003
                adr:=adr + 4;
1004
 
1005
                data64:=data64 + 1;
1006
                data64n := not data64;
1007
 
1008
        end loop;
1009
 
1010
        ---- Заполнение блока 3 ----
1011
        adr:= x"00803000";
1012
    data:=x"A5A50123";
1013
        int_mem_write( cmd, ret, adr,  data );
1014
        adr:=adr + 4;
1015
 
1016
        data:=x"00000003";
1017
        int_mem_write( cmd, ret, adr,  data );
1018
        adr:=adr + 4;
1019
 
1020
        int_mem_write( cmd, ret, adr,  data64n( 31 downto 0 ) );
1021
        adr:=adr + 4;
1022
 
1023
        int_mem_write( cmd, ret, adr,  data64n( 63 downto 32 ) );
1024
        adr:=adr + 4;
1025
 
1026
        data64:=data64 + 1;
1027
        data64n := not data64;
1028
 
1029
        for ii in 0 to 254 loop
1030
                int_mem_write( cmd, ret, adr,  data64( 31 downto 0 ) );
1031
                adr:=adr + 4;
1032
                int_mem_write( cmd, ret, adr,  data64( 63 downto 32 ) );
1033
                adr:=adr + 4;
1034
 
1035
                int_mem_write( cmd, ret, adr,  data64n( 31 downto 0 ) );
1036
                adr:=adr + 4;
1037
                int_mem_write( cmd, ret, adr,  data64n( 63 downto 32 ) );
1038
                adr:=adr + 4;
1039
 
1040
                data64:=data64 + 1;
1041
                data64n := not data64;
1042
 
1043
        end loop;
1044
--      for ii in 0 to 256 loop
1045
--              adr:= x"00802000";
1046
--              adr:=adr + ii*4;
1047
--              data:=x"00A20000";
1048
--              data:=data + ii;
1049
--              int_mem_write( cmd, ret, adr,  data );
1050
--      end loop;       
1051
--
1052
--      for ii in 0 to 256 loop
1053
--              adr:= x"00803000";
1054
--              adr:=adr + ii*4;
1055
--              data:=x"00A30000";
1056
--              data:=data + ii;
1057
--              int_mem_write( cmd, ret, adr,  data );
1058
--      end loop;       
1059
 
1060
        --- Блок 0 ---
1061
 
1062
        --- Дескриптор 0 ---
1063
        int_mem_write( cmd, ret, x"00100000",  x"00008000" );
1064
        int_mem_write( cmd, ret, x"00100004",  x"00000011" );   -- переход к следующему дескриптору 
1065
 
1066
        --- Дескриптор 1 ---
1067
        int_mem_write( cmd, ret, x"00100008",  x"00008010" );
1068
        int_mem_write( cmd, ret, x"0010000C",  x"00000012" );   -- переход к следующему блоку 
1069
 
1070
        --- Дескриптор 2 ---
1071
        int_mem_write( cmd, ret, x"00100010",  x"00001002" );   -- адрес следующего дескриптора 
1072
        int_mem_write( cmd, ret, x"00100014",  x"00000000" );
1073
 
1074
 
1075
        int_mem_write( cmd, ret, x"001001F8",  x"00000000" );
1076
        int_mem_write( cmd, ret, x"001001FC",  x"14A44953" );
1077
 
1078
 
1079
        --- Блок 1 ---
1080
 
1081
        --- Дескриптор 0 ---
1082
        int_mem_write( cmd, ret, x"00100200",  x"00008020" );
1083
        int_mem_write( cmd, ret, x"00100204",  x"00000011" );   -- переход к следующему дескриптору 
1084
 
1085
        --- Дескриптор 1 ---
1086
        int_mem_write( cmd, ret, x"00100208",  x"00008030" );
1087
        int_mem_write( cmd, ret, x"0010020C",  x"00000010" );   -- остановка
1088
 
1089
 
1090
        int_mem_write( cmd, ret, x"001003F8",  x"00000000" );
1091
        int_mem_write( cmd, ret, x"001003FC",  x"D6BC4953" );
1092
 
1093
 
1094
 
1095
        ---- Программирование канала DMA ----
1096
        block_write( cmd, ret, 5, 8, x"00000023" );             -- DMA_MODE  - с запросами 
1097
        --block_write( cmd, ret, 5, 8, x"00000021" );           -- DMA_MODE - без запросов
1098
        block_write( cmd, ret, 5, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
1099
 
1100
        block_write( cmd, ret, 5, 20, x"00100000" );    -- PCI_ADRL 
1101
        block_write( cmd, ret, 5, 21, x"00100000" );    -- PCI_ADRH  
1102
        block_write( cmd, ret, 5, 23, x"00001000" );    -- LOCAL_ADR 
1103
 
1104
 
1105
        ---- Подготовка тетрады ----
1106
--      trd_test_mode( cmd, ret, 0 );   -- переход в рабочий режим --
1107
--      trd_wait_cmd( cmd, ret, 0, 16, x"1700" );               -- DMAR0 - от тетрады 7 --
1108
--
1109
--      trd_wait_cmd( cmd, ret, 1, 16#1D#, x"0001" );   -- Размер блока = 4 кБ --
1110
 
1111
        wb_block_check_write( cmd, ret, REG_TEST_CHECK_CTRL, x"00000001" ); -- сброс
1112
        wb_block_check_write( cmd, ret, REG_TEST_CHECK_CTRL, x"00000000" );
1113
        wb_block_check_read( cmd, ret, REG_BLOCK_ID, data ); -- чтение идентификатора блока
1114
        write( str, string'("BLOCK TEST_CHECK  ID: " ));
1115
        hwrite( str, data );
1116
        writeline( log, str );
1117
 
1118
        wb_block_check_write( cmd, ret, REG_TEST_CHECK_SIZE, x"00000001" ); -- размер блока - 1 килобайт
1119
 
1120
        wb_block_check_write( cmd, ret, REG_TEST_CHECK_CTRL, x"000006A0" ); -- запуск тестовой последовательности       
1121
        --
1122
        --
1123
        --
1124
        data:=wb_block_check_burst_ctrl_build('1', 40, 473);
1125
        wb_block_check_write( cmd, ret, REG_TEST_CHECK_WBS_BURST_CTRL, data);
1126
        --
1127
        --
1128
        --
1129
        block_write( cmd, ret, 5, 9, x"00000001" );             -- DMA_CTRL - START 
1130
 
1131
--      trd_wait_cmd( cmd, ret, 1, 16#0F#, x"0001" );   -- Подключение выхода генератора к DIO_IN --
1132
--      
1133
--      trd_wait_cmd( cmd, ret, 7,      0, x"2038" );           -- запуск тетрады DIO_OUT 
1134
--      
1135
--      trd_wait_cmd( cmd, ret, 1, 16#1C#, x"0020" );   -- Запуск тестовой последовательности --
1136
 
1137
        wait for 20 us;
1138
 
1139
 
1140
        for ii in 0 to 20 loop
1141
                block_read( cmd, ret, 5, 16, data );                    -- STATUS 
1142
 
1143
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
1144
                if( data( 8 )='1' ) then
1145
                        write( str, string'(" - Дескриптор правильный" ));
1146
                        error := 0;
1147
                        exit;
1148
                else
1149
                        write( str, string'(" - Ошибка чтения дескриптора" ));
1150
                        error := error + 1;
1151
                        wait for 10 us;
1152
                end if;
1153
 
1154
                writeline( log, str );
1155
        end loop;
1156
 
1157
 
1158
        if( error=0 ) then
1159
 
1160
                kk:=0;
1161
                loop
1162
 
1163
--              trd_status( cmd, ret, 6, status );
1164
--              write( str, string'("TRD_STATUS: " )); hwrite( str, status );
1165
 
1166
                block_read( cmd, ret, 5, 16, data );                    -- STATUS 
1167
                write( str, string'("    STATUS: " )); hwrite( str, data( 15 downto 0 ) );
1168
 
1169
                        if( data(4)='1' ) then
1170
                                write( str, string'(" - завершена передача блока " ));
1171
                                block_write( cmd, ret, 4, 16#11#, x"00000010" );                -- FLAG_CLR - сброс EOT 
1172
                                kk:=kk+1;
1173
                                if( kk=4 ) then
1174
                                        exit;
1175
                                end if;
1176
                        end if;
1177
                        writeline( log, str );
1178
 
1179
                        wait for 500 ns;
1180
 
1181
 
1182
                end loop;
1183
 
1184
                ---- Ожидание завершения DMA ----
1185
                dma_complete := 0;
1186
                for ii in 0 to 100 loop
1187
 
1188
                block_read( cmd, ret, 5, 16, data );                    -- STATUS 
1189
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
1190
 
1191
                        if( data(4)='1' ) then
1192
                                write( str, string'(" - завершёна передача блока " ));
1193
 
1194
                                block_write( cmd, ret, 5, 16#11#, x"00000010" );                -- FLAG_CLR - сброс EOT 
1195
 
1196
                        end if;
1197
                        writeline( log, str );
1198
 
1199
 
1200
                        if( data(5)='1' ) then
1201
                                write( str, string'(" - DMA завершён " ));
1202
                                dma_complete := 1;
1203
 
1204
                                block_write( cmd, ret, 5, 16#11#, x"00000010" );                -- FLAG_CLR - сброс EOT 
1205
 
1206
                        end if;
1207
                        writeline( log, str );
1208
 
1209
                        if( dma_complete=1 ) then
1210
                                exit;
1211
                        end if;
1212
 
1213
                        wait for 1 us;
1214
 
1215
                end loop;
1216
 
1217
                writeline( log, str );
1218
 
1219
                if( dma_complete=0 ) then
1220
                        write( str, string'("Ошибка - DMA не завершён " ));
1221
                        writeline( log, str );
1222
                        error:=error+1;
1223
                end if;
1224
 
1225
        end if;
1226
 
1227
        for ii in 0 to 3 loop
1228
 
1229
                block_read( cmd, ret, 5, 16, data );                    -- STATUS 
1230
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
1231
                writeline( log, str );
1232
                wait for 500 ns;
1233
 
1234
        end loop;
1235
 
1236
        wait for 10 us;
1237
 
1238
        wb_block_check_read( cmd, ret, REG_TEST_CHECK_BL_RD, data );
1239
        write( str, string'( "Принято блоков: " ) );
1240
        hwrite( str, data );
1241
        kk := conv_integer( data );
1242
        if( 4/=kk ) then
1243
                write( str, string'( " - Ошибка" ) );
1244
                error := error + 1;
1245
        else
1246
                write( str, string'( " - Ok" ) );
1247
        end if;
1248
        writeline( log, str );
1249
 
1250
        wb_block_check_read( cmd, ret, REG_TEST_CHECK_BL_OK, data );
1251
        write( str, string'( "TEST_CHECK_BL_OK: " ) );
1252
        hwrite( str, data );
1253
        kk := conv_integer( data );
1254
        if( 3/=kk ) then
1255
                write( str, string'( " - Ошибка" ) );
1256
                error := error + 1;
1257
        else
1258
                write( str, string'( " - Ok" ) );
1259
        end if;
1260
        writeline( log, str );
1261
 
1262
        wb_block_check_read( cmd, ret, REG_TEST_CHECK_BL_ERROR, data );
1263
        write( str, string'( "TEST_CHECK_BL_ERROR: " ) );
1264
        hwrite( str, data );
1265
        kk := conv_integer( data );
1266
        if( 0/=kk ) then
1267
                write( str, string'( " - Ошибка" ) );
1268
                error := error + 1;
1269
        else
1270
                write( str, string'( " - Ok" ) );
1271
        end if;
1272
        writeline( log, str );
1273
 
1274
 
1275
 
1276
        block_write( cmd, ret, 5, 9, x"00000000" );             -- DMA_CTRL - STOP      
1277
 
1278
 
1279
--      block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
1280
--      block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL 
1281
--      block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START     
1282
 
1283
 
1284
        writeline( log, str );
1285
        if( error=0 ) then
1286
                write( str, string'(" Тест завершён успешно " ));
1287
                cnt_ok := cnt_ok + 1;
1288
        else
1289
                write( str, string'(" Тест не выполнен " ));
1290
                cnt_error := cnt_error + 1;
1291
        end if;
1292
        writeline( log, str );
1293
        writeline( log, str );
1294
 
1295
end test_adm_write_16kb;
1296
---------------------------------------------------------------------------------------------------
1297
--
1298
-- My procedure for test Updated Design (test_read_4kb like refenernce)
1299
--
1300
procedure test_num_1 (
1301
                            signal  cmd:    out bh_cmd; --! команда
1302
                            signal  ret:    in  bh_ret  --! ответ
1303
                        ) is
1304
 
1305
    variable    adr             : std_logic_vector( 31 downto 0 );
1306
    variable    data            : std_logic_vector( 31 downto 0 );
1307
    variable    str             : line;
1308
 
1309
    variable    error           : integer:=0;
1310
    variable    dma_complete    : integer:=0;
1311
 
1312
begin
1313
    -- Init Header
1314
    write( str, string'("TEST#1: simple test of WB CORSS logic - read from empty place" ));
1315
    writeline( log, str );
1316
    --
1317
    ---- Формирование блока дескрипторов ---
1318
    for ii in 0 to 127 loop
1319
        adr:= x"00100000";
1320
        adr:=adr + ii*4;
1321
        int_mem_write( cmd, ret, adr,  x"00000000" );
1322
    end loop;
1323
    -- HOST MEM Writes:
1324
    int_mem_write( cmd, ret, x"00100000",  x"00008000" );   -- 
1325
    int_mem_write( cmd, ret, x"00100004",  x"00000100" );   -- 
1326
 
1327
    int_mem_write( cmd, ret, x"001001F8",  x"00000000" );   -- 
1328
    int_mem_write( cmd, ret, x"001001FC",  x"762C4953" );   -- 
1329
    --
1330
    ---- Программирование канала DMA ---- PE_EXT_FIFO module: have bug in PE_EXT_FIFO, for check WB we will make a trick:
1331
    block_write( cmd, ret, 4, 8, x"00000027" );     -- DMA_MODE - DEMAND_MODE==ON 
1332
    block_write( cmd, ret, 4, 9, x"00000010" );     -- DMA_CTRL - RESET FIFO 
1333
 
1334
    block_write( cmd, ret, 4, 20, x"00100000" );    -- PCI_ADRL
1335
    block_write( cmd, ret, 4, 21, x"00100000" );    -- PCI_ADRH
1336
    block_write( cmd, ret, 4, 23, x"0000A400" );    -- LOCAL_ADR : xA400 addr - check WB CROSS logic, rx value must be EQU to p_TEST_DATA_64BIT in current design
1337
 
1338
    block_write( cmd, ret, 4, 9, x"00000001" );     -- DMA_CTRL - START
1339
    --
1340
    -- Delay for design: trick for afoid bug in PE_EXT_FIFO --> Ошибка #24
1341
    wait for 1 us;
1342
    block_write( cmd, ret, 4, 8, x"00000025" );     -- DMA_MODE - DEMAND_MODE==OFF 
1343
    --
1344
    -- Delay for design
1345
    wait for 20 us;
1346
    --
1347
    -- Read STATUS 
1348
    block_read( cmd, ret, 4, 16, data );
1349
    -- Construct LOG MSG in accordance to STATUS value and update ERR counter
1350
    write( str, string'(" STATUS: " )); hwrite( str, data( 15 downto 0 ) );
1351
    if( data( 8 )='1' ) then
1352
        write( str, string'(" - Descriptor==OK" ));
1353
    else
1354
        write( str, string'(" - Descriptor RD ERR" ));
1355
        error := error + 1;
1356
    end if;
1357
    writeline( log, str );  -- upd LOGFILE
1358
    --
1359
    -- Deal with STATUS Results:
1360
    if( error=0 ) then  -- w8ing for DMA final
1361
        dma_complete := 0;
1362
        for ii in 0 to 100 loop -- 100 loop cycles of STATUS-process with 1us delay after
1363
            -- Read STATUS 
1364
            block_read( cmd, ret, 4, 16, data );
1365
            -- Construct LOG MSG in accordance to STATUS value and update "dma_complete"
1366
            write( str, string'(" STATUS: " )); hwrite( str, data( 15 downto 0 ) );
1367
            if( data(5)='1' ) then
1368
                write( str, string'(" - DMA finished" ));
1369
                dma_complete := 1;
1370
            end if;
1371
            writeline( log, str );
1372
            -- Check "dma_complete"
1373
            if( dma_complete=1 ) then
1374
                exit;           -- EXIT Loop on FINAL
1375
            else
1376
                wait for 1 us;  -- DELAY in other case
1377
            end if;
1378
        end loop;
1379
        writeline( log, str );  -- upd LOGFILE
1380
 
1381
        if( dma_complete=0 ) then   -- check "dma_complete" after all
1382
            write( str, string'("ERR - DMA not finished " ));
1383
            writeline( log, str );
1384
            error:=error+1;
1385
        end if;
1386
 
1387
    end if;
1388
    --
1389
    -- Print STATUS now
1390
    for ii in 0 to 3 loop   -- print STATUS value 4 times with 0.5us delay after
1391
        -- Read STATUS
1392
        block_read( cmd, ret, 4, 16, data );
1393
        -- Construct LOG MSG in accordance to STATUS value
1394
        write( str, string'(" STATUS: " )); hwrite( str, data( 15 downto 0 ) );
1395
        -- upd LOGFILE
1396
        writeline( log, str );
1397
        wait for 500 ns;
1398
    end loop;
1399
    --
1400
    -- Now STOP Design
1401
    block_write( cmd, ret, 4, 9, x"00000000" );     -- DMA_CTRL - STOP
1402
    --
1403
    -- Now print RX values:
1404
    --
1405
    -- Construct Header:
1406
    writeline( log, str );
1407
    write( str, string'("PRINT 1st 15 RX values: " ));
1408
    writeline( log, str );
1409
    -- Get first 15 DATA values and print it:
1410
    for ii in 0 to 15 loop
1411
        adr:= x"00800000";                      -- init ADDR value
1412
        adr:=adr + ii*4;                        -- upd addr to curr idx
1413
        int_mem_read( cmd, ret, adr,  data );   -- HOST MEM Read
1414
        -- Construct LOG MSG in accordance to HOST MEM Read value
1415
        --write( str, ii ); write( str, string'("   " )); hwrite( str, data );
1416
        hwrite( str, CONV_STD_LOGIC_VECTOR(ii, 8) );write( str, string'(" - " )); hwrite( str, data );
1417
        writeline( log, str );  -- upd LOGFILE
1418
    end loop;
1419
    writeline( log, str );      -- upd LOGFILE
1420
    --
1421
    -- Final CHECK errors:
1422
    if( error=0 ) then
1423
        write( str, string'("SUCCSESSFULL FINAL " ));
1424
        cnt_ok := cnt_ok + 1;
1425
    else
1426
        write( str, string'("FAILED FINAL " ));
1427
        cnt_error := cnt_error + 1;
1428
    end if;
1429
    writeline( log, str );  -- upd LOGFILE
1430
    writeline( log, str );  -- upd LOGFILE
1431
    --
1432
    -- END
1433
end test_num_1;
1434
--
1435
--
1436
--
1437
procedure test_num_2 (
1438
                            signal  cmd:    out bh_cmd; --! команда
1439
                            signal  ret:    in  bh_ret  --! ответ
1440
                        ) is
1441
 
1442
    variable    adr             : std_logic_vector( 31 downto 0 );
1443
    variable    data            : std_logic_vector( 31 downto 0 );
1444
    variable    data64          : std_logic_vector( 63 downto 0 );
1445
    variable    str             : line;
1446
 
1447
    variable    error           : integer:=0;
1448
    variable    dma_complete    : integer:=0;
1449
 
1450
begin
1451
    -- Init Header
1452
    write( str, string'("TEST#2: Get data from TEST_GEN.WB_BURST_SLAVE" ));
1453
    writeline( log, str );
1454
    --
1455
    ---- Формирование блока дескрипторов ---
1456
    for ii in 0 to 127 loop
1457
        adr:= x"00100000";
1458
        adr:=adr + ii*4;
1459
        int_mem_write( cmd, ret, adr,  x"00000000" );
1460
    end loop;
1461
    -- HOST MEM Writes:
1462
    int_mem_write( cmd, ret, x"00100000",  x"00008000" );   -- 
1463
    int_mem_write( cmd, ret, x"00100004",  x"00000100" );   -- 
1464
 
1465
    int_mem_write( cmd, ret, x"001001F8",  x"00000000" );   -- 
1466
    int_mem_write( cmd, ret, x"001001FC",  x"762C4953" );   -- 
1467
    --
1468
    -- TEST_GEN.WB_CFG_SLAVE: config TEST_GEN
1469
    adr     :=x"20002048";              --  TEST_GEN.WB_CFG_SLAVE.TEST_GEN_SIZE
1470
    data64  :=x"0000000000000001";      --  TEST_GEN_SIZE=x01
1471
    data_write64(cmd, ret, adr, data64);--  PCIE WR
1472
 
1473
    adr     :=x"20002040";              --  TEST_GEN.WB_CFG_SLAVE.TEST_GEN_CTRL
1474
    data64  :=x"0000000000000022";      --  TEST_GEN_CTRL=x22 (START=1, TEST_GEN.di_start=1)
1475
    data_write64(cmd, ret, adr, data64);--  PCIE WR
1476
 
1477
    -- PE_EXT_FIFO module config: --> have a bug in PE_EXT_FIFO, for check WB we will make a trick:
1478
    block_write( cmd, ret, 4, 8, x"00000027" );     -- DMA_MODE - DEMAND_MODE==ON 
1479
    block_write( cmd, ret, 4, 9, x"00000010" );     -- DMA_CTRL - RESET FIFO 
1480
 
1481
    block_write( cmd, ret, 4, 20, x"00100000" );    -- PCI_ADRL 
1482
    block_write( cmd, ret, 4, 21, x"00100000" );    -- PCI_ADRH  
1483
    block_write( cmd, ret, 4, 23, x"00003000" );    -- LOCAL_ADR: TEST_GEN.WB_BURST_SLAVE
1484
 
1485
    block_write( cmd, ret, 4, 9, x"00000001" );     -- DMA_CTRL - START
1486
    --
1487
    -- Delay for design: trick for afoid bug in PE_EXT_FIFO --> Ошибка #24
1488
    wait for 1 us;
1489
    block_write( cmd, ret, 4, 8, x"00000025" );     -- DMA_MODE - DEMAND_MODE==OFF 
1490
    --
1491
    -- Delay for design
1492
    wait for 20 us;
1493
    --
1494
    -- Read STATUS (check RD DESCR status):
1495
    block_read( cmd, ret, 4, 16, data );
1496
    -- Construct LOG MSG in accordance to STATUS value and update ERR counter
1497
    write( str, string'(" STATUS: " )); hwrite( str, data( 15 downto 0 ) );
1498
    if( data( 8 )='1' ) then
1499
        write( str, string'(" - Descriptor==OK" ));
1500
    else
1501
        write( str, string'(" - Descriptor RD ERR" ));
1502
        error := error + 1;
1503
    end if;
1504
    writeline( log, str );  -- upd LOGFILE
1505
    --
1506
    -- W8ing for DMA finish:
1507
    if( error=0 ) then  -- w8ing for DMA final
1508
        dma_complete := 0;
1509
        for ii in 0 to 100 loop -- 100 loop cycles of STATUS-process with 1us delay after
1510
            -- Read STATUS 
1511
            block_read( cmd, ret, 4, 16, data );
1512
            -- Construct LOG MSG in accordance to STATUS value and update "dma_complete"
1513
            write( str, string'(" STATUS: " )); hwrite( str, data( 15 downto 0 ) );
1514
            if( data(5)='1' ) then
1515
                write( str, string'(" - DMA finished" ));
1516
                dma_complete := 1;
1517
            end if;
1518
            writeline( log, str );
1519
            -- Check "dma_complete"
1520
            if( dma_complete=1 ) then
1521
                exit;           -- EXIT Loop on FINAL
1522
            else
1523
                wait for 1 us;  -- DELAY in other case
1524
            end if;
1525
        end loop;
1526
        writeline( log, str );  -- upd LOGFILE
1527
 
1528
        if( dma_complete=0 ) then   -- check "dma_complete" after all
1529
            write( str, string'("ERR - DMA not finished " ));
1530
            writeline( log, str );
1531
            error:=error+1;
1532
        end if;
1533
 
1534
    end if;
1535
    --
1536
    -- Print STATUS in ERR
1537
    if (error /= 0 ) then
1538
        for ii in 0 to 3 loop   -- print STATUS value 4 times with 0.5us delay after
1539
            -- Read STATUS
1540
            block_read( cmd, ret, 4, 16, data );
1541
            -- Construct LOG MSG in accordance to STATUS value
1542
            write( str, string'(" STATUS: " )); hwrite( str, data( 15 downto 0 ) );
1543
            -- upd LOGFILE
1544
            writeline( log, str );
1545
            wait for 500 ns;
1546
        end loop;
1547
    end if;
1548
    --
1549
    -- Now STOP Design
1550
    block_write( cmd, ret, 4, 9, x"00000000" );     -- DMA_CTRL - STOP
1551
    --
1552
    -- Now print RX values:
1553
    --
1554
    -- Construct Header:
1555
    writeline( log, str );
1556
    write( str, string'("PRINT 1st 15 RX values: " ));
1557
    writeline( log, str );
1558
    -- Get first 15 DATA values and print it:
1559
    for ii in 0 to 15 loop
1560
        adr:= x"00800000";                      -- init ADDR value
1561
        adr:=adr + ii*4;                        -- upd addr to curr idx
1562
        int_mem_read( cmd, ret, adr,  data );   -- HOST MEM Read
1563
        -- Construct LOG MSG in accordance to HOST MEM Read value
1564
        --write( str, ii ); write( str, string'("   " )); hwrite( str, data );
1565
        hwrite( str, CONV_STD_LOGIC_VECTOR(ii, 8) );write( str, string'(" - " )); hwrite( str, data );
1566
        writeline( log, str );  -- upd LOGFILE
1567
    end loop;
1568
    writeline( log, str );      -- upd LOGFILE
1569
    --
1570
    -- Final CHECK errors:
1571
    if( error=0 ) then
1572
        write( str, string'(" stb SUCCSESSFULL FINAL " ));
1573
        cnt_ok := cnt_ok + 1;
1574
    else
1575
        write( str, string'(" stb FAILED FINAL " ));
1576
        cnt_error := cnt_error + 1;
1577
    end if;
1578
    writeline( log, str );  -- upd LOGFILE
1579
    writeline( log, str );  -- upd LOGFILE
1580
    --
1581
    -- END
1582
end test_num_2;
1583
---------------------------------------------------------------------------------------------------
1584
--
1585
-- My procedure for test WB stuff in Design:
1586
--  ==> TEST_CHECK.WB_CFG_SLAVE
1587
--
1588
procedure test_wb_1 (
1589
                            signal  cmd:    out bh_cmd; --! команда
1590
                            signal  ret:    in  bh_ret  --! ответ
1591
                    ) is
1592
 
1593
    variable    adr             : std_logic_vector( 31 downto 0 );
1594
    variable    data32          : std_logic_vector( 31 downto 0 );
1595
    variable    data64          : std_logic_vector( 63 downto 0 );
1596
    variable    str             : line;
1597
 
1598
    variable    error           : integer:=0;
1599
    variable    dma_complete    : integer:=0;
1600
 
1601
    --
1602
    -- 
1603
    type wb_cfg_slave_value is array (natural range<>) of std_logic_vector( 63 downto 0 );
1604
    type wb_cfg_slave_data is record
1605
        const   :   wb_cfg_slave_value(7 downto 0);
1606
        cmd     :   wb_cfg_slave_value(7 downto 0);
1607
        sts     :   wb_cfg_slave_value(7 downto 0);
1608
    end record;
1609
    --
1610
    -- 
1611
    variable    st_wb_cfg_slave_data_0  :   wb_cfg_slave_data;
1612
    variable    st_wb_cfg_slave_data_1  :   wb_cfg_slave_data;
1613
    variable    st_wb_cfg_slave_data_2  :   wb_cfg_slave_data;
1614
 
1615
 
1616
begin
1617
    -- Init Header
1618
    write( str, string'("START TEST_WB#1: TEST_CHECK.WB_CFG_SLAVE"));
1619
    writeline( log, str );
1620
    --
1621
    -- Read "TEST_CHECK.WB_CFG_SLAVE" 
1622
    write( str, string'("1) Read 'TEST_CHECK.WB_CFG_SLAVE'"));
1623
    writeline( log, str );
1624
    adr     := x"20000000";
1625
 
1626
    TEST_CHECK_WB_CFG_SLAVE_RD_00   :   for i in 0 to 2 loop
1627
        TEST_CHECK_WB_CFG_SLAVE_RD_01   :   for j in 0 to 7 loop
1628
            -- PCIE RD
1629
            data_read64(cmd, ret, adr, data64);
1630
            -- Put RD_Value to apropriate holder
1631
            if (i=0) then       -- const
1632
                st_wb_cfg_slave_data_0.const(j) := data64;
1633
            elsif (i=1) then    -- cmd
1634
                st_wb_cfg_slave_data_0.cmd(j)   := data64;
1635
            else                -- sts
1636
                st_wb_cfg_slave_data_0.sts(j)   := data64;
1637
            end if;
1638
            -- Incr ADDR
1639
            adr := adr + x"00000008";
1640
            -- Print RD_Value
1641
            hwrite( str, data64); write( str, string'(" ==> ADDR=")); hwrite( str, (adr - x"00000008"));
1642
            writeline( log, str );
1643
 
1644
        end loop TEST_CHECK_WB_CFG_SLAVE_RD_01;
1645
    end loop TEST_CHECK_WB_CFG_SLAVE_RD_00;
1646
 
1647
    --
1648
    -- Write
1649
    write( str, string'("2) Write 'TEST_CHECK.WB_CFG_SLAVE'"));
1650
    writeline( log, str );
1651
    adr     := x"20000000";
1652
 
1653
    TEST_CHECK_WB_CFG_SLAVE_WR_00   :   for i in 0 to 2 loop
1654
        TEST_CHECK_WB_CFG_SLAVE_WR_01   :   for j in 0 to 7 loop
1655
            -- Prepare WR_Value
1656
            data64 := conv_std_logic_vector(i*100+j*10+5, 64);
1657
            -- PCIE WR
1658
            data_write64(cmd, ret, adr, data64);
1659
            -- Put WR_Value to apropriate holder
1660
            if (i=0) then       -- const
1661
                st_wb_cfg_slave_data_1.const(j) := data64;
1662
            elsif (i=1) then    -- cmd
1663
                st_wb_cfg_slave_data_1.cmd(j)   := data64;
1664
            else                -- sts
1665
                st_wb_cfg_slave_data_1.sts(j)   := data64;
1666
            end if;
1667
            -- Incr ADDR
1668
            adr := adr + x"00000008";
1669
            -- Print WR_Value
1670
            hwrite( str, data64); write( str, string'(" ==> ADDR=")); hwrite( str, (adr - x"00000008"));
1671
            writeline( log, str );
1672
 
1673
        end loop TEST_CHECK_WB_CFG_SLAVE_WR_01;
1674
    end loop TEST_CHECK_WB_CFG_SLAVE_WR_00;
1675
 
1676
    --
1677
    -- Read
1678
    write( str, string'("3) Read 'TEST_CHECK.WB_CFG_SLAVE'"));
1679
    writeline( log, str );
1680
    adr     := x"20000000";
1681
 
1682
    TEST_CHECK_WB_CFG_SLAVE_RD_10   :   for i in 0 to 2 loop
1683
        TEST_CHECK_WB_CFG_SLAVE_RD_11   :   for j in 0 to 7 loop
1684
            -- PCIE RD
1685
            data_read64(cmd, ret, adr, data64);
1686
            -- Put RD_Value to apropriate holder
1687
            if (i=0) then       -- const
1688
                st_wb_cfg_slave_data_2.const(j) := data64;
1689
            elsif (i=1) then    -- cmd
1690
                st_wb_cfg_slave_data_2.cmd(j)   := data64;
1691
            else                -- sts
1692
                st_wb_cfg_slave_data_2.sts(j)   := data64;
1693
            end if;
1694
            -- Incr ADDR
1695
            adr := adr + x"00000008";
1696
            -- Print RD_Value
1697
            hwrite( str, data64); write( str, string'(" ==> ADDR=")); hwrite( str, (adr - x"00000008"));
1698
            writeline( log, str );
1699
 
1700
        end loop TEST_CHECK_WB_CFG_SLAVE_RD_11;
1701
    end loop TEST_CHECK_WB_CFG_SLAVE_RD_10;
1702
 
1703
    --
1704
    -- Compare results
1705
    write( str, string'("4) Process Results:"));
1706
    writeline( log, str );
1707
    --  cmp#0 - constants
1708
    CMP_CONST   :   for i in 0 to 7 loop
1709
        if (st_wb_cfg_slave_data_0.const(i) /= st_wb_cfg_slave_data_2.const(i) ) then   -- before WR and afetr WR must be EQU (RO)
1710
            write( str, string'("   ==> CONST ERR, idx = ")); hwrite( str, CONV_STD_LOGIC_VECTOR(i, 8));
1711
            writeline( log, str );
1712
            error := error + 1;
1713
        end if;
1714
    end loop CMP_CONST;
1715
    --  cmp#1 - commands
1716
    CMP_CMD     :   for i in 0 to 7 loop
1717
        if  ( st_wb_cfg_slave_data_1.cmd(i) /= st_wb_cfg_slave_data_2.cmd(i) ) then     -- WR value and RD value must be EQU (RW)
1718
            write( str, string'("   ==> CMD ERR, idx = ")); hwrite( str, CONV_STD_LOGIC_VECTOR(i, 8));
1719
            writeline( log, str );
1720
            error := error + 1;
1721
        end if;
1722
    end loop CMP_CMD;
1723
    --  cmp#2 - status
1724
    CMP_STATUS  :   for i in 0 to 7 loop
1725
        if (st_wb_cfg_slave_data_0.sts(i) /= st_wb_cfg_slave_data_2.sts(i) ) then       -- before WR and afetr WR must be EQU (RO)
1726
            write( str, string'("   ==> STATUS ERR, idx = ")); hwrite( str, CONV_STD_LOGIC_VECTOR(i, 8));
1727
            writeline( log, str );
1728
            error := error + 1;
1729
        end if;
1730
    end loop CMP_STATUS;
1731
    --  print OK
1732
    if (error = 0) then
1733
        write( str, string'("   Results==OK"));
1734
        writeline( log, str );
1735
        cnt_ok := cnt_ok + 1;
1736
    else
1737
        cnt_error := cnt_error + 1;
1738
    end if;
1739
 
1740
    -- Final Header
1741
    write( str, string'("STOP TEST_WB#1: TEST_CHECK.WB_CFG_SLAVE" ));
1742
    writeline( log, str );  -- upd LOGFILE
1743
    --
1744
    -- END
1745
end test_wb_1;
1746
---------------------------------------------------------------------------------------------------
1747
--
1748
-- My procedure for test WB stuff in Design:
1749
--  ==> TEST_GEN.WB_CFG_SLAVE
1750
--
1751
procedure test_wb_2 (
1752
                            signal  cmd:    out bh_cmd; --! команда
1753
                            signal  ret:    in  bh_ret  --! ответ
1754
                    ) is
1755
 
1756
    variable    adr             : std_logic_vector( 31 downto 0 );
1757
    variable    data32          : std_logic_vector( 31 downto 0 );
1758
    variable    data64          : std_logic_vector( 63 downto 0 );
1759
    variable    str             : line;
1760
 
1761
    variable    error           : integer:=0;
1762
    variable    dma_complete    : integer:=0;
1763
 
1764
    --
1765
    -- 
1766
    type wb_cfg_slave_value is array (natural range<>) of std_logic_vector( 63 downto 0 );
1767
    type wb_cfg_slave_data is record
1768
        const   :   wb_cfg_slave_value(7 downto 0);
1769
        cmd     :   wb_cfg_slave_value(7 downto 0);
1770
        sts     :   wb_cfg_slave_value(7 downto 0);
1771
    end record;
1772
    --
1773
    -- 
1774
    variable    st_wb_cfg_slave_data_0  :   wb_cfg_slave_data;
1775
    variable    st_wb_cfg_slave_data_1  :   wb_cfg_slave_data;
1776
    variable    st_wb_cfg_slave_data_2  :   wb_cfg_slave_data;
1777
 
1778
 
1779
begin
1780
    -- Init Header
1781
    write( str, string'("START TEST_WB#2: TEST_GEN.WB_CFG_SLAVE"));
1782
    writeline( log, str );
1783
    --
1784
    -- Read "TEST_CHECK.WB_CFG_SLAVE" 
1785
    write( str, string'("1) Read 'TEST_GEN.WB_CFG_SLAVE'"));
1786
    writeline( log, str );
1787
    adr     := x"20002000";
1788
 
1789
    TEST_CHECK_WB_CFG_SLAVE_RD_00   :   for i in 0 to 2 loop
1790
        TEST_CHECK_WB_CFG_SLAVE_RD_01   :   for j in 0 to 7 loop
1791
            -- PCIE RD
1792
            data_read64(cmd, ret, adr, data64);
1793
            -- Put RD_Value to apropriate holder
1794
            if (i=0) then       -- const
1795
                st_wb_cfg_slave_data_0.const(j) := data64;
1796
            elsif (i=1) then    -- cmd
1797
                st_wb_cfg_slave_data_0.cmd(j)   := data64;
1798
            else                -- sts
1799
                st_wb_cfg_slave_data_0.sts(j)   := data64;
1800
            end if;
1801
            -- Incr ADDR
1802
            adr := adr + x"00000008";
1803
            -- Print RD_Value
1804
            hwrite( str, data64); write( str, string'(" ==> ADDR=")); hwrite( str, (adr - x"00000008"));
1805
            writeline( log, str );
1806
 
1807
        end loop TEST_CHECK_WB_CFG_SLAVE_RD_01;
1808
    end loop TEST_CHECK_WB_CFG_SLAVE_RD_00;
1809
 
1810
    --
1811
    -- Write
1812
    write( str, string'("2) Write 'TEST_GEN.WB_CFG_SLAVE'"));
1813
    writeline( log, str );
1814
    adr     := x"20002000";
1815
 
1816
    TEST_GEN_WB_CFG_SLAVE_WR_00   :   for i in 0 to 2 loop
1817
        TEST_GEN_WB_CFG_SLAVE_WR_01   :   for j in 0 to 7 loop
1818
            -- Prepare WR_Value
1819
            data64 := conv_std_logic_vector(i*100+j*10+5, 64);
1820
            -- PCIE WR
1821
            data_write64(cmd, ret, adr, data64);
1822
            -- Put WR_Value to apropriate holder
1823
            if (i=0) then       -- const
1824
                st_wb_cfg_slave_data_1.const(j) := data64;
1825
            elsif (i=1) then    -- cmd
1826
                st_wb_cfg_slave_data_1.cmd(j)   := data64;
1827
            else                -- sts
1828
                st_wb_cfg_slave_data_1.sts(j)   := data64;
1829
            end if;
1830
            -- Incr ADDR
1831
            adr := adr + x"00000008";
1832
            -- Print WR_Value
1833
            hwrite( str, data64); write( str, string'(" ==> ADDR=")); hwrite( str, (adr - x"00000008"));
1834
            writeline( log, str );
1835
 
1836
        end loop TEST_GEN_WB_CFG_SLAVE_WR_01;
1837
    end loop TEST_GEN_WB_CFG_SLAVE_WR_00;
1838
 
1839
    --
1840
    -- Read
1841
    write( str, string'("3) Read 'TEST_GEN.WB_CFG_SLAVE'"));
1842
    writeline( log, str );
1843
    adr     := x"20002000";
1844
 
1845
    TEST_GEN_WB_CFG_SLAVE_RD_10   :   for i in 0 to 2 loop
1846
        TEST_GEN_WB_CFG_SLAVE_RD_11   :   for j in 0 to 7 loop
1847
            -- PCIE RD
1848
            data_read64(cmd, ret, adr, data64);
1849
            -- Put RD_Value to apropriate holder
1850
            if (i=0) then       -- const
1851
                st_wb_cfg_slave_data_2.const(j) := data64;
1852
            elsif (i=1) then    -- cmd
1853
                st_wb_cfg_slave_data_2.cmd(j)   := data64;
1854
            else                -- sts
1855
                st_wb_cfg_slave_data_2.sts(j)   := data64;
1856
            end if;
1857
            -- Incr ADDR
1858
            adr := adr + x"00000008";
1859
            -- Print RD_Value
1860
            hwrite( str, data64); write( str, string'(" ==> ADDR=")); hwrite( str, (adr - x"00000008"));
1861
            writeline( log, str );
1862
 
1863
        end loop TEST_GEN_WB_CFG_SLAVE_RD_11;
1864
    end loop TEST_GEN_WB_CFG_SLAVE_RD_10;
1865
 
1866
    --
1867
    -- Compare results
1868
    write( str, string'("4) Process Results:"));
1869
    writeline( log, str );
1870
    --  cmp#0 - constants
1871
    CMP_CONST   :   for i in 0 to 7 loop
1872
        if (st_wb_cfg_slave_data_0.const(i) /= st_wb_cfg_slave_data_2.const(i) ) then   -- before WR and afetr WR must be EQU (RO)
1873
            write( str, string'("   ==> CONST ERR, idx = ")); hwrite( str, CONV_STD_LOGIC_VECTOR(i, 8));
1874
            writeline( log, str );
1875
            error := error + 1;
1876
        end if;
1877
    end loop CMP_CONST;
1878
    --  cmp#1 - commands
1879
    CMP_CMD     :   for i in 0 to 7 loop
1880
        if  ( st_wb_cfg_slave_data_1.cmd(i) /= st_wb_cfg_slave_data_2.cmd(i) ) then     -- WR value and RD value must be EQU (RW)
1881
            write( str, string'("   ==> CMD ERR, idx = ")); hwrite( str, CONV_STD_LOGIC_VECTOR(i, 8));
1882
            writeline( log, str );
1883
            error := error + 1;
1884
        end if;
1885
    end loop CMP_CMD;
1886
    --  cmp#2 - status
1887
    CMP_STATUS  :   for i in 0 to 7 loop
1888
        if (st_wb_cfg_slave_data_0.sts(i) /= st_wb_cfg_slave_data_2.sts(i) ) then       -- before WR and afetr WR must be EQU (RO)
1889
            write( str, string'("   ==> STATUS ERR, idx = ")); hwrite( str, CONV_STD_LOGIC_VECTOR(i, 8));
1890
            writeline( log, str );
1891
            error := error + 1;
1892
        end if;
1893
    end loop CMP_STATUS;
1894
    --  print OK
1895
    if (error = 0) then
1896
        write( str, string'("   Results==OK"));
1897
        writeline( log, str );
1898
        cnt_ok := cnt_ok + 1;
1899
    else
1900
        cnt_error := cnt_error + 1;
1901
    end if;
1902
 
1903
    -- Final Header
1904
    write( str, string'("STOP TEST_WB#2: TEST_GEN.WB_CFG_SLAVE" ));
1905
    writeline( log, str );  -- upd LOGFILE
1906
    --
1907
    -- END
1908
end test_wb_2;
1909
---------------------------------------------------------------------------------------------------
1910
end package     body test_pkg;

powered by: WebSVN 2.1.0

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