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

Subversion Repositories pcie_ds_dma

[/] [pcie_ds_dma/] [trunk/] [soft/] [linux/] [common/] [utils/] [tf_testbufm2.cpp] - Blame information for rev 15

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

Line No. Rev Author Line
1 2 dsmv
/**     \file
2 6 v.karak
        \brief Функции формирования и проверки массива данных
3
 
4
        В файле содержится реализация класса TF_TestBufM2 - формирование и проверка массива данных.
5
 
6
        \author Dmitry Smekhov
7
        \version 1.0
8
 
9
 
10 2 dsmv
*/
11
 
12
 
13
#include <stdio.h>
14
 
15
#include "utypes.h"
16
#include "tf_testbufm2.h"
17
 
18
//! Конструктор
19
TF_TestBufM2::TF_TestBufM2() {
20
}
21
 
22
//! Деструктор
23
TF_TestBufM2::~TF_TestBufM2() {
24
}
25
 
26
 
27
 
28
//! Формирование массива
29
/**     Функция производит формирование массива. Алгоритм формирования
30
        зависит от номера n.
31
 
32
        \param  buf - указатель на массив
33
        \param  n   - номер блока
34
        \param  size - размер массива
35
                \param  mode - режим заполнения бит 7=1 - фиксированный тип блока, 11..8 - тип блока
36
 
37
*/
38
void    TF_TestBufM2::buf_set( U32 *buf, U32 n, U32 size, U32 mode )
39
{
40
    //  n%100 - тип блока
41
    U32 ii;
42
 
43
    __int64 *ptr=(__int64*)buf;
44
    U32 size64 = size/2;
45 6 v.karak
    __int64 data_ex = 0ULL;
46
    __int64 data_sig = 0ULL;
47
    __int64 data_ex1 = 0ULL;
48
    __int64 data_ex2 = 0ULL;
49 2 dsmv
 
50
    data_sig = n;
51
    if( mode & 0x80 )
52
    {
53
        block_mode=(mode>>8)&0xF;
54
        data_sig = n;
55
    }
56
 
57
    data_sig <<=32;
58
    data_sig |=0xA5A50123;
59
    *ptr++ = data_sig;  //data_in = *ptr++;
60
 
61
    switch( block_mode )
62
    {
63
    case 0:  data_ex = 1; break;
64
    case 1:  data_ex = ~1; break;
65
    case 2:  data_ex = 1; break;
66
    case 3:  data_ex = ~1; break;
67
    case 4:  data_ex = 1;  data_ex2=0; break;
68 6 v.karak
    case 5:  data_ex = ~1; data_ex2=0xFFFFFFFFFFFFFFFFULL;  break;
69 2 dsmv
    case 6:
70
    case 7:  data_ex = data_ex_cnt; break;
71
    case 8:
72
    case 9:  data_ex = data_ex_noise; break;
73
    }
74
 
75
 
76
    switch( block_mode )
77
    {
78
    case 0:
79
    case 1:
80
        for( ii=1; ii<size64; ii++ )
81
        {
82
            //data_in=*ptr++;
83
            *ptr++=data_ex;
84
            {
85 6 v.karak
                U32 f= (data_ex & 0x8000000000000000ULL) ? 1:0;
86 2 dsmv
                data_ex <<= 1;
87
                data_ex &=~1;
88
                data_ex |=f;
89
            }
90
        }
91
        break;
92
 
93
         case 2:
94
         case 3:
95
 
96
        //data_in=*ptr++;
97
        *ptr++=(~data_ex);
98
        {
99 6 v.karak
            U32 f= (data_ex & 0x8000000000000000ULL) ? 1:0;
100 2 dsmv
            data_ex <<= 1;
101
            data_ex &=~1;
102
            data_ex |=f;
103
        }
104
 
105
        for( ii=2; ii<size64; ii+=2 )
106
        {
107
            //data_in=*ptr++;
108
            *ptr++=data_ex;
109
            *ptr++=~data_ex;
110
 
111
            {
112 6 v.karak
                U32 f= (data_ex & 0x8000000000000000ULL) ? 1:0;
113 2 dsmv
                data_ex <<= 1;
114
                data_ex &=~1;
115
                data_ex |=f;
116
            }
117
 
118
        }
119
        break;
120
 
121
 
122
         case 4:
123
         case 5:
124
        {
125
            int flag;
126
            for( ii=1; ii<size64; ii++ )
127
            {
128
                flag=( (n & 0xFF)==(ii&0xFF) )? 1 : 0;
129
                //data_in=*ptr++;
130
                data_ex1 = ( flag ) ? data_ex : data_ex2;
131
                *ptr++=data_ex1;
132
                if( flag )
133
                {
134 6 v.karak
                    U32 f= (data_ex & 0x8000000000000000ULL) ? 1:0;
135 2 dsmv
                    data_ex <<= 1;
136
                    data_ex &=~1;
137
                    data_ex |=f;
138
                }
139
            }
140
        }
141
        break;
142
 
143
 
144
         case 6:
145
         case 7:
146
 
147
        //data_in=*ptr++;
148
        *ptr++=~data_ex;
149
        //if( (~data_ex)!=data_in )
150
        //{
151
        //  cnt_err+=check( 1, ~data_ex, data_in );
152
        //}
153
        data_ex++;
154
 
155
        for( ii=2; ii<size64; ii+=2 )
156
        {
157
            //data_in=*ptr++;
158
            *ptr++=data_ex;
159
            *ptr++=~data_ex;
160
 
161
            data_ex++;
162
 
163
        }
164
        data_ex_cnt = data_ex;
165
        break;
166
 
167
 
168
         case 8:
169
         case 9:
170
        {
171
            /*
172
             //__int64 f63;
173
             //__int64 f62;
174
             //__int64 f60;
175
             //__int64 f59;
176
             //__int64 f0;
177
             U32 data_h;
178
             U32 f63;
179
             U32 f62;
180
             U32 f60;
181
             U32 f59;
182
             U32 f0;
183
            */
184
 
185
 
186
 
187
            for( ii=1; ii<size64; ii++ )
188
            {
189
                //data_in=*ptr++;
190
                *ptr++=data_ex;
191
 
192
                {/*
193
                 f63 = data_ex >> 63;
194
                 f62 = data_ex >> 62;
195
                 f60 = data_ex >> 60;
196
                 f59 = data_ex >> 59;
197
                 f0 = (f63 ^ f62 ^ f60 ^ f59)&1;
198
                 */
199
                    U32 data_h=data_ex>>32;
200
                    U32 f63 = data_h >> 31;
201
                    U32 f62 = data_h >> 30;
202
                    U32 f60 = data_h >> 28;
203
                    U32 f59 = data_h >> 27;
204
                    U32 f0 = (f63 ^ f62 ^ f60 ^ f59)&1;
205
                    //U32 data_l=data_ex;
206
                    //U32 f31 = (data_l>>31) & 1;
207
                    //data_l<<=1;
208
                    //data_l&=~1;
209
                    //data_l|=f0;
210
                    //data_h<<=1;
211
                    //data_h&=~1;
212
                    //data_h|=f31;
213
                    //data_ex=data_h;
214
                    //data_ex<<=32;
215
                    //data_ex|=data_l;
216
 
217
                    data_ex <<= 1;
218
                    data_ex &= ~1;
219
                    data_ex |=f0;
220
                }
221
 
222
 
223
 
224
            }
225
        }
226
 
227
        data_ex_noise = data_ex;
228
        break;
229
 
230
 
231
 
232
    }
233
 
234
    block_mode++;
235
    if( block_mode==10 )
236
        block_mode=0;
237
 
238
    buf_current++;
239
 
240
 
241
}
242
 
