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

Subversion Repositories pcie_ds_dma

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

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

Line No. Rev Author Line
1 47 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
 
16
library ieee;
17
use ieee.std_logic_1164.all;
18
use ieee.std_logic_arith.all;
19
use ieee.std_logic_unsigned.all;
20
use ieee.std_logic_textio.all;
21
use std.textio.all;
22
 
23
 
24
library work;
25
use work.cmd_sim_pkg.all;
26
use work.block_pkg.all;
27
use work.trd_pkg.all;
28
 
29
 
30
 
31
package test_pkg is
32
 
33
--! Инициализация теста 
34
procedure test_init(
35
                fname: in string        --! имя файла отчёта
36
        );
37
 
38
--! Завершение теста            
39
procedure test_close;
40
 
41
 
42
 
43
--! Запуск DMA с неправильным дескриптором 
44
procedure test_dsc_incorrect (
45
                signal  cmd:    out bh_cmd; --! команда
46
                signal  ret:    in  bh_ret  --! ответ
47
                );
48
 
49
--! Запуск DMA на приём одного блока 4 кБ
50
procedure test_read_4kb (
51
                signal  cmd:    out bh_cmd; --! команда
52
                signal  ret:    in  bh_ret  --! ответ
53
                );
54
 
55
 
56
--! Чтение 8 кБ из тетрады DIO_IN 
57
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
end package     test_pkg;
81
 
82
package body test_pkg is
83
 
84
        FILE   log: text;
85
 
86
        shared variable cnt_ok, cnt_error: integer;
87
 
88
        -- Инициализация теста  
89
        procedure test_init(
90
                fname: in string                                        -- имя файла отчёта
91
                ) is
92
        begin
93
 
94
                file_open( log, fname, WRITE_MODE );
95
                cnt_ok:=0;
96
                cnt_error:=0;
97
 
98
        end test_init;
99
 
100
        -- Завершение теста             
101
        procedure test_close is
102
                variable str : LINE;            -- pointer to string
103
        begin
104
 
