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 51

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

powered by: WebSVN 2.1.0

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