243
 
244
 
245
 
246
//! Проверка очередного слова данных
247
/**     Функция производит проверку очередного слова данных.
248
        При несовпадении ожидаемого и принятого слова функция
249
        записывает информацию в массив word_error (для первых ошибок -
250
        не более чем для max_cnt_error) и формирует распределение
251
        ошибок по битам.
252
 
253
        \param  index  Номер слова в массиве
254
        \param  d0     Ожидаемые сдово
255
        \param  di0    Принятое слово
256
        \return        1 - есть ошибка, 0 - нет ошибки
257
 
258
*/
259
inline U32     TF_TestBufM2::check( U32 index, __int64 d0, __int64 di0 ) {
260
 
261
    U32 flag_error=0;
262
    //if( d0!=di0 )
263
    {
264
        flag_error=1;
265
        // Запись информации об ошибке
266
 
267
        if( word_cnt_error<max_cnt_error ) {
268
            word_error[ word_cnt_error*4+0 ]=buf_current;
269
            word_error[ word_cnt_error*4+1 ]=index;
270
            word_error[ word_cnt_error*4+2 ]=d0;
271
            word_error[ word_cnt_error*4+3 ]=di0;
272
 
273
        }
274
 
275
        word_cnt_error++;
276
        /*
277
                if( max_bit_cnt>0 ) {           // Определение распределения по битам
278
                U32 jj;
279
                U32 mask=1;
280
                 for( jj=0; jj<32; jj++ ) {
281
                    if( (d0&mask)!=(di0&mask) ) {
282
                      if( max_bit_cnt<=32 ) {
283
                        if( (di0&mask)==0 )
284
                         bit_error0[jj%max_bit_cnt]++;
285
                        else
286
                         bit_error1[jj%max_bit_cnt]++;
287
                      } else {
288
                        if( (di0&mask)==0 )
289
                         bit_error0[jj+32*(index&1)]++;
290
                        else
291
                         bit_error1[jj+32*(index&1)]++;
292
                      }
293
 
294
                    }
295
                 }
296
                }
297
                */
298
    }
299
    return flag_error;
300
}
301
 
