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] - Diff between revs 2 and 6

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 2 Rev 6
Line 1... Line 1...
/**     \file
/**     \file
 
        \brief Функции формирования и проверки массива данных
 
 
 
        В файле содержится реализация класса TF_TestBufM2 - формирование и проверка массива данных.
 
 
 
        \author Dmitry Smekhov
 
        \version 1.0
 
 
 
 
*/
*/
 
 
 
 
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
 
#include <math.h>
 
 
 
#include "utypes.h"
#include "utypes.h"
#include "tf_testbufm2.h"
#include "tf_testbufm2.h"
 
 
//! Конструктор
//! Конструктор
Line 31... Line 37...
*/
*/
void    TF_TestBufM2::buf_set( U32 *buf, U32 n, U32 size, U32 mode )
void    TF_TestBufM2::buf_set( U32 *buf, U32 n, U32 size, U32 mode )
{
{
    //  n%100 - тип блока
    //  n%100 - тип блока
    U32 ii;
    U32 ii;
    //U32 di0, di1;
 
    //U32 cnt_err=0;
 
 
 
    __int64 *ptr=(__int64*)buf;
    __int64 *ptr=(__int64*)buf;
    U32 size64 = size/2;
    U32 size64 = size/2;
    __int64 data_ex;
    __int64 data_ex = 0ULL;
    //__int64 data_in;
    __int64 data_sig = 0ULL;
    __int64 data_sig;
    __int64 data_ex1 = 0ULL;
    __int64 data_ex1;
    __int64 data_ex2 = 0ULL;
    __int64 data_ex2;
 
 
 
    data_sig = n;
    data_sig = n;
    if( mode & 0x80 )
    if( mode & 0x80 )
    {
    {
        block_mode=(mode>>8)&0xF;
        block_mode=(mode>>8)&0xF;
Line 60... Line 63...
    case 0:  data_ex = 1; break;
    case 0:  data_ex = 1; break;
    case 1:  data_ex = ~1; break;
    case 1:  data_ex = ~1; break;
    case 2:  data_ex = 1; break;
    case 2:  data_ex = 1; break;
    case 3:  data_ex = ~1; break;
    case 3:  data_ex = ~1; break;
    case 4:  data_ex = 1;  data_ex2=0; break;
    case 4:  data_ex = 1;  data_ex2=0; break;
    case 5:  data_ex = ~1; data_ex2=0xFFFFFFFFFFFFFFFFLL;  break;
    case 5:  data_ex = ~1; data_ex2=0xFFFFFFFFFFFFFFFFULL;  break;
    case 6:
    case 6:
    case 7:  data_ex = data_ex_cnt; break;
    case 7:  data_ex = data_ex_cnt; break;
    case 8:
    case 8:
    case 9:  data_ex = data_ex_noise; break;
    case 9:  data_ex = data_ex_noise; break;
    }
    }
Line 77... Line 80...
        for( ii=1; ii<size64; ii++ )
        for( ii=1; ii<size64; ii++ )
        {
        {
            //data_in=*ptr++;
            //data_in=*ptr++;
            *ptr++=data_ex;
            *ptr++=data_ex;
            {
            {
                U32 f= (data_ex & 0x8000000000000000LL) ? 1:0;
                U32 f= (data_ex & 0x8000000000000000ULL) ? 1:0;
                data_ex <<= 1;
                data_ex <<= 1;
                data_ex &=~1;
                data_ex &=~1;
                data_ex |=f;
                data_ex |=f;
            }
            }
        }
        }
Line 91... Line 94...
         case 3:
         case 3:
 
 
        //data_in=*ptr++;
        //data_in=*ptr++;
        *ptr++=(~data_ex);
        *ptr++=(~data_ex);
        {
        {
            U32 f= (data_ex & 0x8000000000000000LL) ? 1:0;
            U32 f= (data_ex & 0x8000000000000000ULL) ? 1:0;
            data_ex <<= 1;
            data_ex <<= 1;
            data_ex &=~1;
            data_ex &=~1;
            data_ex |=f;
            data_ex |=f;
        }
        }
 
 
Line 104... Line 107...
            //data_in=*ptr++;
            //data_in=*ptr++;
            *ptr++=data_ex;
            *ptr++=data_ex;
            *ptr++=~data_ex;
            *ptr++=~data_ex;
 
 
            {
            {
                U32 f= (data_ex & 0x8000000000000000LL) ? 1:0;
                U32 f= (data_ex & 0x8000000000000000ULL) ? 1:0;
                data_ex <<= 1;
                data_ex <<= 1;
                data_ex &=~1;
                data_ex &=~1;
                data_ex |=f;
                data_ex |=f;
            }
            }
 
 
Line 126... Line 129...
                //data_in=*ptr++;
                //data_in=*ptr++;
                data_ex1 = ( flag ) ? data_ex : data_ex2;
                data_ex1 = ( flag ) ? data_ex : data_ex2;
                *ptr++=data_ex1;
                *ptr++=data_ex1;
                if( flag )
                if( flag )
                {
                {
                    U32 f= (data_ex & 0x8000000000000000LL) ? 1:0;
                    U32 f= (data_ex & 0x8000000000000000ULL) ? 1:0;
                    data_ex <<= 1;
                    data_ex <<= 1;
                    data_ex &=~1;
                    data_ex &=~1;
                    data_ex |=f;
                    data_ex |=f;
                }
                }
            }
            }
