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 2

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

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

powered by: WebSVN 2.1.0

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