302
 
303
 
304
 
305
//! Проверка массива
306
/**     Функция проверяет массив buf на соответствие ожидаемым данным.
307
        Массив должен быть сформирован функцией buf_set или аналогичной
308
        При обнаружении ошибки в массив word_error записываются четыре числа:
309
                - номер массива
310
                - индекс в массивк
311
                - ожидаемые данные
312
                - полученные данные
313
        В массивы bit_error0 и bit_error1 заносится распределение ошибок по битам.
314
 
315
        \param  buf     - Адрес массива
316
        \param  n       - Номер массива
317
        \param  size    - Размер массива в 32-х разрядных словах
318
        \param  mode    - Режим формирвоания блока: бит 7=1 - признак принудительной установки, 11..8 - тип
319
 
320
        \return Число обнаруженных ошибок
321
 
322
*/
323
U32     TF_TestBufM2::buf_check( U32 *buf, U32 n, U32 size, U32 mode ) {
324
 
325
    //  n%100 - тип блока
326
    U32 ii;
327
    U32 cnt_err=0;
328
 
329
    __int64 *ptr=(__int64*)buf;
330
    U32 size64 = size/2;
331 6 v.karak
    __int64 data_ex = 0ULL;
332
    __int64 data_in = 0ULL;
333
    __int64 data_sig = 0ULL;
334
    __int64 data_ex1 = 0ULL;
335
    __int64 data_ex2 = 0ULL;
336 2 dsmv
 
337
    data_sig = n;
338
    if( mode & 0x80 )
339
    {
340
        block_mode=(mode>>8)&0xF;
341
        data_sig = n;
342
    }
343
 
344
    data_sig <<=32;
345
    data_sig |=0xA5A50123;
346
    data_in = *ptr++;
347
    if( data_sig!=data_in )
348
    {
349
        cnt_err+=check( 0, data_sig, data_in );
350
    }
351
 
352
    /*
353
          when "0000" => -- Бегущая 1 по 64-м разрядам
354
                                data_ex0 <= x"0000000000000001" after 1 ns;
355
                          when "0001" => -- Бегущий 0 по 64-м разрядам
356
                                data_ex0 <= not x"0000000000000001" after 1 ns;
357
                          when "0010" => -- Бегущая 1 с инверсией  по 64-м разрядам
358
                                data_ex1 <= x"0000000000000001" after 1 ns;
359
                          when "0011" => -- Бегущий 0 с инверсией  по 64-м разрядам
360
                                data_ex1 <= not x"0000000000000001" after 1 ns;
361
                          when "0100" => -- Бегущая 1 в блоке 0
362
                                data_ex2 <= x"0000000000000001" after 1 ns;
363
                                data_ex3 <= (others=>'0');
364
                          when "0101" => -- Бегущий 0 в блоке 1
365
                                data_ex2 <= not x"0000000000000001" after 1 ns;
366
                                data_ex3 <= (others=>'1') after 1 ns;
367
           */
368
    switch( block_mode )
369
    {
370
    case 0:  data_ex = 1; break;
371
    case 1:  data_ex = ~1; break;
372
    case 2:  data_ex = 1; break;
373
    case 3:  data_ex = ~1; break;
374
    case 4:  data_ex = 1;  data_ex2=0; break;
375 6 v.karak
    case 5:  data_ex = ~1; data_ex2=0xFFFFFFFFFFFFFFFFULL;  break;
376 2 dsmv
    case 6:
377
    case 7:  data_ex = data_ex_cnt; break;
378
    case 8:
379
    case 9:  data_ex = data_ex_noise; break;
380
    }
381
 
382
 
383
    switch( block_mode )
384
    {
385
    case 0:
386
    case 1:
387
        for( ii=1; ii<size64; ii++ )
388
        {
389
            data_in=*ptr++;
390
            if( data_ex!=data_in )
391
            {
392
                cnt_err+=check( ii, data_ex, data_in );
393
                //cnt_err=0;
394
            }
395
            {
396 6 v.karak
                U32 f= (data_ex & 0x8000000000000000ULL) ? 1:0;
397 2 dsmv
                data_ex <<= 1;
398
                data_ex &=~1;
399
                data_ex |=f;
400
            }
401
        }
402
        break;
403
 
404
         case 2:
405
         case 3:
406
 
407
        data_in=*ptr++;
408
        if( (~data_ex)!=data_in )
409
        {
410
            cnt_err+=check( 1, ~data_ex, data_in );
411
        }
412
        {
413 6 v.karak
            U32 f= (data_ex & 0x8000000000000000ULL) ? 1:0;
414 2 dsmv
            data_ex <<= 1;
415
            data_ex &=~1;
416
            data_ex |=f;
417
        }
418
 
419
        for( ii=2; ii<size64; ii+=2 )
420
        {
421
            data_in=*ptr++;
422
            if( data_ex!=data_in )
423
            {
424
                cnt_err+=check( ii, data_ex, data_in );
425
                //cnt_err=0;
426
            }
427
 
428
 
429
            data_in=*ptr++;
430
            if( (~data_ex)!=data_in )
431
            {
432
                cnt_err+=check( ii+1, ~data_ex, data_in );
433
            }
434
 
435
 
436
            {
437 6 v.karak
                U32 f= (data_ex & 0x8000000000000000ULL) ? 1:0;
438 2 dsmv
                data_ex <<= 1;
439
                data_ex &=~1;
440
                data_ex |=f;
441
            }
442
 
443
        }
444
        break;
445
 
446
 
447
         case 4:
448
         case 5:
449
        {
450
            int flag;
451
            for( ii=1; ii<size64; ii++ )
452
            {
453
                flag=( (n & 0xFF)==(ii&0xFF) )? 1 : 0;
454
                data_in=*ptr++;
455
                data_ex1 = ( flag ) ? data_ex : data_ex2;
456
                if( data_ex1!=data_in )
457
                {
458
                    cnt_err+=check( ii, data_ex1, data_in );
459
                    //cnt_err=0;
460
                }
461
                if( flag )
462
                {
463 6 v.karak
                    U32 f= (data_ex & 0x8000000000000000ULL) ? 1:0;
464 2 dsmv
                    data_ex <<= 1;
465
                    data_ex &=~1;
466
                    data_ex |=f;
467
                }
468
            }
469
        }
470
        break;
471
 
472
 
473
         case 6:
474
         case 7:
475
 
476
        data_in=*ptr++;
477
        if( (~data_ex)!=data_in )
478
        {
479
            cnt_err+=check( 1, ~data_ex, data_in );
480
        }
481
        data_ex++;
482
 
483
        for( ii=2; ii<size64; ii+=2 )
484
        {
485
            data_in=*ptr++;
486
            if( data_ex!=data_in )
487
            {
488
                cnt_err+=check( ii, data_ex, data_in );
489
                //cnt_err=0;
490
            }
491
 
492
 
493
            data_in=*ptr++;
494
            if( (~data_ex)!=data_in )
495
            {
496
                cnt_err+=check( ii+1, ~data_ex, data_in );
497
            }
498
 
499
            data_ex++;
500
 
501
        }
502
        data_ex_cnt = data_ex;
503
        break;
504
 
505
 
506
         case 8:
507
         case 9:
508
        {
509
            /*
510
             //__int64 f63;
511
             //__int64 f62;
512
             //__int64 f60;
513
             //__int64 f59;
514
             //__int64 f0;
515
             U32 data_h;
516
             U32 f63;
517
             U32 f62;
518
             U32 f60;
519
             U32 f59;
520
             U32 f0;
521
            */
522
 
523
 
524
 
525
            for( ii=1; ii<size64; ii++ )
526
            {
527
                data_in=*ptr++;
528
 
529
                if( data_ex!=data_in )
530
                {
531
                    cnt_err+=check( ii, data_ex, data_in );
532
                }
533
 
534
                {/*
535
                 f63 = data_ex >> 63;
536
                 f62 = data_ex >> 62;
537
                 f60 = data_ex >> 60;
538
                 f59 = data_ex >> 59;
539
                 f0 = (f63 ^ f62 ^ f60 ^ f59)&1;
540
                 */
541
                    U32 data_h=data_ex>>32;
542
                    U32 f63 = data_h >> 31;
543
                    U32 f62 = data_h >> 30;
544
                    U32 f60 = data_h >> 28;
545
                    U32 f59 = data_h >> 27;
546
                    U32 f0 = (f63 ^ f62 ^ f60 ^ f59)&1;
547
                    //U32 data_l=data_ex;
548
                    //U32 f31 = (data_l>>31) & 1;
549
                    //data_l<<=1;
550
                    //data_l&=~1;
551
                    //data_l|=f0;
552
                    //data_h<<=1;
553
                    //data_h&=~1;
554
                    //data_h|=f31;
555
                    //data_ex=data_h;
556
                    //data_ex<<=32;
557
                    //data_ex|=data_l;
558
 
559
                    data_ex <<= 1;
560
                    data_ex &= ~1;
561
                    data_ex |=f0;
562
                }
563
 
564
 
565
 
566
            }
567
        }
568
 
569
        data_ex_noise = data_ex;
570
        break;
571
 
572
 
573
 
574
    }
575
 
576
    block_mode++;
577
    if( block_mode==10 )
578
        block_mode=0;
579
 
580
    buf_current++;
581
    if (cnt_err==0)
582
        buf_cnt_ok++;
583
    else
584
        buf_cnt_error++;
585
 
586
    return cnt_err;
587
 
588
}
589
 