Line 323... Line 326...
    U32 ii;
    U32 ii;
    U32 cnt_err=0;
    U32 cnt_err=0;
 
 
    __int64 *ptr=(__int64*)buf;
    __int64 *ptr=(__int64*)buf;
    U32 size64 = size/2;
    U32 size64 = size/2;
    __int64 data_ex;
    __int64 data_ex = 0ULL;
    __int64 data_in;
    __int64 data_in = 0ULL;
    __int64 data_sig;
    __int64 data_sig = 0ULL;
    __int64 data_ex1;
    __int64 data_ex1 = 0ULL;
    __int64 data_ex2;
    __int64 data_ex2 = 0ULL;
 
 
    data_sig = n;
    data_sig = n;
    if( mode & 0x80 )
    if( mode & 0x80 )
    {
    {
        block_mode=(mode>>8)&0xF;
        block_mode=(mode>>8)&0xF;
Line 367... Line 370...
    case 0:  data_ex = 1; break;
    case 0:  data_ex = 1; break;
    case 1:  data_ex = ~1; break;
    case 1:  data_ex = ~1; break;
    case 2:  data_ex = 1; break;
    case 2:  data_ex = 1; break;
    case 3:  data_ex = ~1; break;
    case 3:  data_ex = ~1; break;
    case 4:  data_ex = 1;  data_ex2=0; break;
    case 4:  data_ex = 1;  data_ex2=0; break;
    case 5:  data_ex = ~1; data_ex2=0xFFFFFFFFFFFFFFFFLL;  break;
    case 5:  data_ex = ~1; data_ex2=0xFFFFFFFFFFFFFFFFULL;  break;
    case 6:
    case 6:
    case 7:  data_ex = data_ex_cnt; break;
    case 7:  data_ex = data_ex_cnt; break;
    case 8:
    case 8:
    case 9:  data_ex = data_ex_noise; break;
    case 9:  data_ex = data_ex_noise; break;
    }
    }
Line 388... Line 391...
            {
            {
                cnt_err+=check( ii, data_ex, data_in );
                cnt_err+=check( ii, data_ex, data_in );
                //cnt_err=0;
                //cnt_err=0;
            }
            }
            {
            {
                U32 f= (data_ex & 0x8000000000000000LL) ? 1:0;
                U32 f= (data_ex & 0x8000000000000000ULL) ? 1:0;
                data_ex <<= 1;
                data_ex <<= 1;
                data_ex &=~1;
                data_ex &=~1;
                data_ex |=f;
                data_ex |=f;
            }
            }
        }
        }