105
                std.textio.write( str, string'(" " ));
106
                writeline( log, str );
107
                writeline( log, str );
108
 
109
                write( str, string'("Проверка завершена" ));
110
                writeline( log, str );
111
                write( str, string'("Число успешных тестов:  " ));
112
                write( str, cnt_ok );
113
                writeline( log, str );
114
                write( str, string'("Число ошибочных тестов: " ));
115
                write( str, cnt_error );
116
                writeline( log, str );
117
 
118
 
119
                file_close( log );
120
 
121
        end test_close;
122
 
123
 
124
 
125
--! Запуск DMA с неправильным дескриптором 
126
procedure test_dsc_incorrect (
127
                signal  cmd:    out bh_cmd; --! команда
128
                signal  ret:    in  bh_ret  --! ответ
129
                )
130
is
131
 
132
variable        adr             : std_logic_vector( 31 downto 0 );
133
variable        data    : std_logic_vector( 31 downto 0 );
134 50 dsmv
variable        str             : line;
135
variable        error   : integer:=0;
136 47 dsmv
begin
137
 
138
        write( str, string'("TEST_DSC_INCORRECT" ));
139
        writeline( log, str );
140
 
141
        ---- Формирование блока дескрипторов ---
142
        for ii in 0 to 127 loop
143
                adr:= x"00100000";
144
                adr:=adr + ii*4;
145
                int_mem_write( cmd, ret, adr,  x"00000000" );
146
        end loop;
147
 
148
        int_mem_write( cmd, ret, x"00100000",  x"03020100" );
149
        int_mem_write( cmd, ret, x"001001FC",  x"FF00AA00" );
150
 
151
        ---- Программирование канала DMA ----
152
        block_write( cmd, ret, 4, 8, x"00000027" );             -- DMA_MODE 
153
        block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
154
 
155
        block_write( cmd, ret, 4, 20, x"00100000" );    -- PCI_ADRL 
156
        block_write( cmd, ret, 4, 21, x"00100000" );    -- PCI_ADRH  
157
        block_write( cmd, ret, 4, 23, x"0000A400" );    -- LOCAL_ADR 
158
 
159
        block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START 
160
 
161
        wait for 10 us;
162
 
163
        block_read( cmd, ret, 4, 16, data );                    -- STATUS 
164
 
165
        write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
166
        if( data( 15 downto 0 )=x"A021" ) then
167
                write( str, string'(" - Ok" ));
168
        else
169
                write( str, string'(" - Error" ));
170 50 dsmv
                error:=error+1;
171 47 dsmv
        end if;
172
 
173
        writeline( log, str );
174
 
175
        block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL - STOP  
176 50 dsmv
 
177
        -- вывод в файл --
178
        writeline( log, str );
179
        if( error=0 ) then
180
                write( str, string'("TEST finished successfully" ));
181
                cnt_ok := cnt_ok + 1;
182
        else
183
                write( str, string'("TEST finished with ERR" ));
184
                cnt_error := cnt_error + 1;
185
        end if;
186
        writeline( log, str );
187
        writeline( log, str );
188
 
189
        -- вывод в консоль --
190
        writeline( output, str );
191
        if( error=0 ) then
192
                write( str, string'("TEST finished successfully" ));
193
                cnt_ok := cnt_ok + 1;
194
        else
195
                write( str, string'("TEST finished with ERR" ));
196
                cnt_error := cnt_error + 1;
197
        end if;
198
        writeline( output, str );
199
        writeline( output, str );
200
 
201
 
202 47 dsmv
 
203
end test_dsc_incorrect;
204
 
205
 
206
--! Запуск DMA приём одного блока 4 кБ
207
procedure test_read_4kb (
208
                signal  cmd:    out bh_cmd; --! команда
209
                signal  ret:    in  bh_ret  --! ответ
210
                )
211
is
212
 
213
variable        adr                             : std_logic_vector( 31 downto 0 );
214
variable        data                    : std_logic_vector( 31 downto 0 );
215
variable        str                             : line;
216
 
217
variable        error                   : integer:=0;
218
variable        dma_complete    : integer;
219
 
220
begin
221
 
222
        write( str, string'("TEST_READ_4KB" ));
223
        writeline( log, str );
224
 
225
        ---- Формирование блока дескрипторов ---
226
        for ii in 0 to 127 loop
227
                adr:= x"00100000";
228
                adr:=adr + ii*4;
229
                int_mem_write( cmd, ret, adr,  x"00000000" );
230
        end loop;
231
 
232
        int_mem_write( cmd, ret, x"00100000",  x"00008000" );
233
        int_mem_write( cmd, ret, x"00100004",  x"00000100" );
234
 
235
 
236
        int_mem_write( cmd, ret, x"001001F8",  x"00000000" );
237
        int_mem_write( cmd, ret, x"001001FC",  x"762C4953" );
238
 
239
        ---- Программирование канала DMA ----
240
        block_write( cmd, ret, 4, 8, x"00000025" );             -- DMA_MODE 
241
        block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
242
 
243
        block_write( cmd, ret, 4, 20, x"00100000" );    -- PCI_ADRL 
244
        block_write( cmd, ret, 4, 21, x"00100000" );    -- PCI_ADRH  
245
        block_write( cmd, ret, 4, 23, x"0000A400" );    -- LOCAL_ADR 
246
 
247
        block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START 
248
 
249
        wait for 20 us;
250
 
251
        block_read( cmd, ret, 4, 16, data );                    -- STATUS 
252
 
253
        write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
254
        if( data( 8 )='1' ) then
255
                write( str, string'(" - Дескриптор правильный" ));
256
        else
257
                write( str, string'(" - Ошибка чтения дескриптора" ));
258
                error := error + 1;
259
        end if;
260
 
261
        writeline( log, str );
262
 
263
        if( error=0 ) then
264
 
265
                ---- Ожидание завершения DMA ----
266
                dma_complete := 0;
267
                for ii in 0 to 100 loop
268
 
269
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
270
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
271
                        if( data(5)='1' ) then
272
                                write( str, string'(" - DMA завершён " ));
273
                                dma_complete := 1;
274
                        end if;
275
                        writeline( log, str );
276
 
277
                        if( dma_complete=1 ) then
278
                                exit;
279
                        end if;
280
 
281
                        wait for 1 us;
282
 
283
                end loop;
284
 
285
                writeline( log, str );
286
 
287
                if( dma_complete=0 ) then
288
                        write( str, string'("Ошибка - DMA не завершён " ));
289
                        writeline( log, str );
290
                        error:=error+1;
291
                end if;
292
 
293
        end if;
294
 
295
        for ii in 0 to 3 loop
296
 
297
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
298
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
299
                writeline( log, str );
300
                wait for 500 ns;
301
 
302
        end loop;
303
 
304
 
305
        block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL - STOP      
306
 
307
        write( str, string'(" Прочитано: " ));
308
        writeline( log, str );
309
 
310
        for ii in 0 to 15 loop
311
 
312
                adr:= x"00800000";
313
                adr:=adr + ii*4;
314
                int_mem_read( cmd, ret, adr,  data );
315
 
316
                write( str, ii ); write( str, string'("   " )); hwrite( str, data );
317
                writeline( log, str );
318
 
319
        end loop;
320
 
321
 
322
--      block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
323
--      block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL 
324
--      block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START     
325
 
326
 
327 50 dsmv
        -- вывод в файл --
328 47 dsmv
        writeline( log, str );
329
        if( error=0 ) then
330 50 dsmv
                write( str, string'("TEST finished successfully" ));
331 47 dsmv
                cnt_ok := cnt_ok + 1;
332
        else
333 50 dsmv
                write( str, string'("TEST finished with ERR" ));
334 47 dsmv
                cnt_error := cnt_error + 1;
335
        end if;
336
        writeline( log, str );
337
        writeline( log, str );
338
 
339 50 dsmv
        -- вывод в консоль --
340
        writeline( output, str );
341
        if( error=0 ) then
342
                write( str, string'("TEST finished successfully" ));
343
                cnt_ok := cnt_ok + 1;
344
        else
345
                write( str, string'("TEST finished with ERR" ));
346
                cnt_error := cnt_error + 1;
347
        end if;
348
        writeline( output, str );
349
        writeline( output, str );
350
 
351
 
352
 
353 47 dsmv
end test_read_4kb;
354
 
355
 
356
--! Чтение 8 кБ из тетрады DIO_IN 
357
procedure test_adm_read_8kb (
358
                signal  cmd:    out bh_cmd; --! команда
359
                signal  ret:    in  bh_ret  --! ответ
360
                )
361
is
362
 
363
variable        adr                             : std_logic_vector( 31 downto 0 );
364
variable        data                    : std_logic_vector( 31 downto 0 );
365
variable        str                             : line;
366
 
367
variable        error                   : integer:=0;
368
variable        dma_complete    : integer;
369
 
370
begin
371
 
372
        write( str, string'("TEST_ADM_READ_8KB" ));
373
        writeline( log, str );
374
 
375
        ---- Формирование блока дескрипторов ---
376
        for ii in 0 to 127 loop
377
                adr:= x"00100000";
378
                adr:=adr + ii*4;
379
                int_mem_write( cmd, ret, adr,  x"00000000" );
380
        end loop;
381
 
382
        --- Дескриптор 0 ---
383
        int_mem_write( cmd, ret, x"00100000",  x"00008000" );
384
        int_mem_write( cmd, ret, x"00100004",  x"00000111" );   -- переход к следующему 
385
 
386
        --- Дескриптор 1 ---
387
        int_mem_write( cmd, ret, x"00100008",  x"00008010" );
388
        int_mem_write( cmd, ret, x"0010000C",  x"00000110" );   -- остановка
389
 
390
 
391
        int_mem_write( cmd, ret, x"001001F8",  x"00000000" );
392
        int_mem_write( cmd, ret, x"001001FC",  x"D6644953" );
393
 
394
        trd_test_mode( cmd, ret, 0 );    -- переход в рабочий режим --
395
 
396
        ---- Программирование канала DMA ----
397
        block_write( cmd, ret, 4, 8, x"00000027" );             -- DMA_MODE 
398
        block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
399
 
400
        block_write( cmd, ret, 4, 20, x"00100000" );    -- PCI_ADRL 
401
        block_write( cmd, ret, 4, 21, x"00100000" );    -- PCI_ADRH  
402
        block_write( cmd, ret, 4, 23, x"00019000" );    -- LOCAL_ADR 
403
 
404
 
405
        ---- Подготовка тетрады ----
406
        trd_test_mode( cmd, ret, 0 );    -- переход в рабочий режим --
407
        trd_wait_cmd( cmd, ret, 0, 16, x"1600" );                -- DMAR0 - от тетрады 6 --
408
 
409
        trd_wait_cmd( cmd, ret, 1, 16#1F#, x"0001" );   -- Размер блока = 4 кБ --
410
 
411
        block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START 
412
 
413
        trd_wait_cmd( cmd, ret, 1, 16#0F#, x"0001" );   -- Подключение выхода генератора к DIO_IN --
414
 
415
        trd_wait_cmd( cmd, ret, 6,      0, x"2038" );            -- запуск тетрады DIO_IN
416
 
417
        trd_wait_cmd( cmd, ret, 1, 16#1E#, x"0020" );   -- Запуск тестовой последовательности --
418
 
419
        wait for 20 us;
420
 
421
        block_read( cmd, ret, 4, 16, data );                    -- STATUS 
422
 
423
        write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
424
        if( data( 8 )='1' ) then
425
                write( str, string'(" - Дескриптор правильный" ));
426
        else
427
                write( str, string'(" - Ошибка чтения дескриптора" ));
428
                error := error + 1;
429
        end if;
430
 
431
        writeline( log, str );
432
 
433
        if( error=0 ) then
434
 
435
                ---- Ожидание завершения DMA ----
436
                dma_complete := 0;
437
                for ii in 0 to 100 loop
438
 
439
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
440
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
441
                        if( data(5)='1' ) then
442
                                write( str, string'(" - DMA завершён " ));
443
                                dma_complete := 1;
444
 
445
                                block_write( cmd, ret, 4, 16#11#, x"00000010" );                -- FLAG_CLR - сброс EOT 
446
 
447
                        end if;
448
                        writeline( log, str );
449
 
450
                        if( dma_complete=1 ) then
451
                                exit;
452
                        end if;
453
 
454
                        wait for 1 us;
455
 
456
                end loop;
457
 
458
                writeline( log, str );
459
 
460
                if( dma_complete=0 ) then
461
                        write( str, string'("Ошибка - DMA не завершён " ));
462
                        writeline( log, str );
463
                        error:=error+1;
464
                end if;
465
 
466
        end if;
467
 
468
        for ii in 0 to 3 loop
469
 
470
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
471
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
472
                writeline( log, str );
473
                wait for 500 ns;
474
 
475
        end loop;
476
 
477
 
478
        block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL - STOP      
479
 
480
        write( str, string'(" Блок 0 - прочитано: " ));
481
        writeline( log, str );
482
 
483
        for ii in 0 to 15 loop
484
 
485
                adr:= x"00800000";
486
                adr:=adr + ii*4;
487
                int_mem_read( cmd, ret, adr,  data );
488
 
489
                write( str, ii ); write( str, string'("   " )); hwrite( str, data );
490
                writeline( log, str );
491
 
492
        end loop;
493
 
494
        writeline( log, str );
495
 
496
        write( str, string'(" Блок 1 - прочитано: " ));
497
        writeline( log, str );
498
 
499
        for ii in 0 to 15 loop
500
 
501
                adr:= x"00801000";
502
                adr:=adr + ii*4;
503
                int_mem_read( cmd, ret, adr,  data );
504
 
505
                write( str, ii ); write( str, string'("   " )); hwrite( str, data );
506
                writeline( log, str );
507
 
508
        end loop;
509
 
510
 
511
--      block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
512
--      block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL 
513
--      block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START     
514
 
515
 
516 50 dsmv
        -- вывод в файл --
517 47 dsmv
        writeline( log, str );
518
        if( error=0 ) then
519 50 dsmv
                write( str, string'("TEST finished successfully" ));
520 47 dsmv
                cnt_ok := cnt_ok + 1;
521
        else
522 50 dsmv
                write( str, string'("TEST finished with ERR" ));
523 47 dsmv
                cnt_error := cnt_error + 1;
524
        end if;
525
        writeline( log, str );
526
        writeline( log, str );
527
 
528 50 dsmv
        -- вывод в консоль --
529
        writeline( output, str );
530
        if( error=0 ) then
531
                write( str, string'("TEST finished successfully" ));
532
                cnt_ok := cnt_ok + 1;
533
        else
534
                write( str, string'("TEST finished with ERR" ));
535
                cnt_error := cnt_error + 1;
536
        end if;
537
        writeline( output, str );
538
        writeline( output, str );
539
 
540
 
541 47 dsmv
end test_adm_read_8kb;
542
 
543
 
544
--! Проверка обращений к блоку MAIN 
545
procedure test_block_main (
546
                signal  cmd:    out bh_cmd; --! команда
547
                signal  ret:    in  bh_ret  --! ответ
548
                )
549
is
550
 
551
variable        adr                             : std_logic_vector( 31 downto 0 );
552
variable        data                    : std_logic_vector( 31 downto 0 );
553
variable        str                             : line;
554
 
555
variable        error                   : integer:=0;
556
variable        dma_complete    : integer;
557
 
558
begin
559
 
560
        write( str, string'("TEST_BLOCK_MAIN" ));
561
        writeline( log, str );
562
 
563 49 dsmv
        block_write( cmd, ret, 4, 16#08#, x"0000AA55" );
564
        block_read( cmd, ret, 4, 16#08#, data );
565 47 dsmv
        write( str,  string'("БЛОК 4: " )); hwrite( str, data ); writeline( log, str );
566
 
567
        wait for 10 us;
568
 
569 50 dsmv
        write( str, "Константы:" );
570
        writeline( log, str );
571
        for ii in 0 to 5 loop
572
                write( str, "Блок " );
573
                write( str, ii );
574
                for jj in 0 to 7 loop
575
                        block_read( cmd, ret, ii, jj, data );
576
                        write( str, "   " );
577
                        hwrite( str, data );
578
                end loop;
579
                writeline( log, str );
580
        end loop;
581
 
582
 
583
        writeline( log, str );
584
 
585
        block_read( cmd, ret, 0, 16#10#, data );
586
        write( str,  "STATUS: " ); hwrite( str, data ); writeline( log, str );
587
 
588
        block_write( cmd, ret, 80, 16#08#, x"00000100" );
589
 
590
        block_read( cmd, ret, 0, 16#10#, data );
591
        write( str, "STATUS: " ); hwrite( str, data ); writeline( log, str );
592
 
593
        block_write( cmd, ret, 80, 16#08#, x"00000200" );
594
 
595
        block_read( cmd, ret, 0, 16#10#, data );
596
        write( str, "STATUS: " ); hwrite( str, data ); writeline( log, str );
597
 
598 47 dsmv
 
599 50 dsmv
        for ii in 0 to 7 loop
600 47 dsmv
 
601
                block_write( cmd, ret, 4, 16#08#, x"0000AA55" );
602
                block_read( cmd, ret, 4, 8, data );
603
                write( str, string'("READ: " )); hwrite( str, data( 15 downto 0 ) ); writeline( log, str );
604
                if( data/=x"0000AA55" ) then
605
                        error:=error+1;
606
                end if;
607
 
608
        end loop;
609
 
610
 
611
 
612 50 dsmv
        -- вывод в файл --
613
        writeline( log, str );
614
        if( error=0 ) then
615
                write( str, string'("TEST finished successfully" ));
616
                cnt_ok := cnt_ok + 1;
617
        else
618
                write( str, string'("TEST finished with ERR" ));
619
                cnt_error := cnt_error + 1;
620
        end if;
621 47 dsmv
        writeline( log, str );
622
        writeline( log, str );
623
 
624 50 dsmv
        -- вывод в консоль --
625
        writeline( output, str );
626
        if( error=0 ) then
627
                write( str, string'("TEST finished successfully" ));
628
                cnt_ok := cnt_ok + 1;
629
        else
630
                write( str, string'("TEST finished with ERR" ));
631
                cnt_error := cnt_error + 1;
632
        end if;
633
        writeline( output, str );
634
        writeline( output, str );
635
 
636
 
637 47 dsmv
end test_block_main;
638
 
639
 
640
 
641
 
642
--! Чтение 16 кБ с использованием двух блоков дескрипторов
643
procedure test_adm_read_16kb (
644
                signal  cmd:    out bh_cmd; --! команда
645
                signal  ret:    in  bh_ret  --! ответ
646
                )
647
is
648
 
649
variable        adr                             : std_logic_vector( 31 downto 0 );
650
variable        data                    : std_logic_vector( 31 downto 0 );
651
variable        str                             : line;
652
 
653
variable        error                   : integer:=0;
654
variable        dma_complete    : integer;
655
variable        kk                              : integer;
656
variable        status                  : std_logic_vector( 15 downto 0 );
657
 
658
begin
659
 
660
        write( str, string'("TEST_ADM_READ_16KB" ));
661
        writeline( log, str );
662
 
663
        ---- Формирование блока дескрипторов ---
664
        for ii in 0 to 256 loop
665
                adr:= x"00100000";
666
                adr:=adr + ii*4;
667
                int_mem_write( cmd, ret, adr,  x"00000000" );
668
        end loop;
669
 
670
        --- Блок 0 ---
671
 
672
        --- Дескриптор 0 ---
673
        int_mem_write( cmd, ret, x"00100000",  x"00008000" );
674
        int_mem_write( cmd, ret, x"00100004",  x"00000111" );   -- переход к следующему дескриптору 
675
 
676
        --- Дескриптор 1 ---
677
        int_mem_write( cmd, ret, x"00100008",  x"00008010" );
678
        int_mem_write( cmd, ret, x"0010000C",  x"00000112" );   -- переход к следующему блоку 
679
 
680
        --- Дескриптор 2 ---
681
        int_mem_write( cmd, ret, x"00100010",  x"00001002" );   -- адрес следующего дескриптора 
682
        int_mem_write( cmd, ret, x"00100014",  x"00000000" );
683
 
684
 
685
        int_mem_write( cmd, ret, x"001001F8",  x"00000000" );
686
        int_mem_write( cmd, ret, x"001001FC",  x"14644953" );
687
 
688
 
689
        --- Блок 1 ---
690
 
691
        --- Дескриптор 0 ---
692
        int_mem_write( cmd, ret, x"00100200",  x"00008020" );
693
        int_mem_write( cmd, ret, x"00100204",  x"00000111" );   -- переход к следующему дескриптору 
694
 
695
        --- Дескриптор 1 ---
696
        int_mem_write( cmd, ret, x"00100208",  x"00008030" );
697
        int_mem_write( cmd, ret, x"0010020C",  x"00000110" );   -- остановка
698
 
699
 
700
        int_mem_write( cmd, ret, x"001003F8",  x"00000000" );
701
        int_mem_write( cmd, ret, x"001003FC",  x"D67C4953" );
702
 
703
 
704
 
705
        ---- Программирование канала DMA ----
706
        block_write( cmd, ret, 4, 8, x"00000027" );             -- DMA_MODE 
707
        block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
708
 
709
        block_write( cmd, ret, 4, 20, x"00100000" );    -- PCI_ADRL 
710
        block_write( cmd, ret, 4, 21, x"00100000" );    -- PCI_ADRH  
711
        block_write( cmd, ret, 4, 23, x"00019000" );    -- LOCAL_ADR 
712
 
713
 
714
        ---- Подготовка тетрады ----
715
        trd_test_mode( cmd, ret, 0 );    -- переход в рабочий режим --
716
        trd_wait_cmd( cmd, ret, 0, 16, x"1600" );                -- DMAR0 - от тетрады 6 --
717
 
718
        trd_wait_cmd( cmd, ret, 1, 16#1F#, x"0001" );   -- Размер блока = 4 кБ --
719
 
720
        block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START 
721
 
722
        trd_wait_cmd( cmd, ret, 1, 16#0F#, x"0001" );   -- Подключение выхода генератора к DIO_IN --
723
 
724
        trd_wait_cmd( cmd, ret, 6,      0, x"2038" );            -- запуск тетрады DIO_IN
725
 
726
        trd_wait_cmd( cmd, ret, 1, 16#1E#, x"06A0" );   -- Запуск тестовой последовательности --
727
 
728
        wait for 20 us;
729
 
730
        block_read( cmd, ret, 4, 16, data );                    -- STATUS 
731
 
732
        write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
733
        if( data( 8 )='1' ) then
734
                write( str, string'(" - Дескриптор правильный" ));
735
        else
736
                write( str, string'(" - Ошибка чтения дескриптора" ));
737
                error := error + 1;
738
        end if;
739
 
740
        writeline( log, str );
741
 
742
        if( error=0 ) then
743
 
744
                kk:=0;
745
                loop
746
 
747
                trd_status( cmd, ret, 6, status );
748
                write( str, string'("TRD_STATUS: " )); hwrite( str, status );
749
 
750
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
751
                write( str, string'("    STATUS: " )); hwrite( str, data( 15 downto 0 ) );
752
 
753
                        if( data(4)='1' ) then
754
                                write( str, string'(" - завершено чтение блока " ));
755
                                block_write( cmd, ret, 4, 16#11#, x"00000010" );                -- FLAG_CLR - сброс EOT 
756
                                kk:=kk+1;
757
                                if( kk=4 ) then
758
                                        exit;
759
                                end if;
760
                        end if;
761
                        writeline( log, str );
762
 
763
                        wait for 500 ns;
764
 
765
 
766
                end loop;
767
 
768
                ---- Ожидание завершения DMA ----
769
                dma_complete := 0;
770
                for ii in 0 to 100 loop
771
 
772
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
773
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
774
                        if( data(5)='1' ) then
775
                                write( str, string'(" - DMA завершён " ));
776
                                dma_complete := 1;
777
 
778
                                block_write( cmd, ret, 4, 16#11#, x"00000010" );                -- FLAG_CLR - сброс EOT 
779
 
780
                        end if;
781
                        writeline( log, str );
782
 
783
                        if( dma_complete=1 ) then
784
                                exit;
785
                        end if;
786
 
787
                        wait for 1 us;
788
 
789
                end loop;
790
 
791
                writeline( log, str );
792
 
793
                if( dma_complete=0 ) then
794
                        write( str, string'("Ошибка - DMA не завершён " ));
795
                        writeline( log, str );
796
                        error:=error+1;
797
                end if;
798
 
799
        end if;
800
 
801
        for ii in 0 to 3 loop
802
 
803
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
804
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
805
                writeline( log, str );
806
                wait for 500 ns;
807
 
808
        end loop;
809
 
810
 
811
        block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL - STOP      
812
 
813
        write( str, string'(" Блок 0 - прочитано: " ));
814
        writeline( log, str );
815
 
816
        for ii in 0 to 15 loop
817
 
818
                adr:= x"00800000";
819
                adr:=adr + ii*4;
820
                int_mem_read( cmd, ret, adr,  data );
821
 
822
                write( str, ii ); write( str, string'("   " )); hwrite( str, data );
823
                writeline( log, str );
824
 
825
        end loop;
826
 
827
        writeline( log, str );
828
 
829
        write( str, string'(" Блок 1 - прочитано: " ));
830
        writeline( log, str );
831
 
832
        for ii in 0 to 15 loop
833
 
834
                adr:= x"00801000";
835
                adr:=adr + ii*4;
836
                int_mem_read( cmd, ret, adr,  data );
837
 
838
                write( str, ii ); write( str, string'("   " )); hwrite( str, data );
839
                writeline( log, str );
840
 
841
        end loop;
842
 
843
        write( str, string'(" Блок 2 - прочитано: " ));
844
        writeline( log, str );
845
 
846
        for ii in 0 to 15 loop
847
 
848
                adr:= x"00802000";
849
                adr:=adr + ii*4;
850
                int_mem_read( cmd, ret, adr,  data );
851
 
852
                write( str, ii ); write( str, string'("   " )); hwrite( str, data );
853
                writeline( log, str );
854
 
855
        end loop;
856
 
857
 
858
        write( str, string'(" Блок 3 - прочитано: " ));
859
        writeline( log, str );
860
 
861
        for ii in 0 to 15 loop
862
 
863
                adr:= x"00803000";
864
                adr:=adr + ii*4;
865
                int_mem_read( cmd, ret, adr,  data );
866
 
867
                write( str, ii ); write( str, string'("   " )); hwrite( str, data );
868
                writeline( log, str );
869
 
870
        end loop;
871
 
872
--      block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
873
--      block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL 
874
--      block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START     
875
 
876
 
877 50 dsmv
        -- вывод в файл --
878 47 dsmv
        writeline( log, str );
879
        if( error=0 ) then
880 50 dsmv
                write( str, string'("TEST finished successfully" ));
881 47 dsmv
                cnt_ok := cnt_ok + 1;
882
        else
883 50 dsmv
                write( str, string'("TEST finished with ERR" ));
884 47 dsmv
                cnt_error := cnt_error + 1;
885
        end if;
886
        writeline( log, str );
887
        writeline( log, str );
888
 
889 50 dsmv
        -- вывод в консоль --
890
        writeline( output, str );
891
        if( error=0 ) then
892
                write( str, string'("TEST finished successfully" ));
893
                cnt_ok := cnt_ok + 1;
894
        else
895
                write( str, string'("TEST finished with ERR" ));
896
                cnt_error := cnt_error + 1;
897
        end if;
898
        writeline( output, str );
899
        writeline( output, str );
900
 
901
 
902
 
903 47 dsmv
end test_adm_read_16kb;
904
 
905
 
906
 
907
 
908
--! Запись 16 кБ с использованием двух блоков дескрипторов
909
procedure test_adm_write_16kb (
910
                signal  cmd:    out bh_cmd; --! команда
911
                signal  ret:    in  bh_ret  --! ответ
912
                )
913
is
914
 
915
variable        adr                             : std_logic_vector( 31 downto 0 );
916
variable        data                    : std_logic_vector( 31 downto 0 );
917
variable        str                             : line;
918
 
919
variable        error                   : integer:=0;
920
variable        dma_complete    : integer;
921
variable        kk                              : integer;
922
variable        status                  : std_logic_vector( 15 downto 0 );
923
 
924
begin
925
 
926
        write( str, string'("TEST_ADM_WRITE_16KB" ));
927
        writeline( log, str );
928
 
929
        ---- Формирование блока дескрипторов ---
930
        for ii in 0 to 256 loop
931
                adr:= x"00100000";
932
                adr:=adr + ii*4;
933
                int_mem_write( cmd, ret, adr,  x"00000000" );
934
        end loop;
935
 
936
        ---- Заполнение памяти ----
937
        for ii in 0 to 256 loop
938
                adr:= x"00800000";
939
                adr:=adr + ii*4;
940
                data:=x"00A00000";
941
                data:=data + ii;
942
                int_mem_write( cmd, ret, adr,  data );
943
        end loop;
944
 
945
        for ii in 0 to 1023 loop
946
                adr:= x"00801000";
947
                adr:=adr + ii*4;
948
                data:=x"00A10000";
949
                data:=data + ii;
950
                int_mem_write( cmd, ret, adr,  data );
951
        end loop;
952
 
953
        for ii in 0 to 256 loop
954
                adr:= x"00802000";
955
                adr:=adr + ii*4;
956
                data:=x"00A20000";
957
                data:=data + ii;
958
                int_mem_write( cmd, ret, adr,  data );
959
        end loop;
960
 
961
        for ii in 0 to 256 loop
962
                adr:= x"00803000";
963
                adr:=adr + ii*4;
964
                data:=x"00A30000";
965
                data:=data + ii;
966
                int_mem_write( cmd, ret, adr,  data );
967
        end loop;
968
 
969
        --- Блок 0 ---
970
 
971
        --- Дескриптор 0 ---
972
        int_mem_write( cmd, ret, x"00100000",  x"00008000" );
973
        int_mem_write( cmd, ret, x"00100004",  x"00000011" );   -- переход к следующему дескриптору 
974
 
975
        --- Дескриптор 1 ---
976
        int_mem_write( cmd, ret, x"00100008",  x"00008010" );
977
        int_mem_write( cmd, ret, x"0010000C",  x"00000012" );   -- переход к следующему блоку 
978
 
979
        --- Дескриптор 2 ---
980
        int_mem_write( cmd, ret, x"00100010",  x"00001002" );   -- адрес следующего дескриптора 
981
        int_mem_write( cmd, ret, x"00100014",  x"00000000" );
982
 
983
 
984
        int_mem_write( cmd, ret, x"001001F8",  x"00000000" );
985
        int_mem_write( cmd, ret, x"001001FC",  x"14A44953" );
986
 
987
 
988
        --- Блок 1 ---
989
 
990
        --- Дескриптор 0 ---
991
        int_mem_write( cmd, ret, x"00100200",  x"00008020" );
992
        int_mem_write( cmd, ret, x"00100204",  x"00000011" );   -- переход к следующему дескриптору 
993
 
994
        --- Дескриптор 1 ---
995
        int_mem_write( cmd, ret, x"00100208",  x"00008030" );
996
        int_mem_write( cmd, ret, x"0010020C",  x"00000010" );   -- остановка
997
 
998
 
999
        int_mem_write( cmd, ret, x"001003F8",  x"00000000" );
1000
        int_mem_write( cmd, ret, x"001003FC",  x"D6BC4953" );
1001
 
1002
 
1003
 
1004
        ---- Программирование канала DMA ----
1005
        block_write( cmd, ret, 4, 8, x"00000023" );             -- DMA_MODE 
1006
        block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
1007
 
1008
        block_write( cmd, ret, 4, 20, x"00100000" );    -- PCI_ADRL 
1009
        block_write( cmd, ret, 4, 21, x"00100000" );    -- PCI_ADRH  
1010
        block_write( cmd, ret, 4, 23, x"0001D000" );    -- LOCAL_ADR 
1011
 
1012
 
1013
        ---- Подготовка тетрады ----
1014
        trd_test_mode( cmd, ret, 0 );    -- переход в рабочий режим --
1015
        trd_wait_cmd( cmd, ret, 0, 16, x"1700" );                -- DMAR0 - от тетрады 7 --
1016
 
1017
        trd_wait_cmd( cmd, ret, 1, 16#1D#, x"0001" );   -- Размер блока = 4 кБ --
1018
 
1019
        block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START 
1020
 
1021
        trd_wait_cmd( cmd, ret, 1, 16#0F#, x"0001" );   -- Подключение выхода генератора к DIO_IN --
1022
 
1023
        trd_wait_cmd( cmd, ret, 7,      0, x"2038" );            -- запуск тетрады DIO_OUT 
1024
 
1025
        trd_wait_cmd( cmd, ret, 1, 16#1C#, x"0020" );   -- Запуск тестовой последовательности --
1026
 
1027
        wait for 20 us;
1028
 
1029
 
1030
        for ii in 0 to 20 loop
1031
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
1032
 
1033
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
1034
                if( data( 8 )='1' ) then
1035
                        write( str, string'(" - Дескриптор правильный" ));
1036
                        error := 0;
1037
                        exit;
1038
                else
1039
                        write( str, string'(" - Ошибка чтения дескриптора" ));
1040
                        error := error + 1;
1041
                        wait for 10 us;
1042
                end if;
1043
 
1044
                writeline( log, str );
1045
        end loop;
1046
 
1047
 
1048
        if( error=0 ) then
1049
 
1050
                kk:=0;
1051
                loop
1052
 
1053
                trd_status( cmd, ret, 6, status );
1054
                write( str, string'("TRD_STATUS: " )); hwrite( str, status );
1055
 
1056
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
1057
                write( str, string'("    STATUS: " )); hwrite( str, data( 15 downto 0 ) );
1058
 
1059
                        if( data(4)='1' ) then
1060
                                write( str, string'(" - завершено чтение блока " ));
1061
                                block_write( cmd, ret, 4, 16#11#, x"00000010" );                -- FLAG_CLR - сброс EOT 
1062
                                kk:=kk+1;
1063
                                if( kk=4 ) then
1064
                                        exit;
1065
                                end if;
1066
                        end if;
1067
                        writeline( log, str );
1068
 
1069
                        wait for 500 ns;
1070
 
1071
 
1072
                end loop;
1073
 
1074
                ---- Ожидание завершения DMA ----
1075
                dma_complete := 0;
1076
                for ii in 0 to 100 loop
1077
 
1078
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
1079
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
1080
                        if( data(5)='1' ) then
1081
                                write( str, string'(" - DMA завершён " ));
1082
                                dma_complete := 1;
1083
 
1084
                                block_write( cmd, ret, 4, 16#11#, x"00000010" );                -- FLAG_CLR - сброс EOT 
1085
 
1086
                        end if;
1087
                        writeline( log, str );
1088
 
1089
                        if( dma_complete=1 ) then
1090
                                exit;
1091
                        end if;
1092
 
1093
                        wait for 1 us;
1094
 
1095
                end loop;
1096
 
1097
                writeline( log, str );
1098
 
1099
                if( dma_complete=0 ) then
1100
                        write( str, string'("Ошибка - DMA не завершён " ));
1101
                        writeline( log, str );
1102
                        error:=error+1;
1103
                end if;
1104
 
1105
        end if;
1106
 
1107
        for ii in 0 to 3 loop
1108
 
1109
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
1110
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
1111
                writeline( log, str );
1112
                wait for 500 ns;
1113
 
1114
        end loop;
1115
 
1116
 
1117
        block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL - STOP      
1118
 
1119
 
1120
--      block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
1121
--      block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL 
1122
--      block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START     
1123
 
1124 50 dsmv
 
1125
        -- вывод в файл --
1126 47 dsmv
        writeline( log, str );
1127
        if( error=0 ) then
1128 50 dsmv
                write( str, string'("TEST finished successfully" ));
1129 47 dsmv
                cnt_ok := cnt_ok + 1;
1130
        else
1131 50 dsmv
                write( str, string'("TEST finished with ERR" ));
1132 47 dsmv
                cnt_error := cnt_error + 1;
1133
        end if;
1134
        writeline( log, str );
1135
        writeline( log, str );
1136
 
1137 50 dsmv
        -- вывод в консоль --
1138
        writeline( output, str );
1139
        if( error=0 ) then
1140
                write( str, string'("TEST finished successfully" ));
1141
                cnt_ok := cnt_ok + 1;
1142
        else
1143
                write( str, string'("TEST finished with ERR" ));
1144
                cnt_error := cnt_error + 1;
1145
        end if;
1146
        writeline( output, str );
1147
        writeline( output, str );
1148
 
1149
 
1150 47 dsmv
end test_adm_write_16kb;
1151
 
1152
end package     body test_pkg;
1153
 
1154
 

powered by: WebSVN 2.1.0

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