590
 
591
//! Проверка массива
592
/**     Функция проверяет массив buf на соответствие ожидаемым данным.
593
        Массив должен быть сформирован функцией buf_set или аналогичной
594
        При обнаружении ошибки в массив word_error записываются четыре числа:
595
                - номер массива
596 6 v.karak
                - индекс в массивк
597 2 dsmv
                - ожидаемые данные
598
                - полученные данные
599
        В массивы bit_error0 и bit_error1 заносится распределение ошибок по битам.
600
 
601
                Ожидается псевдослучайная последовательность. Начальное значение 2;
602
                Сигнатуры и номера блока не ожидается.
603
 
604
        \param  buf     - Адрес массива
605
        \param  size    - Размер массива в 32-х разрядных словах
606
 
607
        \return Число обнаруженных ошибок
608
 
609
*/
610
U32     TF_TestBufM2::buf_check_psd( U32 *buf, U32 size  )
611
{
612
 
613
    //  n%100 - тип блока
614
    U32 ii;
615
    U32 cnt_err=0;
616
 
617
    __int64 *ptr=(__int64*)buf;
618
    U32 size64 = size/2;
619
    __int64 data_ex;
620
    __int64 data_in;
621
 
622
    data_ex = data_ex_psd ;
623
 
624
 
625
    for( ii=0; ii<size64; ii++ )
626
    {
627
        data_in=*ptr++;
628
 
629
        if( data_ex!=data_in )
630
        {
631 6 v.karak
            if( word_cnt_error<max_cnt_error )
632
            {
633
                word_error[ word_cnt_error*4+0 ]=buf_current;
634
                word_error[ word_cnt_error*4+1 ]=ii;
635
                word_error[ word_cnt_error*4+2 ]=data_ex;
636
                word_error[ word_cnt_error*4+3 ]=data_in;
637
            }
638
            word_cnt_error++;
639
            cnt_err++;
640
            //cnt_err+=check( ii, data_ex, data_in );
641 2 dsmv
            data_ex=data_in;
642
        }
643
 
644
        {/*
645
             f63 = data_ex >> 63;
646
             f62 = data_ex >> 62;
647
             f60 = data_ex >> 60;
648
             f59 = data_ex >> 59;
649
             f0 = (f63 ^ f62 ^ f60 ^ f59)&1;
650
             */
651 6 v.karak
 
652 2 dsmv
            U32 data_h=data_ex>>32;
653
            U32 f63 = data_h >> 31;
654
            U32 f62 = data_h >> 30;
655
            U32 f60 = data_h >> 28;
656
            U32 f59 = data_h >> 27;
657
            U32 f0 = (f63 ^ f62 ^ f60 ^ f59)&1;
658 6 v.karak
 
659 2 dsmv
            //U32 data_l=data_ex;
660
            //U32 f31 = (data_l>>31) & 1;
661
            //data_l<<=1;
662
            //data_l&=~1;
663
            //data_l|=f0;
664
            //data_h<<=1;
665
            //data_h&=~1;
666
            //data_h|=f31;
667
            //data_ex=data_h;
668
            //data_ex<<=32;
669
            //data_ex|=data_l;
670
 
671
            data_ex <<= 1;
672
            data_ex &= ~1;
673
            data_ex |=f0;
674
        }
675
 
676
 
677
 
678
    }
679
 
680
    data_ex_psd = data_ex;
681
 
682
    block_mode++;
683
    if( block_mode==10 )
684
        block_mode=0;
685
 
686
    buf_current++;
687
    if (cnt_err==0)
688
        buf_cnt_ok++;
689
    else
690
        buf_cnt_error++;
691
 
692
    return cnt_err;
693
 
694
}
695
 