Line 405... Line 408...
        if( (~data_ex)!=data_in )
        if( (~data_ex)!=data_in )
        {
        {
            cnt_err+=check( 1, ~data_ex, data_in );
            cnt_err+=check( 1, ~data_ex, data_in );
        }
        }
        {
        {
            U32 f= (data_ex & 0x8000000000000000LL) ? 1:0;
            U32 f= (data_ex & 0x8000000000000000ULL) ? 1:0;
            data_ex <<= 1;
            data_ex <<= 1;
            data_ex &=~1;
            data_ex &=~1;
            data_ex |=f;
            data_ex |=f;
        }
        }
 
 
Line 429... Line 432...
                cnt_err+=check( ii+1, ~data_ex, data_in );
                cnt_err+=check( ii+1, ~data_ex, data_in );
            }
            }
 
 
 
 
            {
            {
                U32 f= (data_ex & 0x8000000000000000LL) ? 1:0;
                U32 f= (data_ex & 0x8000000000000000ULL) ? 1:0;
                data_ex <<= 1;
                data_ex <<= 1;
                data_ex &=~1;
                data_ex &=~1;
                data_ex |=f;
                data_ex |=f;
            }
            }
 
 
Line 455... Line 458...
                    cnt_err+=check( ii, data_ex1, data_in );
                    cnt_err+=check( ii, data_ex1, data_in );
                    //cnt_err=0;
                    //cnt_err=0;
                }
                }
                if( flag )
                if( flag )
                {
                {
                    U32 f= (data_ex & 0x8000000000000000LL) ? 1:0;
                    U32 f= (data_ex & 0x8000000000000000ULL) ? 1:0;
                    data_ex <<= 1;
                    data_ex <<= 1;
                    data_ex &=~1;
                    data_ex &=~1;
                    data_ex |=f;
                    data_ex |=f;
                }
                }
            }
            }
