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] - Rev 37

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

/**     \file
        \brief Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ формирования ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ массива Π΄Π°Π½Π½Ρ‹Ρ…
 
        Π’ Ρ„Π°ΠΉΠ»Π΅ содСрТится рСализация класса TF_TestBufM2 - Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° массива Π΄Π°Π½Π½Ρ‹Ρ….
 
        \author Dmitry Smekhov
        \version 1.0
 
 
*/
 
 
#include <stdio.h>
 
#include "utypes.h"
#include "tf_testbufm2.h"
 
//! ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€
TF_TestBufM2::TF_TestBufM2() {
}
 
//! ДСструктор
TF_TestBufM2::~TF_TestBufM2() {
}
 
 
 
//! Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ массива
/**     Ѐункция ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ массива. Алгоритм формирования
        зависит ΠΎΡ‚ Π½ΠΎΠΌΠ΅Ρ€Π° n.
 
        \param  buf - ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° массив
        \param  n   - Π½ΠΎΠΌΠ΅Ρ€ Π±Π»ΠΎΠΊΠ°
        \param  size - Ρ€Π°Π·ΠΌΠ΅Ρ€ массива
		\param  mode - Ρ€Π΅ΠΆΠΈΠΌ заполнСния Π±ΠΈΡ‚ 7=1 - фиксированный Ρ‚ΠΈΠΏ Π±Π»ΠΎΠΊΠ°, 11..8 - Ρ‚ΠΈΠΏ Π±Π»ΠΎΠΊΠ°
 
*/
void	TF_TestBufM2::buf_set( U32 *buf, U32 n, U32 size, U32 mode ) 
{
    //  n%100 - Ρ‚ΠΈΠΏ Π±Π»ΠΎΠΊΠ°
    U32 ii;
 
    __int64 *ptr=(__int64*)buf;
    U32 size64 = size/2;
    __int64 data_ex = 0ULL;
    __int64 data_sig = 0ULL;
    __int64 data_ex1 = 0ULL;
    __int64 data_ex2 = 0ULL;
 
    data_sig = n;
    if( mode & 0x80 )
    {
        block_mode=(mode>>8)&0xF;
        data_sig = n;
    }
 
    data_sig <<=32;
    data_sig |=0xA5A50123;
    *ptr++ = data_sig;  //data_in = *ptr++;
 
    switch( block_mode )
    {
    case 0:  data_ex = 1; break;
    case 1:  data_ex = ~1; break;
    case 2:  data_ex = 1; break;
    case 3:  data_ex = ~1; break;
    case 4:  data_ex = 1;  data_ex2=0; break;
    case 5:  data_ex = ~1; data_ex2=0xFFFFFFFFFFFFFFFFULL;  break;
    case 6:
    case 7:  data_ex = data_ex_cnt; break;
    case 8:
    case 9:  data_ex = data_ex_noise; break;
    }
 
 
    switch( block_mode )
    {
    case 0:
    case 1:
        for( ii=1; ii<size64; ii++ )
        {
            //data_in=*ptr++;
            *ptr++=data_ex;
            {
                U32 f= (data_ex & 0x8000000000000000ULL) ? 1:0;
                data_ex <<= 1;
                data_ex &=~1;
                data_ex |=f;
            }
        }
        break;
 
         case 2:
         case 3:
 
        //data_in=*ptr++;
        *ptr++=(~data_ex);
        {
            U32 f= (data_ex & 0x8000000000000000ULL) ? 1:0;
            data_ex <<= 1;
            data_ex &=~1;
            data_ex |=f;
        }
 
        for( ii=2; ii<size64; ii+=2 )
        {
            //data_in=*ptr++;
            *ptr++=data_ex;
            *ptr++=~data_ex;
 
            {
                U32 f= (data_ex & 0x8000000000000000ULL) ? 1:0;
                data_ex <<= 1;
                data_ex &=~1;
                data_ex |=f;
            }
 
        }
        break;
 
 
         case 4:
         case 5:
        {
            int flag;
            for( ii=1; ii<size64; ii++ )
            {
                flag=( (n & 0xFF)==(ii&0xFF) )? 1 : 0;
                //data_in=*ptr++;
                data_ex1 = ( flag ) ? data_ex : data_ex2;
                *ptr++=data_ex1;
                if( flag )
                {
                    U32 f= (data_ex & 0x8000000000000000ULL) ? 1:0;
                    data_ex <<= 1;
                    data_ex &=~1;
                    data_ex |=f;
                }
            }
        }
        break;
 
 
         case 6:
         case 7:
 
        //data_in=*ptr++;
        *ptr++=~data_ex;
        //if( (~data_ex)!=data_in )
        //{
        //  cnt_err+=check( 1, ~data_ex, data_in );
        //}
        data_ex++;
 
        for( ii=2; ii<size64; ii+=2 )
        {
            //data_in=*ptr++;
            *ptr++=data_ex;
            *ptr++=~data_ex;
 
            data_ex++;
 
        }
        data_ex_cnt = data_ex;
        break;
 
 
         case 8:
         case 9:
        {
            /*
             //__int64 f63;
             //__int64 f62;
             //__int64 f60;
             //__int64 f59;
             //__int64 f0;
             U32 data_h;
             U32 f63;
             U32 f62;
             U32 f60;
             U32 f59;
             U32 f0;
            */
 
 
 
            for( ii=1; ii<size64; ii++ )
            {
                //data_in=*ptr++;
                *ptr++=data_ex;
 
                {/*
                 f63 = data_ex >> 63;
                 f62 = data_ex >> 62;
                 f60 = data_ex >> 60;
                 f59 = data_ex >> 59;
                 f0 = (f63 ^ f62 ^ f60 ^ f59)&1;
                 */
                    U32 data_h=data_ex>>32;
                    U32 f63 = data_h >> 31;
                    U32 f62 = data_h >> 30;
                    U32 f60 = data_h >> 28;
                    U32 f59 = data_h >> 27;
                    U32 f0 = (f63 ^ f62 ^ f60 ^ f59)&1;
                    //U32 data_l=data_ex;
                    //U32 f31 = (data_l>>31) & 1;
                    //data_l<<=1;
                    //data_l&=~1;
                    //data_l|=f0;
                    //data_h<<=1;
                    //data_h&=~1;
                    //data_h|=f31;
                    //data_ex=data_h;
                    //data_ex<<=32;
                    //data_ex|=data_l;
 
                    data_ex <<= 1;
                    data_ex &= ~1;
                    data_ex |=f0;
                }
 
 
 
            }
        }
 
        data_ex_noise = data_ex;
        break;
 
 
 
    }
 
    block_mode++;
    if( block_mode==10 )
        block_mode=0;
 
    buf_current++;
 
 
}
 
 
 
 
//! ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ слова Π΄Π°Π½Π½Ρ‹Ρ…
/**     Ѐункция ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ слова Π΄Π°Π½Π½Ρ‹Ρ….
        ΠŸΡ€ΠΈ нСсовпадСнии ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΈ принятого слова функция
        записываСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² массив word_error (для ΠΏΠ΅Ρ€Π²Ρ‹Ρ… ошибок -
        Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ для max_cnt_error) ΠΈ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ распрСдСлСниС
        ошибок ΠΏΠΎ Π±ΠΈΡ‚Π°ΠΌ.
 
        \param  index  НомСр слова Π² массивС
        \param  d0     ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹Π΅ сдово
        \param  di0    ΠŸΡ€ΠΈΠ½ΡΡ‚ΠΎΠ΅ слово
        \return        1 - Π΅ΡΡ‚ΡŒ ошибка, 0 - Π½Π΅Ρ‚ ошибки
 
*/
inline U32     TF_TestBufM2::check( U32 index, __int64 d0, __int64 di0 ) {
 
    U32 flag_error=0;
    //if( d0!=di0 )
    {
        flag_error=1;
        // Π—Π°ΠΏΠΈΡΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± ошибкС
 
        if( word_cnt_error<max_cnt_error ) {
            word_error[ word_cnt_error*4+0 ]=buf_current;
            word_error[ word_cnt_error*4+1 ]=index;
            word_error[ word_cnt_error*4+2 ]=d0;
            word_error[ word_cnt_error*4+3 ]=di0;
 
        }
 
        word_cnt_error++;
        /*
                if( max_bit_cnt>0 ) {           // ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ распрСдСлСния ΠΏΠΎ Π±ΠΈΡ‚Π°ΠΌ
                U32 jj;
                U32 mask=1;
                 for( jj=0; jj<32; jj++ ) {
                    if( (d0&mask)!=(di0&mask) ) {
                      if( max_bit_cnt<=32 ) {
                        if( (di0&mask)==0 )
                         bit_error0[jj%max_bit_cnt]++;
                        else
                         bit_error1[jj%max_bit_cnt]++;
                      } else {
                        if( (di0&mask)==0 )
                         bit_error0[jj+32*(index&1)]++;
                        else
                         bit_error1[jj+32*(index&1)]++;
                      }
 
                    }
                 }
                }
                */
    }
    return flag_error;
}
 
 
 
 
//! ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° массива
/**     Ѐункция провСряСт массив buf Π½Π° соотвСтствиС ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ.
        Массив Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ сформирован Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ buf_set ΠΈΠ»ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠΉ
        ΠŸΡ€ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ ошибки Π² массив word_error Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ числа:
                - Π½ΠΎΠΌΠ΅Ρ€ массива
                - индСкс в массивк
                - ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅
                - ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅
        Π’ массивы bit_error0 ΠΈ bit_error1 заносится распрСдСлСниС ошибок ΠΏΠΎ Π±ΠΈΡ‚Π°ΠΌ.
 
        \param  buf     - АдрСс массива
        \param  n       - НомСр массива
        \param  size    - Π Π°Π·ΠΌΠ΅Ρ€ массива Π² 32-Ρ… разрядных словах
        \param  mode    - Π Π΅ΠΆΠΈΠΌ формирвоания Π±Π»ΠΎΠΊΠ°: Π±ΠΈΡ‚ 7=1 - ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ установки, 11..8 - Ρ‚ΠΈΠΏ
 
        \return Число ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… ошибок
 
*/
U32     TF_TestBufM2::buf_check( U32 *buf, U32 n, U32 size, U32 mode ) {
 
    //  n%100 - Ρ‚ΠΈΠΏ Π±Π»ΠΎΠΊΠ°
    U32 ii;
    U32 cnt_err=0;
 
    __int64 *ptr=(__int64*)buf;
    U32 size64 = size/2;
    __int64 data_ex = 0ULL;
    __int64 data_in = 0ULL;
    __int64 data_sig = 0ULL;
    __int64 data_ex1 = 0ULL;
    __int64 data_ex2 = 0ULL;
 
    data_sig = n;
    if( mode & 0x80 )
    {
        block_mode=(mode>>8)&0xF;
        data_sig = n;
    }
 
    data_sig <<=32;
    data_sig |=0xA5A50123;
    data_in = *ptr++;
    if( data_sig!=data_in )
    {
        cnt_err+=check( 0, data_sig, data_in );
    }
 
    /*
	  when "0000" => -- БСгущая 1 ΠΏΠΎ 64-ΠΌ разрядам
			  	data_ex0 <= x"0000000000000001" after 1 ns;
			  when "0001" => -- Π‘Π΅Π³ΡƒΡ‰ΠΈΠΉ 0 ΠΏΠΎ 64-ΠΌ разрядам
			  	data_ex0 <= not x"0000000000000001" after 1 ns;
			  when "0010" => -- БСгущая 1 с инвСрсиСй  ΠΏΠΎ 64-ΠΌ разрядам
			  	data_ex1 <= x"0000000000000001" after 1 ns;
			  when "0011" => -- Π‘Π΅Π³ΡƒΡ‰ΠΈΠΉ 0 с инвСрсиСй  ΠΏΠΎ 64-ΠΌ разрядам
			  	data_ex1 <= not x"0000000000000001" after 1 ns;
			  when "0100" => -- БСгущая 1 Π² Π±Π»ΠΎΠΊΠ΅ 0
			  	data_ex2 <= x"0000000000000001" after 1 ns;
			  	data_ex3 <= (others=>'0');
			  when "0101" => -- Π‘Π΅Π³ΡƒΡ‰ΠΈΠΉ 0 Π² Π±Π»ΠΎΠΊΠ΅ 1
			  	data_ex2 <= not x"0000000000000001" after 1 ns;
			  	data_ex3 <= (others=>'1') after 1 ns;
           */
    switch( block_mode )
    {
    case 0:  data_ex = 1; break;
    case 1:  data_ex = ~1; break;
    case 2:  data_ex = 1; break;
    case 3:  data_ex = ~1; break;
    case 4:  data_ex = 1;  data_ex2=0; break;
    case 5:  data_ex = ~1; data_ex2=0xFFFFFFFFFFFFFFFFULL;  break;
    case 6:
    case 7:  data_ex = data_ex_cnt; break;
    case 8:
    case 9:  data_ex = data_ex_noise; break;
    }
 
 
    switch( block_mode )
    {
    case 0:
    case 1:
        for( ii=1; ii<size64; ii++ )
        {
            data_in=*ptr++;
            if( data_ex!=data_in )
            {
                cnt_err+=check( ii, data_ex, data_in );
                //cnt_err=0;
            }
            {
                U32 f= (data_ex & 0x8000000000000000ULL) ? 1:0;
                data_ex <<= 1;
                data_ex &=~1;
                data_ex |=f;
            }
        }
        break;
 
         case 2:
         case 3:
 
        data_in=*ptr++;
        if( (~data_ex)!=data_in )
        {
            cnt_err+=check( 1, ~data_ex, data_in );
        }
        {
            U32 f= (data_ex & 0x8000000000000000ULL) ? 1:0;
            data_ex <<= 1;
            data_ex &=~1;
            data_ex |=f;
        }
 
        for( ii=2; ii<size64; ii+=2 )
        {
            data_in=*ptr++;
            if( data_ex!=data_in )
            {
                cnt_err+=check( ii, data_ex, data_in );
                //cnt_err=0;
            }
 
 
            data_in=*ptr++;
            if( (~data_ex)!=data_in )
            {
                cnt_err+=check( ii+1, ~data_ex, data_in );
            }
 
 
            {
                U32 f= (data_ex & 0x8000000000000000ULL) ? 1:0;
                data_ex <<= 1;
                data_ex &=~1;
                data_ex |=f;
            }
 
        }
        break;
 
 
         case 4:
         case 5:
        {
            int flag;
            for( ii=1; ii<size64; ii++ )
            {
                flag=( (n & 0xFF)==(ii&0xFF) )? 1 : 0;
                data_in=*ptr++;
                data_ex1 = ( flag ) ? data_ex : data_ex2;
                if( data_ex1!=data_in )
                {
                    cnt_err+=check( ii, data_ex1, data_in );
                    //cnt_err=0;
                }
                if( flag )
                {
                    U32 f= (data_ex & 0x8000000000000000ULL) ? 1:0;
                    data_ex <<= 1;
                    data_ex &=~1;
                    data_ex |=f;
                }
            }
        }
        break;
 
 
         case 6:
         case 7:
 
        data_in=*ptr++;
        if( (~data_ex)!=data_in )
        {
            cnt_err+=check( 1, ~data_ex, data_in );
        }
        data_ex++;
 
        for( ii=2; ii<size64; ii+=2 )
        {
            data_in=*ptr++;
            if( data_ex!=data_in )
            {
                cnt_err+=check( ii, data_ex, data_in );
                //cnt_err=0;
            }
 
 
            data_in=*ptr++;
            if( (~data_ex)!=data_in )
            {
                cnt_err+=check( ii+1, ~data_ex, data_in );
            }
 
            data_ex++;
 
        }
        data_ex_cnt = data_ex;
        break;
 
 
         case 8:
         case 9:
        {
            /*
             //__int64 f63;
             //__int64 f62;
             //__int64 f60;
             //__int64 f59;
             //__int64 f0;
             U32 data_h;
             U32 f63;
             U32 f62;
             U32 f60;
             U32 f59;
             U32 f0;
            */
 
 
 
            for( ii=1; ii<size64; ii++ )
            {
                data_in=*ptr++;
 
                if( data_ex!=data_in )
                {
                    cnt_err+=check( ii, data_ex, data_in );
                }
 
                {/*
                 f63 = data_ex >> 63;
                 f62 = data_ex >> 62;
                 f60 = data_ex >> 60;
                 f59 = data_ex >> 59;
                 f0 = (f63 ^ f62 ^ f60 ^ f59)&1;
                 */
                    U32 data_h=data_ex>>32;
                    U32 f63 = data_h >> 31;
                    U32 f62 = data_h >> 30;
                    U32 f60 = data_h >> 28;
                    U32 f59 = data_h >> 27;
                    U32 f0 = (f63 ^ f62 ^ f60 ^ f59)&1;
                    //U32 data_l=data_ex;
                    //U32 f31 = (data_l>>31) & 1;
                    //data_l<<=1;
                    //data_l&=~1;
                    //data_l|=f0;
                    //data_h<<=1;
                    //data_h&=~1;
                    //data_h|=f31;
                    //data_ex=data_h;
                    //data_ex<<=32;
                    //data_ex|=data_l;
 
                    data_ex <<= 1;
                    data_ex &= ~1;
                    data_ex |=f0;
                }
 
 
 
            }
        }
 
        data_ex_noise = data_ex;
        break;
 
 
 
    }
 
    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;
 
}
 
 
//! ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° массива
/**     Ѐункция провСряСт массив buf Π½Π° соотвСтствиС ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ.
        Массив Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ сформирован Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ buf_set ΠΈΠ»ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠΉ
        ΠŸΡ€ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ ошибки Π² массив word_error Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ числа:
                - Π½ΠΎΠΌΠ΅Ρ€ массива
                - индСкс в массивк
                - ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅
                - ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅
        Π’ массивы bit_error0 ΠΈ bit_error1 заносится распрСдСлСниС ошибок ΠΏΠΎ Π±ΠΈΡ‚Π°ΠΌ.
 
		ΠžΠΆΠΈΠ΄Π°Π΅Ρ‚ΡΡ псСвдослучайная ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. ΠΠ°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 2;
		Π‘ΠΈΠ³Π½Π°Ρ‚ΡƒΡ€Ρ‹ ΠΈ Π½ΠΎΠΌΠ΅Ρ€Π° Π±Π»ΠΎΠΊΠ° Π½Π΅ оТидаСтся.
 
        \param  buf     - АдрСс массива
        \param  size    - Π Π°Π·ΠΌΠ΅Ρ€ массива Π² 32-Ρ… разрядных словах
 
        \return Число ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… ошибок
 
*/
U32     TF_TestBufM2::buf_check_psd( 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;
 
    data_ex = data_ex_psd ;
 
 
    for( ii=0; ii<size64; ii++ )
    {
        data_in=*ptr++;
 
        if( 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;
        }
 
        {/*
             f63 = data_ex >> 63;
             f62 = data_ex >> 62;
             f60 = data_ex >> 60;
             f59 = data_ex >> 59;
             f0 = (f63 ^ f62 ^ f60 ^ f59)&1;
             */
 
            U32 data_h=data_ex>>32;
            U32 f63 = data_h >> 31;
            U32 f62 = data_h >> 30;
            U32 f60 = data_h >> 28;
            U32 f59 = data_h >> 27;
            U32 f0 = (f63 ^ f62 ^ f60 ^ f59)&1;
 
            //U32 data_l=data_ex;
            //U32 f31 = (data_l>>31) & 1;
            //data_l<<=1;
            //data_l&=~1;
            //data_l|=f0;
            //data_h<<=1;
            //data_h&=~1;
            //data_h|=f31;
            //data_ex=data_h;
            //data_ex<<=32;
            //data_ex|=data_l;
 
            data_ex <<= 1;
            data_ex &= ~1;
            data_ex |=f0;
        }
 
 
 
    }
 
    data_ex_psd = 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;
 
}
 
//! ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π΄Π²ΠΎΠΈΡ‡Π½ΠΎ-инвСрсной ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ
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;
 
}
 
//! Начало ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹ массивов
/**     Ѐункция ΠΏΠΎΠ΄Π³ΠΎΡ‚Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… массивов.
        ΠžΠ±Π½ΡƒΠ»ΡΡŽΡ‚ΡΡ счётчики ошибок.
 
        \param  n_error - число фиксируСмых ошибок. НС большС 128.
        \param  bit_cnt - Число Π±ΠΈΡ‚ Π² словС, для опрСдСлСния распрСдСлСния ошибок ΠΏΠΎ Π±ΠΈΡ‚Π°ΠΌ.
 
 
*/
void  TF_TestBufM2::buf_check_start( U32 n_error, U32 bit_cnt ) {
 
    if( n_error<32 ) {
        max_cnt_error=n_error;
    } else {
        max_cnt_error=32;
    }
 
    buf_cnt_ok=0;
    buf_cnt_error=0;
    word_cnt_error=0;
    buf_current=0;
    max_bit_cnt=bit_cnt;
    block_mode=0;
 
    data_ex_cnt=0;
    data_ex_noise=1;
    data_ex_psd=2;
    data_ex_inv=0;
 
    for( int ii=0; ii<64; ii++ ) {
        bit_error0[ii]=0;
        bit_error1[ii]=0;
    }
 
    for( int ii=0; ii<128*4; ii++ ) {
        word_error[ii]=0;
    }
 
}
 
//! Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹ массивов
/**     Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ массивов.
        Если ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ€Π°Π²Π΅Π½ NULL, Ρ‚ΠΎ ΠΎΠ½ игнорируСтся.
 
        \param  cnt_ok          - Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° число ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ… массивов.
        \param  cnt_error       - Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° число Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ… массивов.
        \param  error           - Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ. По этому адрСсу
         пСрСдаётся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° word_error - список ошибок.
 
        \param  bit0            - Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ. По этому адрСсу
         пСрСдаётся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° bit_error0 - число ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎ принятых Π½ΡƒΠ»Π΅ΠΉ ΠΏΠΎ Π±ΠΈΡ‚Π°ΠΌ.
 
        \param  bit1            - Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ. По этому адрСсу
         пСрСдаётся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° bit_error1 - число ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎ принятых Π½ΡƒΠ»Π΅ΠΉ ΠΏΠΎ Π±ΠΈΡ‚Π°ΠΌ.
 
        \return ΠžΠ±Ρ‰Π΅Π΅ число ошибок.
 
*/
 
U32   TF_TestBufM2::check_result( U32 *cnt_ok, U32 *cnt_error, U32 **error, U32 **bit0, U32 **bit1 ) {
 
    if( cnt_ok ) *cnt_ok=buf_cnt_ok;
    if( cnt_error ) *cnt_error=buf_cnt_error;
    if( error ) *error=(U32*)word_error;
    if( bit0 )  *bit0=bit_error0;
    if( bit1 )  *bit1=bit_error1;
 
    return word_cnt_error;
}
 
//! Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π° ΠΏΠΎ ошибкам
/**     Ѐункция Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΡ‚Ρ‡Ρ‘Ρ‚ ΠΏΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΌ ошибкам ΠΈ
        Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ строку.
        Выводится Π½ΠΎΠΌΠ΅Ρ€ массива, адрСс Π² массивС,
        ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.
        Выводится распрСдСлСниС ошибок ΠΏΠΎ Π±ΠΈΡ‚Π°ΠΌ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ слова.
 
 
*/
char*  TF_TestBufM2::report_word_error( void ) {
 
    char *ptr=str;
    int len;
    //char bit[64], *ptr_bit;
    U32 nb, na;
    __int64 dout, din;
    int size=0;
    //U32 mask;
    *ptr=0;
    int cnt=max_cnt_error;
    if( word_cnt_error<max_cnt_error )
        cnt=word_cnt_error;
    for( int ii=0; ii<cnt; ii++ ) {
        nb=word_error[ii*4+0];
        na=word_error[ii*4+1];
        dout=word_error[ii*4+2];
        din=word_error[ii*4+3];
        //ptr_bit=bit;
        /*
          mask=0x80000000;
          for( int jj=0; jj<32; jj++ ) {
            if( mask & (dout ^ din ) ) {
             *ptr_bit++='1';
            } else {
             *ptr_bit++='0';
            }
            mask>>=1;
            if( ((jj+1)%8)==0 ) *ptr_bit++=' ';
          }
          *ptr_bit=0;
          */
 
        //          len=sprintf( ptr, "%4d  Block: %-4d  Index: %.8X  Waiting: %.16LX  Receive: %.16LX \r\n",
        len=sprintf( ptr, "%4d  Block: %-4d  Index: %.8X  Waiting: %.16llX  Received: %.16llX \r\n",
                     //"                  Bits:   %s\r\n\r\n"
                     ii, nb, na, dout, din
                     //bit
                     );
        ptr+=len;
        size+=len;
        if( size>5000 ) break;
 
    }
    return str;
}
 
//! Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π° распрСдСлСния ошибок ΠΏΠΎ Π±ΠΈΡ‚Π°ΠΌ
/**     Ѐункция Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΡ‚Ρ‡Ρ‘Ρ‚ ΠΏΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΌ ошибкам ΠΈ
        Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ строку.
        Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ число ошибок для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π°,
        число ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎ принятых 0 ΠΈ число ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎ принятых 1.
 
*/
char*  TF_TestBufM2::report_bit_error( void ) {
 
    char *ptr=str;
    //int len;
    //char bit[64], *ptr_bit;
    //U32 mask;
    *ptr=0;
 
    return str;
}
 
 
//---------------------------------------------------------------------------
 
 

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

powered by: WebSVN 2.1.0

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