696 6 v.karak
//! Проверка двоично-инверсной последовательности
697
U32     TF_TestBufM2::buf_check_inv( U32 *buf, U32 size  )
698
{
699 2 dsmv
 
700 6 v.karak
    //  n%100 - тип блока
701
    U32 ii;
702
    U32 cnt_err=0;
703
 
704
    __int64 *ptr=(__int64*)buf;
705
    U32 size64 = size/2;
706
    __int64 data_ex;
707
    __int64 data_in;
708
 
709
    register unsigned f0;
710
 
711
 
712
    data_ex = data_ex_inv ;
713
 
714
 
715
    for( ii=0; ii<size64; ii++ )
716
    {
717
        data_in=*ptr++;
718
 
719
        if( data_ex!=data_in )
720
        {
721
            cnt_err+=check( ii, data_ex, data_in );
722
            //data_ex=data_in;
723
        }
724
 
725
        //data_h=data_ex>>32; f63 = data_h >> 31; f0 = f63^1; data_ex <<= 1; data_ex &= ~1; data_ex |=f0;
726
        f0 = ((data_ex >>63) & 1) ^1; data_ex <<= 1; data_ex &= ~1; data_ex |=f0;
727
 
728
 
729
 
730
 
731
    }
732
 
733
    data_ex_inv = data_ex;
734
 
735
    block_mode++;
736
    if( block_mode==10 )
737
        block_mode=0;
738
 
739
    buf_current++;
740
    if (cnt_err==0)
741
        buf_cnt_ok++;
742
    else
743
        buf_cnt_error++;
744
 
745
    return cnt_err;
746
 
747
}
748
 