Line 588... Line 591...
//! Проверка массива
//! Проверка массива
/**     Функция проверяет массив buf на соответствие ожидаемым данным.
/**     Функция проверяет массив buf на соответствие ожидаемым данным.
        Массив должен быть сформирован функцией buf_set или аналогичной
        Массив должен быть сформирован функцией buf_set или аналогичной
        При обнаружении ошибки в массив word_error записываются четыре числа:
        При обнаружении ошибки в массив word_error записываются четыре числа:
                - номер массива
                - номер массива
                - индекс в массиве
                - индекс в массивк
                - ожидаемые данные
                - ожидаемые данные
                - полученные данные
                - полученные данные
        В массивы bit_error0 и bit_error1 заносится распределение ошибок по битам.
        В массивы bit_error0 и bit_error1 заносится распределение ошибок по битам.
 
 
                Ожидается псевдослучайная последовательность. Начальное значение 2;
                Ожидается псевдослучайная последовательность. Начальное значение 2;
Line 614... Line 617...
    __int64 *ptr=(__int64*)buf;
    __int64 *ptr=(__int64*)buf;
    U32 size64 = size/2;
    U32 size64 = size/2;
    __int64 data_ex;
    __int64 data_ex;
    __int64 data_in;
    __int64 data_in;
 
 
 
 
    data_ex = data_ex_psd ;
    data_ex = data_ex_psd ;
 
 
 
 
    for( ii=0; ii<size64; ii++ )
    for( ii=0; ii<size64; ii++ )
    {
    {
        data_in=*ptr++;
        data_in=*ptr++;
 
 
        if( data_ex!=data_in )
        if( data_ex!=data_in )
        {
        {
            cnt_err+=check( ii, data_ex, data_in );
            if( word_cnt_error<max_cnt_error )
 
            {
 
                word_error[ word_cnt_error*4+0 ]=buf_current;
 
                word_error[ word_cnt_error*4+1 ]=ii;
 
                word_error[ word_cnt_error*4+2 ]=data_ex;
 
                word_error[ word_cnt_error*4+3 ]=data_in;
 
            }
 
            word_cnt_error++;
 
            cnt_err++;
 
            //cnt_err+=check( ii, data_ex, data_in );
            data_ex=data_in;
            data_ex=data_in;
        }
        }
 
 
        {/*
        {/*
             f63 = data_ex >> 63;
             f63 = data_ex >> 63;
             f62 = data_ex >> 62;
             f62 = data_ex >> 62;
             f60 = data_ex >> 60;
             f60 = data_ex >> 60;
             f59 = data_ex >> 59;
             f59 = data_ex >> 59;
             f0 = (f63 ^ f62 ^ f60 ^ f59)&1;
             f0 = (f63 ^ f62 ^ f60 ^ f59)&1;
             */
             */
 
 
            U32 data_h=data_ex>>32;
            U32 data_h=data_ex>>32;
            U32 f63 = data_h >> 31;
            U32 f63 = data_h >> 31;
            U32 f62 = data_h >> 30;
            U32 f62 = data_h >> 30;
            U32 f60 = data_h >> 28;
            U32 f60 = data_h >> 28;
            U32 f59 = data_h >> 27;
            U32 f59 = data_h >> 27;
            U32 f0 = (f63 ^ f62 ^ f60 ^ f59)&1;
            U32 f0 = (f63 ^ f62 ^ f60 ^ f59)&1;
 
 
            //U32 data_l=data_ex;
            //U32 data_l=data_ex;
            //U32 f31 = (data_l>>31) & 1;
            //U32 f31 = (data_l>>31) & 1;
            //data_l<<=1;
            //data_l<<=1;
            //data_l&=~1;
            //data_l&=~1;
            //data_l|=f0;
            //data_l|=f0;
Line 678... Line 691...
 
 
    return cnt_err;
    return cnt_err;
 
 
}
}
 
 
 
//! Проверка двоично-инверсной последовательности
 
U32     TF_TestBufM2::buf_check_inv( U32 *buf, U32 size  )
 