749 2 dsmv
//! Начало проверки группы массивов
750
/**     Функция подготавливает параметры для проверки нескольких массивов.
751
        Обнуляются счётчики ошибок.
752
 
753
        \param  n_error - число фиксируемых ошибок. Не больше 128.
754
        \param  bit_cnt - Число бит в слове, для определения распределения ошибок по битам.
755
 
756
 
757
*/
758
void  TF_TestBufM2::buf_check_start( U32 n_error, U32 bit_cnt ) {
759
 
760
    if( n_error<32 ) {
761
        max_cnt_error=n_error;
762
    } else {
763
        max_cnt_error=32;
764
    }
765
 
766
    buf_cnt_ok=0;
767
    buf_cnt_error=0;
768
    word_cnt_error=0;
769
    buf_current=0;
770
    max_bit_cnt=bit_cnt;
771
    block_mode=0;
772
 
773
    data_ex_cnt=0;
774
    data_ex_noise=1;
775
    data_ex_psd=2;
776
    data_ex_inv=0;
777
 
778
    for( int ii=0; ii<64; ii++ ) {
779
        bit_error0[ii]=0;
780
        bit_error1[ii]=0;
781
    }
782
 
783
    for( int ii=0; ii<128*4; ii++ ) {
784
        word_error[ii]=0;
785
    }
786
 
787
}
788
 
789
//! Результаты проверки группы массивов
790
/**     Функция возвращает результаты проверки массивов.
791
        Если указатель равен NULL, то он игнорируется.
792
 
793
        \param  cnt_ok          - Указатель на число правильных массивов.
794
        \param  cnt_error       - Указатель на число неправильных массивов.
795
        \param  error           - Указатель на указатель. По этому адресу
796
         передаётся указатель на word_error - список ошибок.
797
 
798
        \param  bit0            - Указатель на указатель. По этому адресу
799
         передаётся указатель на bit_error0 - число ошибочно принятых нулей по битам.
800
 
801
        \param  bit1            - Указатель на указатель. По этому адресу
802
         передаётся указатель на bit_error1 - число ошибочно принятых нулей по битам.
803
 
804
        \return Общее число ошибок.
805
 
806
*/
807
 
808
U32   TF_TestBufM2::check_result( U32 *cnt_ok, U32 *cnt_error, U32 **error, U32 **bit0, U32 **bit1 ) {
809
 
810
    if( cnt_ok ) *cnt_ok=buf_cnt_ok;
811
    if( cnt_error ) *cnt_error=buf_cnt_error;
812
    if( error ) *error=(U32*)word_error;
813
    if( bit0 )  *bit0=bit_error0;
814
    if( bit1 )  *bit1=bit_error1;
815
 
816
    return word_cnt_error;
817
}
818
 
819
//! Формирование отчёта по ошибкам
820
/**     Функция формирует отчёт по обнаруженным ошибкам и
821
        возвращает указатель на сформированную строку.
822
        Выводится номер массива, адрес в массиве,
823
        ожидаемое и полученное значение.
824
        Выводится распределение ошибок по битам для каждого слова.
825
 
826
 
827
*/
828
char*  TF_TestBufM2::report_word_error( void ) {
829
 
830
    char *ptr=str;
831
    int len;
832 6 v.karak
    //char bit[64], *ptr_bit;
833 2 dsmv
    U32 nb, na;
834
    __int64 dout, din;
835
    int size=0;
836 6 v.karak
    //U32 mask;
837 2 dsmv
    *ptr=0;
838
    int cnt=max_cnt_error;
839
    if( word_cnt_error<max_cnt_error )
840
        cnt=word_cnt_error;
841
    for( int ii=0; ii<cnt; ii++ ) {
842
        nb=word_error[ii*4+0];
843
        na=word_error[ii*4+1];
844
        dout=word_error[ii*4+2];
845
        din=word_error[ii*4+3];
846 6 v.karak
        //ptr_bit=bit;
847 2 dsmv
        /*
848
          mask=0x80000000;
849
          for( int jj=0; jj<32; jj++ ) {
850
            if( mask & (dout ^ din ) ) {
851
             *ptr_bit++='1';
852
            } else {
853
             *ptr_bit++='0';
854
            }
855
            mask>>=1;
856
            if( ((jj+1)%8)==0 ) *ptr_bit++=' ';
857
          }
858
          *ptr_bit=0;
859
          */
860
 
861
        //          len=sprintf( ptr, "%4d  Block: %-4d  Index: %.8X  Waiting: %.16LX  Receive: %.16LX \r\n",
862
        len=sprintf( ptr, "%4d  Block: %-4d  Index: %.8X  Waiting: %.16llX  Received: %.16llX \r\n",
863
                     //"                  Bits:   %s\r\n\r\n"
864
                     ii, nb, na, dout, din
865
                     //bit
866
                     );
867
        ptr+=len;
868
        size+=len;
869
        if( size>5000 ) break;
870
 
871
    }
872
    return str;
873
}
874
 
875
//! Формирование отчёта распределения ошибок по битам
876
/**     Функция формирует отчёт по обнаруженным ошибкам и
877
        возвращает указатель на сформированную строку.
878
        Выводиться число ошибок для каждого бита,
879
        число ошибочно принятых 0 и число ошибочно принятых 1.
880
 
881
*/
882
char*  TF_TestBufM2::report_bit_error( void ) {
883
 
884
    char *ptr=str;
885 6 v.karak
    //int len;
886
    //char bit[64], *ptr_bit;
887
    //U32 mask;
888 2 dsmv
    *ptr=0;
889
 
890
    return str;
891
}
892
 
893
 
894 6 v.karak
//---------------------------------------------------------------------------
895 2 dsmv
 

powered by: WebSVN 2.1.0

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