{
 
 
 
    //  n%100 - тип блока
 
    U32 ii;
 
    U32 cnt_err=0;
 
 
 
    __int64 *ptr=(__int64*)buf;
 
    U32 size64 = size/2;
 
    __int64 data_ex;
 
    __int64 data_in;
 
 
 
    register unsigned f0;
 
 
 
 
 
    data_ex = data_ex_inv ;
 
 
 
 
 
    for( ii=0; ii<size64; ii++ )
 
    {
 
        data_in=*ptr++;
 
 
 
        if( data_ex!=data_in )
 
        {
 
            cnt_err+=check( ii, data_ex, data_in );
 
            //data_ex=data_in;
 
        }
 
 
 
        //data_h=data_ex>>32; f63 = data_h >> 31; f0 = f63^1; data_ex <<= 1; data_ex &= ~1; data_ex |=f0;
 
        f0 = ((data_ex >>63) & 1) ^1; data_ex <<= 1; data_ex &= ~1; data_ex |=f0;
 
 
 
 
 
 
 
 
 
    }
 
 
 
    data_ex_inv = data_ex;
 
 
 
    block_mode++;
 
    if( block_mode==10 )
 
        block_mode=0;
 
 
 
    buf_current++;
 
    if (cnt_err==0)
 
        buf_cnt_ok++;
 
    else
 
        buf_cnt_error++;
 
 
 
    return cnt_err;
 
 
 
}
 
 
//! Начало проверки группы массивов
//! Начало проверки группы массивов
/**     Функция подготавливает параметры для проверки нескольких массивов.
/**     Функция подготавливает параметры для проверки нескольких массивов.
        Обнуляются счётчики ошибок.
        Обнуляются счётчики ошибок.
 
 
Line 762... Line 827...
*/
*/
char*  TF_TestBufM2::report_word_error( void ) {
char*  TF_TestBufM2::report_word_error( void ) {
 
 
    char *ptr=str;
    char *ptr=str;
    int len;
    int len;
    char bit[64], *ptr_bit;
    //char bit[64], *ptr_bit;
    U32 nb, na;
    U32 nb, na;
    __int64 dout, din;
    __int64 dout, din;
    int size=0;
    int size=0;
 
    //U32 mask;
    *ptr=0;
    *ptr=0;
    int cnt=max_cnt_error;
    int cnt=max_cnt_error;
    if( word_cnt_error<max_cnt_error )
    if( word_cnt_error<max_cnt_error )
        cnt=word_cnt_error;
        cnt=word_cnt_error;
    for( int ii=0; ii<cnt; ii++ ) {
    for( int ii=0; ii<cnt; ii++ ) {
        nb=word_error[ii*4+0];
        nb=word_error[ii*4+0];
        na=word_error[ii*4+1];
        na=word_error[ii*4+1];
        dout=word_error[ii*4+2];
        dout=word_error[ii*4+2];
        din=word_error[ii*4+3];
        din=word_error[ii*4+3];
        ptr_bit=bit;
        //ptr_bit=bit;
        /*
        /*
          mask=0x80000000;
          mask=0x80000000;
          for( int jj=0; jj<32; jj++ ) {
          for( int jj=0; jj<32; jj++ ) {
            if( mask & (dout ^ din ) ) {
            if( mask & (dout ^ din ) ) {
             *ptr_bit++='1';
             *ptr_bit++='1';
Line 814... Line 880...
 
 
*/
*/
char*  TF_TestBufM2::report_bit_error( void ) {
char*  TF_TestBufM2::report_bit_error( void ) {
 
 
    char *ptr=str;
    char *ptr=str;
 
    //int len;
 
    //char bit[64], *ptr_bit;
 
    //U32 mask;
    *ptr=0;
    *ptr=0;
 
 
    return str;
    return str;
}
}
 
 
//! Проверка двоично-инверсной последовательности
 
U32     TF_TestBufM2::buf_check_inv( U32 *buf, U32 size  )
 
{
 
 
 
    //  n%100 - тип блока
 
    U32 ii;
 
    U32 cnt_err=0;
 
 
 
    __int64 *ptr=(__int64*)buf;
 
    U32 size64 = size/2;
 
    __int64 data_ex;
 
    __int64 data_in;
 
 
 
    register unsigned f0;
 
 
 
 
 
    data_ex = data_ex_inv ;
 
 
 
 
 
    for( ii=0; ii<size64; ii++ )
 
    {
 
        data_in=*ptr++;
 
 
 
        if( data_ex!=data_in )
 
        {
 
            cnt_err+=check( ii, data_ex, data_in );
 
            //data_ex=data_in;
 
        }
 
 
 
        //data_h=data_ex>>32; f63 = data_h >> 31; f0 = f63^1; data_ex <<= 1; data_ex &= ~1; data_ex |=f0;
 
        f0 = ((data_ex >>63) & 1) ^1; data_ex <<= 1; data_ex &= ~1; data_ex |=f0;
 
 
 
 
 
 
 
 
 
    }
 
 
 
    data_ex_inv = data_ex;
 
 
 
    block_mode++;
 
    if( block_mode==10 )
 
        block_mode=0;
 
 
 
    buf_current++;
 
    if (cnt_err==0)
 
        buf_cnt_ok++;
 
    else
 
        buf_cnt_error++;
 
 
 
    return cnt_err;
 
 
 
}
 
 
 
 
 
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
 
 
 No newline at end of file
 No newline at end of file
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

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