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

Subversion Repositories pcie_ds_dma

[/] [pcie_ds_dma/] [trunk/] [projects/] [ac701_a200t_core/] [src/] [testbench/] [test_pkg.vhd] - Diff between revs 49 and 50

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 49 Rev 50
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
--
--
-- Title       : test_pkg.vhd
-- Title       : test_pkg.vhd
-- Author      : Dmitry Smekhov 
-- Author      : Dmitry Smekhov 
-- Company     : Instrumental System
-- Company     : Instrumental System
--      
--      
-- Version     : 1.0                     
-- Version     : 1.0                     
--
--
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
--
--
-- Description : Пакет для тестирования ambpex5.
-- Description : Пакет для тестирования ambpex5.
--
--
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
 
 
 
 
library ieee;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_textio.all;
use ieee.std_logic_textio.all;
use std.textio.all;
use std.textio.all;
 
 
 
 
library work;
library work;
use work.cmd_sim_pkg.all;
use work.cmd_sim_pkg.all;
use work.block_pkg.all;
use work.block_pkg.all;
use work.trd_pkg.all;
use work.trd_pkg.all;
 
 
 
 
 
 
package test_pkg is
package test_pkg is
 
 
--! Инициализация теста 
--! Инициализация теста 
procedure test_init(
procedure test_init(
                fname: in string        --! имя файла отчёта
                fname: in string        --! имя файла отчёта
        );
        );
 
 
--! Завершение теста            
--! Завершение теста            
procedure test_close;
procedure test_close;
 
 
 
 
 
 
--! Запуск DMA с неправильным дескриптором 
--! Запуск DMA с неправильным дескриптором 
procedure test_dsc_incorrect (
procedure test_dsc_incorrect (
                signal  cmd:    out bh_cmd; --! команда
                signal  cmd:    out bh_cmd; --! команда
                signal  ret:    in  bh_ret  --! ответ
                signal  ret:    in  bh_ret  --! ответ
                );
                );
 
 
--! Запуск DMA на приём одного блока 4 кБ
--! Запуск DMA на приём одного блока 4 кБ
procedure test_read_4kb (
procedure test_read_4kb (
                signal  cmd:    out bh_cmd; --! команда
                signal  cmd:    out bh_cmd; --! команда
                signal  ret:    in  bh_ret  --! ответ
                signal  ret:    in  bh_ret  --! ответ
                );
                );
 
 
 
 
--! Чтение 8 кБ из тетрады DIO_IN 
--! Чтение 8 кБ из тетрады DIO_IN 
procedure test_adm_read_8kb (
procedure test_adm_read_8kb (
                signal  cmd:    out bh_cmd; --! команда
                signal  cmd:    out bh_cmd; --! команда
                signal  ret:    in  bh_ret  --! ответ
                signal  ret:    in  bh_ret  --! ответ
                );
                );
 
 
--! Проверка обращений к блоку MAIN 
--! Проверка обращений к блоку MAIN 
procedure test_block_main (
procedure test_block_main (
                signal  cmd:    out bh_cmd; --! команда
                signal  cmd:    out bh_cmd; --! команда
                signal  ret:    in  bh_ret  --! ответ
                signal  ret:    in  bh_ret  --! ответ
                );
                );
 
 
--! Чтение 16 кБ с использованием двух блоков дескрипторов
--! Чтение 16 кБ с использованием двух блоков дескрипторов
procedure test_adm_read_16kb (
procedure test_adm_read_16kb (
                signal  cmd:    out bh_cmd; --! команда
                signal  cmd:    out bh_cmd; --! команда
                signal  ret:    in  bh_ret  --! ответ
                signal  ret:    in  bh_ret  --! ответ
                );
                );
 
 
--! Запись 16 кБ с использованием двух блоков дескрипторов
--! Запись 16 кБ с использованием двух блоков дескрипторов
procedure test_adm_write_16kb (
procedure test_adm_write_16kb (
                signal  cmd:    out bh_cmd; --! команда
                signal  cmd:    out bh_cmd; --! команда
                signal  ret:    in  bh_ret  --! ответ
                signal  ret:    in  bh_ret  --! ответ
                );
                );
 
 
end package     test_pkg;
end package     test_pkg;
 
 
package body test_pkg is
package body test_pkg is
 
 
        FILE   log: text;
        FILE   log: text;
 
 
        shared variable cnt_ok, cnt_error: integer;
        shared variable cnt_ok, cnt_error: integer;
 
 
        -- Инициализация теста  
        -- Инициализация теста  
        procedure test_init(
        procedure test_init(
                fname: in string                                        -- имя файла отчёта
                fname: in string                                        -- имя файла отчёта
                ) is
                ) is
        begin
        begin
 
 
                file_open( log, fname, WRITE_MODE );
                file_open( log, fname, WRITE_MODE );
                cnt_ok:=0;
                cnt_ok:=0;
                cnt_error:=0;
                cnt_error:=0;
 
 
        end test_init;
        end test_init;
 
 
        -- Завершение теста             
        -- Завершение теста             
        procedure test_close is
        procedure test_close is
                variable str : LINE;            -- pointer to string
                variable str : LINE;            -- pointer to string
        begin
        begin
 
 
                std.textio.write( str, string'(" " ));
                std.textio.write( str, string'(" " ));
                writeline( log, str );
                writeline( log, str );
                writeline( log, str );
                writeline( log, str );
 
 
                write( str, string'("Проверка завершена" ));
                write( str, string'("Проверка завершена" ));
                writeline( log, str );
                writeline( log, str );
                write( str, string'("Число успешных тестов:  " ));
                write( str, string'("Число успешных тестов:  " ));
                write( str, cnt_ok );
                write( str, cnt_ok );
                writeline( log, str );
                writeline( log, str );
                write( str, string'("Число ошибочных тестов: " ));
                write( str, string'("Число ошибочных тестов: " ));
                write( str, cnt_error );
                write( str, cnt_error );
                writeline( log, str );
                writeline( log, str );
 
 
 
 
                file_close( log );
                file_close( log );
 
 
        end test_close;
        end test_close;
 
 
 
 
 
 
--! Запуск DMA с неправильным дескриптором 
--! Запуск DMA с неправильным дескриптором 
procedure test_dsc_incorrect (
procedure test_dsc_incorrect (
                signal  cmd:    out bh_cmd; --! команда
                signal  cmd:    out bh_cmd; --! команда
                signal  ret:    in  bh_ret  --! ответ
                signal  ret:    in  bh_ret  --! ответ
                )
                )
is
is
 
 
variable        adr             : std_logic_vector( 31 downto 0 );
variable        adr             : std_logic_vector( 31 downto 0 );
variable        data    : std_logic_vector( 31 downto 0 );
variable        data    : std_logic_vector( 31 downto 0 );
variable        str             : line;
variable        str             : line;
 
variable        error   : integer:=0;
begin
begin
 
 
        write( str, string'("TEST_DSC_INCORRECT" ));
        write( str, string'("TEST_DSC_INCORRECT" ));
        writeline( log, str );
        writeline( log, str );
 
 
        ---- Формирование блока дескрипторов ---
        ---- Формирование блока дескрипторов ---
        for ii in 0 to 127 loop
        for ii in 0 to 127 loop
                adr:= x"00100000";
                adr:= x"00100000";
                adr:=adr + ii*4;
                adr:=adr + ii*4;
                int_mem_write( cmd, ret, adr,  x"00000000" );
                int_mem_write( cmd, ret, adr,  x"00000000" );
        end loop;
        end loop;
 
 
        int_mem_write( cmd, ret, x"00100000",  x"03020100" );
        int_mem_write( cmd, ret, x"00100000",  x"03020100" );
        int_mem_write( cmd, ret, x"001001FC",  x"FF00AA00" );
        int_mem_write( cmd, ret, x"001001FC",  x"FF00AA00" );
 
 
        ---- Программирование канала DMA ----
        ---- Программирование канала DMA ----
        block_write( cmd, ret, 4, 8, x"00000027" );             -- DMA_MODE 
        block_write( cmd, ret, 4, 8, x"00000027" );             -- DMA_MODE 
        block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
        block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
 
 
        block_write( cmd, ret, 4, 20, x"00100000" );    -- PCI_ADRL 
        block_write( cmd, ret, 4, 20, x"00100000" );    -- PCI_ADRL 
        block_write( cmd, ret, 4, 21, x"00100000" );    -- PCI_ADRH  
        block_write( cmd, ret, 4, 21, x"00100000" );    -- PCI_ADRH  
        block_write( cmd, ret, 4, 23, x"0000A400" );    -- LOCAL_ADR 
        block_write( cmd, ret, 4, 23, x"0000A400" );    -- LOCAL_ADR 
 
 
        block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START 
        block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START 
 
 
        wait for 10 us;
        wait for 10 us;
 
 
        block_read( cmd, ret, 4, 16, data );                    -- STATUS 
        block_read( cmd, ret, 4, 16, data );                    -- STATUS 
 
 
        write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
        write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
        if( data( 15 downto 0 )=x"A021" ) then
        if( data( 15 downto 0 )=x"A021" ) then
                write( str, string'(" - Ok" ));
                write( str, string'(" - Ok" ));
                cnt_ok := cnt_ok + 1;
 
        else
        else
                write( str, string'(" - Error" ));
                write( str, string'(" - Error" ));
                cnt_error := cnt_error + 1;
                error:=error+1;
        end if;
        end if;
 
 
        writeline( log, str );
        writeline( log, str );
 
 
        block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL - STOP  
        block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL - STOP  
 
 
 
        -- вывод в файл --
 
        writeline( log, str );
 
        if( error=0 ) then
 
                write( str, string'("TEST finished successfully" ));
 
                cnt_ok := cnt_ok + 1;
 
        else
 
                write( str, string'("TEST finished with ERR" ));
 
                cnt_error := cnt_error + 1;
 
        end if;
 
        writeline( log, str );
 
        writeline( log, str );
 
 
 
        -- вывод в консоль --
 
        writeline( output, str );
 
        if( error=0 ) then
 
                write( str, string'("TEST finished successfully" ));
 
                cnt_ok := cnt_ok + 1;
 
        else
 
                write( str, string'("TEST finished with ERR" ));
 
                cnt_error := cnt_error + 1;
 
        end if;
 
        writeline( output, str );
 
        writeline( output, str );
 
 
 
 
 
 
end test_dsc_incorrect;
end test_dsc_incorrect;
 
 
 
 
--! Запуск DMA приём одного блока 4 кБ
--! Запуск DMA приём одного блока 4 кБ
procedure test_read_4kb (
procedure test_read_4kb (
                signal  cmd:    out bh_cmd; --! команда
                signal  cmd:    out bh_cmd; --! команда
                signal  ret:    in  bh_ret  --! ответ
                signal  ret:    in  bh_ret  --! ответ
                )
                )
is
is
 
 
variable        adr                             : std_logic_vector( 31 downto 0 );
variable        adr                             : std_logic_vector( 31 downto 0 );
variable        data                    : std_logic_vector( 31 downto 0 );
variable        data                    : std_logic_vector( 31 downto 0 );
variable        str                             : line;
variable        str                             : line;
 
 
variable        error                   : integer:=0;
variable        error                   : integer:=0;
variable        dma_complete    : integer;
variable        dma_complete    : integer;
 
 
begin
begin
 
 
        write( str, string'("TEST_READ_4KB" ));
        write( str, string'("TEST_READ_4KB" ));
        writeline( log, str );
        writeline( log, str );
 
 
        ---- Формирование блока дескрипторов ---
        ---- Формирование блока дескрипторов ---
        for ii in 0 to 127 loop
        for ii in 0 to 127 loop
                adr:= x"00100000";
                adr:= x"00100000";
                adr:=adr + ii*4;
                adr:=adr + ii*4;
                int_mem_write( cmd, ret, adr,  x"00000000" );
                int_mem_write( cmd, ret, adr,  x"00000000" );
        end loop;
        end loop;
 
 
        int_mem_write( cmd, ret, x"00100000",  x"00008000" );
        int_mem_write( cmd, ret, x"00100000",  x"00008000" );
        int_mem_write( cmd, ret, x"00100004",  x"00000100" );
        int_mem_write( cmd, ret, x"00100004",  x"00000100" );
 
 
 
 
        int_mem_write( cmd, ret, x"001001F8",  x"00000000" );
        int_mem_write( cmd, ret, x"001001F8",  x"00000000" );
        int_mem_write( cmd, ret, x"001001FC",  x"762C4953" );
        int_mem_write( cmd, ret, x"001001FC",  x"762C4953" );
 
 
        ---- Программирование канала DMA ----
        ---- Программирование канала DMA ----
        block_write( cmd, ret, 4, 8, x"00000025" );             -- DMA_MODE 
        block_write( cmd, ret, 4, 8, x"00000025" );             -- DMA_MODE 
        block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
        block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
 
 
        block_write( cmd, ret, 4, 20, x"00100000" );    -- PCI_ADRL 
        block_write( cmd, ret, 4, 20, x"00100000" );    -- PCI_ADRL 
        block_write( cmd, ret, 4, 21, x"00100000" );    -- PCI_ADRH  
        block_write( cmd, ret, 4, 21, x"00100000" );    -- PCI_ADRH  
        block_write( cmd, ret, 4, 23, x"0000A400" );    -- LOCAL_ADR 
        block_write( cmd, ret, 4, 23, x"0000A400" );    -- LOCAL_ADR 
 
 
        block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START 
        block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START 
 
 
        wait for 20 us;
        wait for 20 us;
 
 
        block_read( cmd, ret, 4, 16, data );                    -- STATUS 
        block_read( cmd, ret, 4, 16, data );                    -- STATUS 
 
 
        write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
        write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
        if( data( 8 )='1' ) then
        if( data( 8 )='1' ) then
                write( str, string'(" - Дескриптор правильный" ));
                write( str, string'(" - Дескриптор правильный" ));
        else
        else
                write( str, string'(" - Ошибка чтения дескриптора" ));
                write( str, string'(" - Ошибка чтения дескриптора" ));
                error := error + 1;
                error := error + 1;
        end if;
        end if;
 
 
        writeline( log, str );
        writeline( log, str );
 
 
        if( error=0 ) then
        if( error=0 ) then
 
 
                ---- Ожидание завершения DMA ----
                ---- Ожидание завершения DMA ----
                dma_complete := 0;
                dma_complete := 0;
                for ii in 0 to 100 loop
                for ii in 0 to 100 loop
 
 
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
                        if( data(5)='1' ) then
                        if( data(5)='1' ) then
                                write( str, string'(" - DMA завершён " ));
                                write( str, string'(" - DMA завершён " ));
                                dma_complete := 1;
                                dma_complete := 1;
                        end if;
                        end if;
                        writeline( log, str );
                        writeline( log, str );
 
 
                        if( dma_complete=1 ) then
                        if( dma_complete=1 ) then
                                exit;
                                exit;
                        end if;
                        end if;
 
 
                        wait for 1 us;
                        wait for 1 us;
 
 
                end loop;
                end loop;
 
 
                writeline( log, str );
                writeline( log, str );
 
 
                if( dma_complete=0 ) then
                if( dma_complete=0 ) then
                        write( str, string'("Ошибка - DMA не завершён " ));
                        write( str, string'("Ошибка - DMA не завершён " ));
                        writeline( log, str );
                        writeline( log, str );
                        error:=error+1;
                        error:=error+1;
                end if;
                end if;
 
 
        end if;
        end if;
 
 
        for ii in 0 to 3 loop
        for ii in 0 to 3 loop
 
 
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
                writeline( log, str );
                writeline( log, str );
                wait for 500 ns;
                wait for 500 ns;
 
 
        end loop;
        end loop;
 
 
 
 
        block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL - STOP      
        block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL - STOP      
 
 
        write( str, string'(" Прочитано: " ));
        write( str, string'(" Прочитано: " ));
        writeline( log, str );
        writeline( log, str );
 
 
        for ii in 0 to 15 loop
        for ii in 0 to 15 loop
 
 
                adr:= x"00800000";
                adr:= x"00800000";
                adr:=adr + ii*4;
                adr:=adr + ii*4;
                int_mem_read( cmd, ret, adr,  data );
                int_mem_read( cmd, ret, adr,  data );
 
 
                write( str, ii ); write( str, string'("   " )); hwrite( str, data );
                write( str, ii ); write( str, string'("   " )); hwrite( str, data );
                writeline( log, str );
                writeline( log, str );
 
 
        end loop;
        end loop;
 
 
 
 
--      block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
--      block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
--      block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL 
--      block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL 
--      block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START     
--      block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START     
 
 
 
 
 
        -- вывод в файл --
        writeline( log, str );
        writeline( log, str );
        if( error=0 ) then
        if( error=0 ) then
                write( str, string'(" Тест завершён успешно " ));
                write( str, string'("TEST finished successfully" ));
                cnt_ok := cnt_ok + 1;
                cnt_ok := cnt_ok + 1;
        else
        else
                write( str, string'(" Тест не выполнен " ));
                write( str, string'("TEST finished with ERR" ));
                cnt_error := cnt_error + 1;
                cnt_error := cnt_error + 1;
        end if;
        end if;
        writeline( log, str );
        writeline( log, str );
        writeline( log, str );
        writeline( log, str );
 
 
 
        -- вывод в консоль --
 
        writeline( output, str );
 
        if( error=0 ) then
 
                write( str, string'("TEST finished successfully" ));
 
                cnt_ok := cnt_ok + 1;
 
        else
 
                write( str, string'("TEST finished with ERR" ));
 
                cnt_error := cnt_error + 1;
 
        end if;
 
        writeline( output, str );
 
        writeline( output, str );
 
 
 
 
 
 
end test_read_4kb;
end test_read_4kb;
 
 
 
 
--! Чтение 8 кБ из тетрады DIO_IN 
--! Чтение 8 кБ из тетрады DIO_IN 
procedure test_adm_read_8kb (
procedure test_adm_read_8kb (
                signal  cmd:    out bh_cmd; --! команда
                signal  cmd:    out bh_cmd; --! команда
                signal  ret:    in  bh_ret  --! ответ
                signal  ret:    in  bh_ret  --! ответ
                )
                )
is
is
 
 
variable        adr                             : std_logic_vector( 31 downto 0 );
variable        adr                             : std_logic_vector( 31 downto 0 );
variable        data                    : std_logic_vector( 31 downto 0 );
variable        data                    : std_logic_vector( 31 downto 0 );
variable        str                             : line;
variable        str                             : line;
 
 
variable        error                   : integer:=0;
variable        error                   : integer:=0;
variable        dma_complete    : integer;
variable        dma_complete    : integer;
 
 
begin
begin
 
 
        write( str, string'("TEST_ADM_READ_8KB" ));
        write( str, string'("TEST_ADM_READ_8KB" ));
        writeline( log, str );
        writeline( log, str );
 
 
        ---- Формирование блока дескрипторов ---
        ---- Формирование блока дескрипторов ---
        for ii in 0 to 127 loop
        for ii in 0 to 127 loop
                adr:= x"00100000";
                adr:= x"00100000";
                adr:=adr + ii*4;
                adr:=adr + ii*4;
                int_mem_write( cmd, ret, adr,  x"00000000" );
                int_mem_write( cmd, ret, adr,  x"00000000" );
        end loop;
        end loop;
 
 
        --- Дескриптор 0 ---
        --- Дескриптор 0 ---
        int_mem_write( cmd, ret, x"00100000",  x"00008000" );
        int_mem_write( cmd, ret, x"00100000",  x"00008000" );
        int_mem_write( cmd, ret, x"00100004",  x"00000111" );   -- переход к следующему 
        int_mem_write( cmd, ret, x"00100004",  x"00000111" );   -- переход к следующему 
 
 
        --- Дескриптор 1 ---
        --- Дескриптор 1 ---
        int_mem_write( cmd, ret, x"00100008",  x"00008010" );
        int_mem_write( cmd, ret, x"00100008",  x"00008010" );
        int_mem_write( cmd, ret, x"0010000C",  x"00000110" );   -- остановка
        int_mem_write( cmd, ret, x"0010000C",  x"00000110" );   -- остановка
 
 
 
 
        int_mem_write( cmd, ret, x"001001F8",  x"00000000" );
        int_mem_write( cmd, ret, x"001001F8",  x"00000000" );
        int_mem_write( cmd, ret, x"001001FC",  x"D6644953" );
        int_mem_write( cmd, ret, x"001001FC",  x"D6644953" );
 
 
        trd_test_mode( cmd, ret, 0 );    -- переход в рабочий режим --
        trd_test_mode( cmd, ret, 0 );    -- переход в рабочий режим --
 
 
        ---- Программирование канала DMA ----
        ---- Программирование канала DMA ----
        block_write( cmd, ret, 4, 8, x"00000027" );             -- DMA_MODE 
        block_write( cmd, ret, 4, 8, x"00000027" );             -- DMA_MODE 
        block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
        block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
 
 
        block_write( cmd, ret, 4, 20, x"00100000" );    -- PCI_ADRL 
        block_write( cmd, ret, 4, 20, x"00100000" );    -- PCI_ADRL 
        block_write( cmd, ret, 4, 21, x"00100000" );    -- PCI_ADRH  
        block_write( cmd, ret, 4, 21, x"00100000" );    -- PCI_ADRH  
        block_write( cmd, ret, 4, 23, x"00019000" );    -- LOCAL_ADR 
        block_write( cmd, ret, 4, 23, x"00019000" );    -- LOCAL_ADR 
 
 
 
 
        ---- Подготовка тетрады ----
        ---- Подготовка тетрады ----
        trd_test_mode( cmd, ret, 0 );    -- переход в рабочий режим --
        trd_test_mode( cmd, ret, 0 );    -- переход в рабочий режим --
        trd_wait_cmd( cmd, ret, 0, 16, x"1600" );                -- DMAR0 - от тетрады 6 --
        trd_wait_cmd( cmd, ret, 0, 16, x"1600" );                -- DMAR0 - от тетрады 6 --
 
 
        trd_wait_cmd( cmd, ret, 1, 16#1F#, x"0001" );   -- Размер блока = 4 кБ --
        trd_wait_cmd( cmd, ret, 1, 16#1F#, x"0001" );   -- Размер блока = 4 кБ --
 
 
        block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START 
        block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START 
 
 
        trd_wait_cmd( cmd, ret, 1, 16#0F#, x"0001" );   -- Подключение выхода генератора к DIO_IN --
        trd_wait_cmd( cmd, ret, 1, 16#0F#, x"0001" );   -- Подключение выхода генератора к DIO_IN --
 
 
        trd_wait_cmd( cmd, ret, 6,      0, x"2038" );            -- запуск тетрады DIO_IN
        trd_wait_cmd( cmd, ret, 6,      0, x"2038" );            -- запуск тетрады DIO_IN
 
 
        trd_wait_cmd( cmd, ret, 1, 16#1E#, x"0020" );   -- Запуск тестовой последовательности --
        trd_wait_cmd( cmd, ret, 1, 16#1E#, x"0020" );   -- Запуск тестовой последовательности --
 
 
        wait for 20 us;
        wait for 20 us;
 
 
        block_read( cmd, ret, 4, 16, data );                    -- STATUS 
        block_read( cmd, ret, 4, 16, data );                    -- STATUS 
 
 
        write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
        write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
        if( data( 8 )='1' ) then
        if( data( 8 )='1' ) then
                write( str, string'(" - Дескриптор правильный" ));
                write( str, string'(" - Дескриптор правильный" ));
        else
        else
                write( str, string'(" - Ошибка чтения дескриптора" ));
                write( str, string'(" - Ошибка чтения дескриптора" ));
                error := error + 1;
                error := error + 1;
        end if;
        end if;
 
 
        writeline( log, str );
        writeline( log, str );
 
 
        if( error=0 ) then
        if( error=0 ) then
 
 
                ---- Ожидание завершения DMA ----
                ---- Ожидание завершения DMA ----
                dma_complete := 0;
                dma_complete := 0;
                for ii in 0 to 100 loop
                for ii in 0 to 100 loop
 
 
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
                        if( data(5)='1' ) then
                        if( data(5)='1' ) then
                                write( str, string'(" - DMA завершён " ));
                                write( str, string'(" - DMA завершён " ));
                                dma_complete := 1;
                                dma_complete := 1;
 
 
                                block_write( cmd, ret, 4, 16#11#, x"00000010" );                -- FLAG_CLR - сброс EOT 
                                block_write( cmd, ret, 4, 16#11#, x"00000010" );                -- FLAG_CLR - сброс EOT 
 
 
                        end if;
                        end if;
                        writeline( log, str );
                        writeline( log, str );
 
 
                        if( dma_complete=1 ) then
                        if( dma_complete=1 ) then
                                exit;
                                exit;
                        end if;
                        end if;
 
 
                        wait for 1 us;
                        wait for 1 us;
 
 
                end loop;
                end loop;
 
 
                writeline( log, str );
                writeline( log, str );
 
 
                if( dma_complete=0 ) then
                if( dma_complete=0 ) then
                        write( str, string'("Ошибка - DMA не завершён " ));
                        write( str, string'("Ошибка - DMA не завершён " ));
                        writeline( log, str );
                        writeline( log, str );
                        error:=error+1;
                        error:=error+1;
                end if;
                end if;
 
 
        end if;
        end if;
 
 
        for ii in 0 to 3 loop
        for ii in 0 to 3 loop
 
 
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
                writeline( log, str );
                writeline( log, str );
                wait for 500 ns;
                wait for 500 ns;
 
 
        end loop;
        end loop;
 
 
 
 
        block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL - STOP      
        block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL - STOP      
 
 
        write( str, string'(" Блок 0 - прочитано: " ));
        write( str, string'(" Блок 0 - прочитано: " ));
        writeline( log, str );
        writeline( log, str );
 
 
        for ii in 0 to 15 loop
        for ii in 0 to 15 loop
 
 
                adr:= x"00800000";
                adr:= x"00800000";
                adr:=adr + ii*4;
                adr:=adr + ii*4;
                int_mem_read( cmd, ret, adr,  data );
                int_mem_read( cmd, ret, adr,  data );
 
 
                write( str, ii ); write( str, string'("   " )); hwrite( str, data );
                write( str, ii ); write( str, string'("   " )); hwrite( str, data );
                writeline( log, str );
                writeline( log, str );
 
 
        end loop;
        end loop;
 
 
        writeline( log, str );
        writeline( log, str );
 
 
        write( str, string'(" Блок 1 - прочитано: " ));
        write( str, string'(" Блок 1 - прочитано: " ));
        writeline( log, str );
        writeline( log, str );
 
 
        for ii in 0 to 15 loop
        for ii in 0 to 15 loop
 
 
                adr:= x"00801000";
                adr:= x"00801000";
                adr:=adr + ii*4;
                adr:=adr + ii*4;
                int_mem_read( cmd, ret, adr,  data );
                int_mem_read( cmd, ret, adr,  data );
 
 
                write( str, ii ); write( str, string'("   " )); hwrite( str, data );
                write( str, ii ); write( str, string'("   " )); hwrite( str, data );
                writeline( log, str );
                writeline( log, str );
 
 
        end loop;
        end loop;
 
 
 
 
--      block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
--      block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
--      block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL 
--      block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL 
--      block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START     
--      block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START     
 
 
 
 
 
        -- вывод в файл --
        writeline( log, str );
        writeline( log, str );
        if( error=0 ) then
        if( error=0 ) then
                write( str, string'(" Тест завершён успешно " ));
                write( str, string'("TEST finished successfully" ));
                cnt_ok := cnt_ok + 1;
                cnt_ok := cnt_ok + 1;
        else
        else
                write( str, string'(" Тест не выполнен " ));
                write( str, string'("TEST finished with ERR" ));
                cnt_error := cnt_error + 1;
                cnt_error := cnt_error + 1;
        end if;
        end if;
        writeline( log, str );
        writeline( log, str );
        writeline( log, str );
        writeline( log, str );
 
 
 
        -- вывод в консоль --
 
        writeline( output, str );
 
        if( error=0 ) then
 
                write( str, string'("TEST finished successfully" ));
 
                cnt_ok := cnt_ok + 1;
 
        else
 
                write( str, string'("TEST finished with ERR" ));
 
                cnt_error := cnt_error + 1;
 
        end if;
 
        writeline( output, str );
 
        writeline( output, str );
 
 
 
 
end test_adm_read_8kb;
end test_adm_read_8kb;
 
 
 
 
--! Проверка обращений к блоку MAIN 
--! Проверка обращений к блоку MAIN 
procedure test_block_main (
procedure test_block_main (
                signal  cmd:    out bh_cmd; --! команда
                signal  cmd:    out bh_cmd; --! команда
                signal  ret:    in  bh_ret  --! ответ
                signal  ret:    in  bh_ret  --! ответ
                )
                )
is
is
 
 
variable        adr                             : std_logic_vector( 31 downto 0 );
variable        adr                             : std_logic_vector( 31 downto 0 );
variable        data                    : std_logic_vector( 31 downto 0 );
variable        data                    : std_logic_vector( 31 downto 0 );
variable        str                             : line;
variable        str                             : line;
 
 
variable        error                   : integer:=0;
variable        error                   : integer:=0;
variable        dma_complete    : integer;
variable        dma_complete    : integer;
 
 
begin
begin
 
 
        write( str, string'("TEST_BLOCK_MAIN" ));
        write( str, string'("TEST_BLOCK_MAIN" ));
        writeline( log, str );
        writeline( log, str );
 
 
        block_write( cmd, ret, 4, 16#08#, x"0000AA55" );
        block_write( cmd, ret, 4, 16#08#, x"0000AA55" );
        block_read( cmd, ret, 4, 16#08#, data );
        block_read( cmd, ret, 4, 16#08#, data );
        write( str,  string'("БЛОК 4: " )); hwrite( str, data ); writeline( log, str );
        write( str,  string'("БЛОК 4: " )); hwrite( str, data ); writeline( log, str );
 
 
        wait for 10 us;
        wait for 10 us;
 
 
--      write( str, "Константы:" );
        write( str, "Константы:" );
--      writeline( log, str );  
        writeline( log, str );
--      for ii in 0 to 5 loop
        for ii in 0 to 5 loop
--              write( str, "Блок " );
                write( str, "Блок " );
--              write( str, ii );
                write( str, ii );
--              for jj in 0 to 7 loop
                for jj in 0 to 7 loop
--                      block_read( cmd, ret, ii, jj, data );                   
                        block_read( cmd, ret, ii, jj, data );
--                      write( str, "   " );
                        write( str, "   " );
--                      hwrite( str, data );
                        hwrite( str, data );
--              end loop;
                end loop;
--              writeline( log, str );          
                writeline( log, str );
--      end loop;
        end loop;
--              
 
--      
 
--      writeline( log, str );                                                  
 
--      
 
--      block_read( cmd, ret, 0, 16#10#, data );                        
 
--      write( str,  "STATUS: " ); hwrite( str, data ); writeline( log, str );  
 
--      
 
--      block_write( cmd, ret, 80, 16#08#, x"00000100" );                       
 
--      
 
--      block_read( cmd, ret, 0, 16#10#, data );                        
 
--      write( str, "STATUS: " ); hwrite( str, data ); writeline( log, str );   
 
--      
 
--      block_write( cmd, ret, 80, 16#08#, x"00000200" );                       
 
--      
 
--      block_read( cmd, ret, 0, 16#10#, data );                        
 
--      write( str, "STATUS: " ); hwrite( str, data ); writeline( log, str );   
 
--      
 
--      
 
--      writeline( log, str );          
 
--      if( error=0 ) then
 
--              write( str, " Тест завершён успешно " );
 
--              cnt_ok := cnt_ok + 1;
 
--      else
 
--              write( str, " Тест не выполнен " );
 
--              cnt_error := cnt_error + 1;
 
--      end if;
 
 
 
        for ii in 0 to 127 loop
 
 
        writeline( log, str );
 
 
 
        block_read( cmd, ret, 0, 16#10#, data );
 
        write( str,  "STATUS: " ); hwrite( str, data ); writeline( log, str );
 
 
 
        block_write( cmd, ret, 80, 16#08#, x"00000100" );
 
 
 
        block_read( cmd, ret, 0, 16#10#, data );
 
        write( str, "STATUS: " ); hwrite( str, data ); writeline( log, str );
 
 
 
        block_write( cmd, ret, 80, 16#08#, x"00000200" );
 
 
 
        block_read( cmd, ret, 0, 16#10#, data );
 
        write( str, "STATUS: " ); hwrite( str, data ); writeline( log, str );
 
 
 
 
 
        for ii in 0 to 7 loop
 
 
                block_write( cmd, ret, 4, 16#08#, x"0000AA55" );
                block_write( cmd, ret, 4, 16#08#, x"0000AA55" );
                block_read( cmd, ret, 4, 8, data );
                block_read( cmd, ret, 4, 8, data );
                write( str, string'("READ: " )); hwrite( str, data( 15 downto 0 ) ); writeline( log, str );
                write( str, string'("READ: " )); hwrite( str, data( 15 downto 0 ) ); writeline( log, str );
                if( data/=x"0000AA55" ) then
                if( data/=x"0000AA55" ) then
                        error:=error+1;
                        error:=error+1;
                end if;
                end if;
 
 
        end loop;
        end loop;
 
 
 
 
 
 
 
        -- вывод в файл --
 
        writeline( log, str );
 
        if( error=0 ) then
 
                write( str, string'("TEST finished successfully" ));
 
                cnt_ok := cnt_ok + 1;
 
        else
 
                write( str, string'("TEST finished with ERR" ));
 
                cnt_error := cnt_error + 1;
 
        end if;
        writeline( log, str );
        writeline( log, str );
        writeline( log, str );
        writeline( log, str );
 
 
 
        -- вывод в консоль --
 
        writeline( output, str );
 
        if( error=0 ) then
 
                write( str, string'("TEST finished successfully" ));
 
                cnt_ok := cnt_ok + 1;
 
        else
 
                write( str, string'("TEST finished with ERR" ));
 
                cnt_error := cnt_error + 1;
 
        end if;
 
        writeline( output, str );
 
        writeline( output, str );
 
 
 
 
end test_block_main;
end test_block_main;
 
 
 
 
 
 
 
 
--! Чтение 16 кБ с использованием двух блоков дескрипторов
--! Чтение 16 кБ с использованием двух блоков дескрипторов
procedure test_adm_read_16kb (
procedure test_adm_read_16kb (
                signal  cmd:    out bh_cmd; --! команда
                signal  cmd:    out bh_cmd; --! команда
                signal  ret:    in  bh_ret  --! ответ
                signal  ret:    in  bh_ret  --! ответ
                )
                )
is
is
 
 
variable        adr                             : std_logic_vector( 31 downto 0 );
variable        adr                             : std_logic_vector( 31 downto 0 );
variable        data                    : std_logic_vector( 31 downto 0 );
variable        data                    : std_logic_vector( 31 downto 0 );
variable        str                             : line;
variable        str                             : line;
 
 
variable        error                   : integer:=0;
variable        error                   : integer:=0;
variable        dma_complete    : integer;
variable        dma_complete    : integer;
variable        kk                              : integer;
variable        kk                              : integer;
variable        status                  : std_logic_vector( 15 downto 0 );
variable        status                  : std_logic_vector( 15 downto 0 );
 
 
begin
begin
 
 
        write( str, string'("TEST_ADM_READ_16KB" ));
        write( str, string'("TEST_ADM_READ_16KB" ));
        writeline( log, str );
        writeline( log, str );
 
 
        ---- Формирование блока дескрипторов ---
        ---- Формирование блока дескрипторов ---
        for ii in 0 to 256 loop
        for ii in 0 to 256 loop
                adr:= x"00100000";
                adr:= x"00100000";
                adr:=adr + ii*4;
                adr:=adr + ii*4;
                int_mem_write( cmd, ret, adr,  x"00000000" );
                int_mem_write( cmd, ret, adr,  x"00000000" );
        end loop;
        end loop;
 
 
        --- Блок 0 ---
        --- Блок 0 ---
 
 
        --- Дескриптор 0 ---
        --- Дескриптор 0 ---
        int_mem_write( cmd, ret, x"00100000",  x"00008000" );
        int_mem_write( cmd, ret, x"00100000",  x"00008000" );
        int_mem_write( cmd, ret, x"00100004",  x"00000111" );   -- переход к следующему дескриптору 
        int_mem_write( cmd, ret, x"00100004",  x"00000111" );   -- переход к следующему дескриптору 
 
 
        --- Дескриптор 1 ---
        --- Дескриптор 1 ---
        int_mem_write( cmd, ret, x"00100008",  x"00008010" );
        int_mem_write( cmd, ret, x"00100008",  x"00008010" );
        int_mem_write( cmd, ret, x"0010000C",  x"00000112" );   -- переход к следующему блоку 
        int_mem_write( cmd, ret, x"0010000C",  x"00000112" );   -- переход к следующему блоку 
 
 
        --- Дескриптор 2 ---
        --- Дескриптор 2 ---
        int_mem_write( cmd, ret, x"00100010",  x"00001002" );   -- адрес следующего дескриптора 
        int_mem_write( cmd, ret, x"00100010",  x"00001002" );   -- адрес следующего дескриптора 
        int_mem_write( cmd, ret, x"00100014",  x"00000000" );
        int_mem_write( cmd, ret, x"00100014",  x"00000000" );
 
 
 
 
        int_mem_write( cmd, ret, x"001001F8",  x"00000000" );
        int_mem_write( cmd, ret, x"001001F8",  x"00000000" );
        int_mem_write( cmd, ret, x"001001FC",  x"14644953" );
        int_mem_write( cmd, ret, x"001001FC",  x"14644953" );
 
 
 
 
        --- Блок 1 ---
        --- Блок 1 ---
 
 
        --- Дескриптор 0 ---
        --- Дескриптор 0 ---
        int_mem_write( cmd, ret, x"00100200",  x"00008020" );
        int_mem_write( cmd, ret, x"00100200",  x"00008020" );
        int_mem_write( cmd, ret, x"00100204",  x"00000111" );   -- переход к следующему дескриптору 
        int_mem_write( cmd, ret, x"00100204",  x"00000111" );   -- переход к следующему дескриптору 
 
 
        --- Дескриптор 1 ---
        --- Дескриптор 1 ---
        int_mem_write( cmd, ret, x"00100208",  x"00008030" );
        int_mem_write( cmd, ret, x"00100208",  x"00008030" );
        int_mem_write( cmd, ret, x"0010020C",  x"00000110" );   -- остановка
        int_mem_write( cmd, ret, x"0010020C",  x"00000110" );   -- остановка
 
 
 
 
        int_mem_write( cmd, ret, x"001003F8",  x"00000000" );
        int_mem_write( cmd, ret, x"001003F8",  x"00000000" );
        int_mem_write( cmd, ret, x"001003FC",  x"D67C4953" );
        int_mem_write( cmd, ret, x"001003FC",  x"D67C4953" );
 
 
 
 
 
 
        ---- Программирование канала DMA ----
        ---- Программирование канала DMA ----
        block_write( cmd, ret, 4, 8, x"00000027" );             -- DMA_MODE 
        block_write( cmd, ret, 4, 8, x"00000027" );             -- DMA_MODE 
        block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
        block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
 
 
        block_write( cmd, ret, 4, 20, x"00100000" );    -- PCI_ADRL 
        block_write( cmd, ret, 4, 20, x"00100000" );    -- PCI_ADRL 
        block_write( cmd, ret, 4, 21, x"00100000" );    -- PCI_ADRH  
        block_write( cmd, ret, 4, 21, x"00100000" );    -- PCI_ADRH  
        block_write( cmd, ret, 4, 23, x"00019000" );    -- LOCAL_ADR 
        block_write( cmd, ret, 4, 23, x"00019000" );    -- LOCAL_ADR 
 
 
 
 
        ---- Подготовка тетрады ----
        ---- Подготовка тетрады ----
        trd_test_mode( cmd, ret, 0 );    -- переход в рабочий режим --
        trd_test_mode( cmd, ret, 0 );    -- переход в рабочий режим --
        trd_wait_cmd( cmd, ret, 0, 16, x"1600" );                -- DMAR0 - от тетрады 6 --
        trd_wait_cmd( cmd, ret, 0, 16, x"1600" );                -- DMAR0 - от тетрады 6 --
 
 
        trd_wait_cmd( cmd, ret, 1, 16#1F#, x"0001" );   -- Размер блока = 4 кБ --
        trd_wait_cmd( cmd, ret, 1, 16#1F#, x"0001" );   -- Размер блока = 4 кБ --
 
 
        block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START 
        block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START 
 
 
        trd_wait_cmd( cmd, ret, 1, 16#0F#, x"0001" );   -- Подключение выхода генератора к DIO_IN --
        trd_wait_cmd( cmd, ret, 1, 16#0F#, x"0001" );   -- Подключение выхода генератора к DIO_IN --
 
 
        trd_wait_cmd( cmd, ret, 6,      0, x"2038" );            -- запуск тетрады DIO_IN
        trd_wait_cmd( cmd, ret, 6,      0, x"2038" );            -- запуск тетрады DIO_IN
 
 
        trd_wait_cmd( cmd, ret, 1, 16#1E#, x"06A0" );   -- Запуск тестовой последовательности --
        trd_wait_cmd( cmd, ret, 1, 16#1E#, x"06A0" );   -- Запуск тестовой последовательности --
 
 
        wait for 20 us;
        wait for 20 us;
 
 
        block_read( cmd, ret, 4, 16, data );                    -- STATUS 
        block_read( cmd, ret, 4, 16, data );                    -- STATUS 
 
 
        write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
        write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
        if( data( 8 )='1' ) then
        if( data( 8 )='1' ) then
                write( str, string'(" - Дескриптор правильный" ));
                write( str, string'(" - Дескриптор правильный" ));
        else
        else
                write( str, string'(" - Ошибка чтения дескриптора" ));
                write( str, string'(" - Ошибка чтения дескриптора" ));
                error := error + 1;
                error := error + 1;
        end if;
        end if;
 
 
        writeline( log, str );
        writeline( log, str );
 
 
        if( error=0 ) then
        if( error=0 ) then
 
 
                kk:=0;
                kk:=0;
                loop
                loop
 
 
                trd_status( cmd, ret, 6, status );
                trd_status( cmd, ret, 6, status );
                write( str, string'("TRD_STATUS: " )); hwrite( str, status );
                write( str, string'("TRD_STATUS: " )); hwrite( str, status );
 
 
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
                write( str, string'("    STATUS: " )); hwrite( str, data( 15 downto 0 ) );
                write( str, string'("    STATUS: " )); hwrite( str, data( 15 downto 0 ) );
 
 
                        if( data(4)='1' ) then
                        if( data(4)='1' ) then
                                write( str, string'(" - завершено чтение блока " ));
                                write( str, string'(" - завершено чтение блока " ));
                                block_write( cmd, ret, 4, 16#11#, x"00000010" );                -- FLAG_CLR - сброс EOT 
                                block_write( cmd, ret, 4, 16#11#, x"00000010" );                -- FLAG_CLR - сброс EOT 
                                kk:=kk+1;
                                kk:=kk+1;
                                if( kk=4 ) then
                                if( kk=4 ) then
                                        exit;
                                        exit;
                                end if;
                                end if;
                        end if;
                        end if;
                        writeline( log, str );
                        writeline( log, str );
 
 
                        wait for 500 ns;
                        wait for 500 ns;
 
 
 
 
                end loop;
                end loop;
 
 
                ---- Ожидание завершения DMA ----
                ---- Ожидание завершения DMA ----
                dma_complete := 0;
                dma_complete := 0;
                for ii in 0 to 100 loop
                for ii in 0 to 100 loop
 
 
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
                        if( data(5)='1' ) then
                        if( data(5)='1' ) then
                                write( str, string'(" - DMA завершён " ));
                                write( str, string'(" - DMA завершён " ));
                                dma_complete := 1;
                                dma_complete := 1;
 
 
                                block_write( cmd, ret, 4, 16#11#, x"00000010" );                -- FLAG_CLR - сброс EOT 
                                block_write( cmd, ret, 4, 16#11#, x"00000010" );                -- FLAG_CLR - сброс EOT 
 
 
                        end if;
                        end if;
                        writeline( log, str );
                        writeline( log, str );
 
 
                        if( dma_complete=1 ) then
                        if( dma_complete=1 ) then
                                exit;
                                exit;
                        end if;
                        end if;
 
 
                        wait for 1 us;
                        wait for 1 us;
 
 
                end loop;
                end loop;
 
 
                writeline( log, str );
                writeline( log, str );
 
 
                if( dma_complete=0 ) then
                if( dma_complete=0 ) then
                        write( str, string'("Ошибка - DMA не завершён " ));
                        write( str, string'("Ошибка - DMA не завершён " ));
                        writeline( log, str );
                        writeline( log, str );
                        error:=error+1;
                        error:=error+1;
                end if;
                end if;
 
 
        end if;
        end if;
 
 
        for ii in 0 to 3 loop
        for ii in 0 to 3 loop
 
 
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
                writeline( log, str );
                writeline( log, str );
                wait for 500 ns;
                wait for 500 ns;
 
 
        end loop;
        end loop;
 
 
 
 
        block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL - STOP      
        block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL - STOP      
 
 
        write( str, string'(" Блок 0 - прочитано: " ));
        write( str, string'(" Блок 0 - прочитано: " ));
        writeline( log, str );
        writeline( log, str );
 
 
        for ii in 0 to 15 loop
        for ii in 0 to 15 loop
 
 
                adr:= x"00800000";
                adr:= x"00800000";
                adr:=adr + ii*4;
                adr:=adr + ii*4;
                int_mem_read( cmd, ret, adr,  data );
                int_mem_read( cmd, ret, adr,  data );
 
 
                write( str, ii ); write( str, string'("   " )); hwrite( str, data );
                write( str, ii ); write( str, string'("   " )); hwrite( str, data );
                writeline( log, str );
                writeline( log, str );
 
 
        end loop;
        end loop;
 
 
        writeline( log, str );
        writeline( log, str );
 
 
        write( str, string'(" Блок 1 - прочитано: " ));
        write( str, string'(" Блок 1 - прочитано: " ));
        writeline( log, str );
        writeline( log, str );
 
 
        for ii in 0 to 15 loop
        for ii in 0 to 15 loop
 
 
                adr:= x"00801000";
                adr:= x"00801000";
                adr:=adr + ii*4;
                adr:=adr + ii*4;
                int_mem_read( cmd, ret, adr,  data );
                int_mem_read( cmd, ret, adr,  data );
 
 
                write( str, ii ); write( str, string'("   " )); hwrite( str, data );
                write( str, ii ); write( str, string'("   " )); hwrite( str, data );
                writeline( log, str );
                writeline( log, str );
 
 
        end loop;
        end loop;
 
 
        write( str, string'(" Блок 2 - прочитано: " ));
        write( str, string'(" Блок 2 - прочитано: " ));
        writeline( log, str );
        writeline( log, str );
 
 
        for ii in 0 to 15 loop
        for ii in 0 to 15 loop
 
 
                adr:= x"00802000";
                adr:= x"00802000";
                adr:=adr + ii*4;
                adr:=adr + ii*4;
                int_mem_read( cmd, ret, adr,  data );
                int_mem_read( cmd, ret, adr,  data );
 
 
                write( str, ii ); write( str, string'("   " )); hwrite( str, data );
                write( str, ii ); write( str, string'("   " )); hwrite( str, data );
                writeline( log, str );
                writeline( log, str );
 
 
        end loop;
        end loop;
 
 
 
 
        write( str, string'(" Блок 3 - прочитано: " ));
        write( str, string'(" Блок 3 - прочитано: " ));
        writeline( log, str );
        writeline( log, str );
 
 
        for ii in 0 to 15 loop
        for ii in 0 to 15 loop
 
 
                adr:= x"00803000";
                adr:= x"00803000";
                adr:=adr + ii*4;
                adr:=adr + ii*4;
                int_mem_read( cmd, ret, adr,  data );
                int_mem_read( cmd, ret, adr,  data );
 
 
                write( str, ii ); write( str, string'("   " )); hwrite( str, data );
                write( str, ii ); write( str, string'("   " )); hwrite( str, data );
                writeline( log, str );
                writeline( log, str );
 
 
        end loop;
        end loop;
 
 
--      block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
--      block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
--      block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL 
--      block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL 
--      block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START     
--      block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START     
 
 
 
 
 
        -- вывод в файл --
        writeline( log, str );
        writeline( log, str );
        if( error=0 ) then
        if( error=0 ) then
                write( str, string'(" Тест завершён успешно " ));
                write( str, string'("TEST finished successfully" ));
                cnt_ok := cnt_ok + 1;
                cnt_ok := cnt_ok + 1;
        else
        else
                write( str, string'(" Тест не выполнен " ));
                write( str, string'("TEST finished with ERR" ));
                cnt_error := cnt_error + 1;
                cnt_error := cnt_error + 1;
        end if;
        end if;
        writeline( log, str );
        writeline( log, str );
        writeline( log, str );
        writeline( log, str );
 
 
 
        -- вывод в консоль --
 
        writeline( output, str );
 
        if( error=0 ) then
 
                write( str, string'("TEST finished successfully" ));
 
                cnt_ok := cnt_ok + 1;
 
        else
 
                write( str, string'("TEST finished with ERR" ));
 
                cnt_error := cnt_error + 1;
 
        end if;
 
        writeline( output, str );
 
        writeline( output, str );
 
 
 
 
 
 
end test_adm_read_16kb;
end test_adm_read_16kb;
 
 
 
 
 
 
 
 
--! Запись 16 кБ с использованием двух блоков дескрипторов
--! Запись 16 кБ с использованием двух блоков дескрипторов
procedure test_adm_write_16kb (
procedure test_adm_write_16kb (
                signal  cmd:    out bh_cmd; --! команда
                signal  cmd:    out bh_cmd; --! команда
                signal  ret:    in  bh_ret  --! ответ
                signal  ret:    in  bh_ret  --! ответ
                )
                )
is
is
 
 
variable        adr                             : std_logic_vector( 31 downto 0 );
variable        adr                             : std_logic_vector( 31 downto 0 );
variable        data                    : std_logic_vector( 31 downto 0 );
variable        data                    : std_logic_vector( 31 downto 0 );
variable        str                             : line;
variable        str                             : line;
 
 
variable        error                   : integer:=0;
variable        error                   : integer:=0;
variable        dma_complete    : integer;
variable        dma_complete    : integer;
variable        kk                              : integer;
variable        kk                              : integer;
variable        status                  : std_logic_vector( 15 downto 0 );
variable        status                  : std_logic_vector( 15 downto 0 );
 
 
begin
begin
 
 
        write( str, string'("TEST_ADM_WRITE_16KB" ));
        write( str, string'("TEST_ADM_WRITE_16KB" ));
        writeline( log, str );
        writeline( log, str );
 
 
        ---- Формирование блока дескрипторов ---
        ---- Формирование блока дескрипторов ---
        for ii in 0 to 256 loop
        for ii in 0 to 256 loop
                adr:= x"00100000";
                adr:= x"00100000";
                adr:=adr + ii*4;
                adr:=adr + ii*4;
                int_mem_write( cmd, ret, adr,  x"00000000" );
                int_mem_write( cmd, ret, adr,  x"00000000" );
        end loop;
        end loop;
 
 
        ---- Заполнение памяти ----
        ---- Заполнение памяти ----
        for ii in 0 to 256 loop
        for ii in 0 to 256 loop
                adr:= x"00800000";
                adr:= x"00800000";
                adr:=adr + ii*4;
                adr:=adr + ii*4;
                data:=x"00A00000";
                data:=x"00A00000";
                data:=data + ii;
                data:=data + ii;
                int_mem_write( cmd, ret, adr,  data );
                int_mem_write( cmd, ret, adr,  data );
        end loop;
        end loop;
 
 
        for ii in 0 to 1023 loop
        for ii in 0 to 1023 loop
                adr:= x"00801000";
                adr:= x"00801000";
                adr:=adr + ii*4;
                adr:=adr + ii*4;
                data:=x"00A10000";
                data:=x"00A10000";
                data:=data + ii;
                data:=data + ii;
                int_mem_write( cmd, ret, adr,  data );
                int_mem_write( cmd, ret, adr,  data );
        end loop;
        end loop;
 
 
        for ii in 0 to 256 loop
        for ii in 0 to 256 loop
                adr:= x"00802000";
                adr:= x"00802000";
                adr:=adr + ii*4;
                adr:=adr + ii*4;
                data:=x"00A20000";
                data:=x"00A20000";
                data:=data + ii;
                data:=data + ii;
                int_mem_write( cmd, ret, adr,  data );
                int_mem_write( cmd, ret, adr,  data );
        end loop;
        end loop;
 
 
        for ii in 0 to 256 loop
        for ii in 0 to 256 loop
                adr:= x"00803000";
                adr:= x"00803000";
                adr:=adr + ii*4;
                adr:=adr + ii*4;
                data:=x"00A30000";
                data:=x"00A30000";
                data:=data + ii;
                data:=data + ii;
                int_mem_write( cmd, ret, adr,  data );
                int_mem_write( cmd, ret, adr,  data );
        end loop;
        end loop;
 
 
        --- Блок 0 ---
        --- Блок 0 ---
 
 
        --- Дескриптор 0 ---
        --- Дескриптор 0 ---
        int_mem_write( cmd, ret, x"00100000",  x"00008000" );
        int_mem_write( cmd, ret, x"00100000",  x"00008000" );
        int_mem_write( cmd, ret, x"00100004",  x"00000011" );   -- переход к следующему дескриптору 
        int_mem_write( cmd, ret, x"00100004",  x"00000011" );   -- переход к следующему дескриптору 
 
 
        --- Дескриптор 1 ---
        --- Дескриптор 1 ---
        int_mem_write( cmd, ret, x"00100008",  x"00008010" );
        int_mem_write( cmd, ret, x"00100008",  x"00008010" );
        int_mem_write( cmd, ret, x"0010000C",  x"00000012" );   -- переход к следующему блоку 
        int_mem_write( cmd, ret, x"0010000C",  x"00000012" );   -- переход к следующему блоку 
 
 
        --- Дескриптор 2 ---
        --- Дескриптор 2 ---
        int_mem_write( cmd, ret, x"00100010",  x"00001002" );   -- адрес следующего дескриптора 
        int_mem_write( cmd, ret, x"00100010",  x"00001002" );   -- адрес следующего дескриптора 
        int_mem_write( cmd, ret, x"00100014",  x"00000000" );
        int_mem_write( cmd, ret, x"00100014",  x"00000000" );
 
 
 
 
        int_mem_write( cmd, ret, x"001001F8",  x"00000000" );
        int_mem_write( cmd, ret, x"001001F8",  x"00000000" );
        int_mem_write( cmd, ret, x"001001FC",  x"14A44953" );
        int_mem_write( cmd, ret, x"001001FC",  x"14A44953" );
 
 
 
 
        --- Блок 1 ---
        --- Блок 1 ---
 
 
        --- Дескриптор 0 ---
        --- Дескриптор 0 ---
        int_mem_write( cmd, ret, x"00100200",  x"00008020" );
        int_mem_write( cmd, ret, x"00100200",  x"00008020" );
        int_mem_write( cmd, ret, x"00100204",  x"00000011" );   -- переход к следующему дескриптору 
        int_mem_write( cmd, ret, x"00100204",  x"00000011" );   -- переход к следующему дескриптору 
 
 
        --- Дескриптор 1 ---
        --- Дескриптор 1 ---
        int_mem_write( cmd, ret, x"00100208",  x"00008030" );
        int_mem_write( cmd, ret, x"00100208",  x"00008030" );
        int_mem_write( cmd, ret, x"0010020C",  x"00000010" );   -- остановка
        int_mem_write( cmd, ret, x"0010020C",  x"00000010" );   -- остановка
 
 
 
 
        int_mem_write( cmd, ret, x"001003F8",  x"00000000" );
        int_mem_write( cmd, ret, x"001003F8",  x"00000000" );
        int_mem_write( cmd, ret, x"001003FC",  x"D6BC4953" );
        int_mem_write( cmd, ret, x"001003FC",  x"D6BC4953" );
 
 
 
 
 
 
        ---- Программирование канала DMA ----
        ---- Программирование канала DMA ----
        block_write( cmd, ret, 4, 8, x"00000023" );             -- DMA_MODE 
        block_write( cmd, ret, 4, 8, x"00000023" );             -- DMA_MODE 
        block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
        block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
 
 
        block_write( cmd, ret, 4, 20, x"00100000" );    -- PCI_ADRL 
        block_write( cmd, ret, 4, 20, x"00100000" );    -- PCI_ADRL 
        block_write( cmd, ret, 4, 21, x"00100000" );    -- PCI_ADRH  
        block_write( cmd, ret, 4, 21, x"00100000" );    -- PCI_ADRH  
        block_write( cmd, ret, 4, 23, x"0001D000" );    -- LOCAL_ADR 
        block_write( cmd, ret, 4, 23, x"0001D000" );    -- LOCAL_ADR 
 
 
 
 
        ---- Подготовка тетрады ----
        ---- Подготовка тетрады ----
        trd_test_mode( cmd, ret, 0 );    -- переход в рабочий режим --
        trd_test_mode( cmd, ret, 0 );    -- переход в рабочий режим --
        trd_wait_cmd( cmd, ret, 0, 16, x"1700" );                -- DMAR0 - от тетрады 7 --
        trd_wait_cmd( cmd, ret, 0, 16, x"1700" );                -- DMAR0 - от тетрады 7 --
 
 
        trd_wait_cmd( cmd, ret, 1, 16#1D#, x"0001" );   -- Размер блока = 4 кБ --
        trd_wait_cmd( cmd, ret, 1, 16#1D#, x"0001" );   -- Размер блока = 4 кБ --
 
 
        block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START 
        block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START 
 
 
        trd_wait_cmd( cmd, ret, 1, 16#0F#, x"0001" );   -- Подключение выхода генератора к DIO_IN --
        trd_wait_cmd( cmd, ret, 1, 16#0F#, x"0001" );   -- Подключение выхода генератора к DIO_IN --
 
 
        trd_wait_cmd( cmd, ret, 7,      0, x"2038" );            -- запуск тетрады DIO_OUT 
        trd_wait_cmd( cmd, ret, 7,      0, x"2038" );            -- запуск тетрады DIO_OUT 
 
 
        trd_wait_cmd( cmd, ret, 1, 16#1C#, x"0020" );   -- Запуск тестовой последовательности --
        trd_wait_cmd( cmd, ret, 1, 16#1C#, x"0020" );   -- Запуск тестовой последовательности --
 
 
        wait for 20 us;
        wait for 20 us;
 
 
 
 
        for ii in 0 to 20 loop
        for ii in 0 to 20 loop
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
 
 
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
                if( data( 8 )='1' ) then
                if( data( 8 )='1' ) then
                        write( str, string'(" - Дескриптор правильный" ));
                        write( str, string'(" - Дескриптор правильный" ));
                        error := 0;
                        error := 0;
                        exit;
                        exit;
                else
                else
                        write( str, string'(" - Ошибка чтения дескриптора" ));
                        write( str, string'(" - Ошибка чтения дескриптора" ));
                        error := error + 1;
                        error := error + 1;
                        wait for 10 us;
                        wait for 10 us;
                end if;
                end if;
 
 
                writeline( log, str );
                writeline( log, str );
        end loop;
        end loop;
 
 
 
 
        if( error=0 ) then
        if( error=0 ) then
 
 
                kk:=0;
                kk:=0;
                loop
                loop
 
 
                trd_status( cmd, ret, 6, status );
                trd_status( cmd, ret, 6, status );
                write( str, string'("TRD_STATUS: " )); hwrite( str, status );
                write( str, string'("TRD_STATUS: " )); hwrite( str, status );
 
 
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
                write( str, string'("    STATUS: " )); hwrite( str, data( 15 downto 0 ) );
                write( str, string'("    STATUS: " )); hwrite( str, data( 15 downto 0 ) );
 
 
                        if( data(4)='1' ) then
                        if( data(4)='1' ) then
                                write( str, string'(" - завершено чтение блока " ));
                                write( str, string'(" - завершено чтение блока " ));
                                block_write( cmd, ret, 4, 16#11#, x"00000010" );                -- FLAG_CLR - сброс EOT 
                                block_write( cmd, ret, 4, 16#11#, x"00000010" );                -- FLAG_CLR - сброс EOT 
                                kk:=kk+1;
                                kk:=kk+1;
                                if( kk=4 ) then
                                if( kk=4 ) then
                                        exit;
                                        exit;
                                end if;
                                end if;
                        end if;
                        end if;
                        writeline( log, str );
                        writeline( log, str );
 
 
                        wait for 500 ns;
                        wait for 500 ns;
 
 
 
 
                end loop;
                end loop;
 
 
                ---- Ожидание завершения DMA ----
                ---- Ожидание завершения DMA ----
                dma_complete := 0;
                dma_complete := 0;
                for ii in 0 to 100 loop
                for ii in 0 to 100 loop
 
 
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
                        if( data(5)='1' ) then
                        if( data(5)='1' ) then
                                write( str, string'(" - DMA завершён " ));
                                write( str, string'(" - DMA завершён " ));
                                dma_complete := 1;
                                dma_complete := 1;
 
 
                                block_write( cmd, ret, 4, 16#11#, x"00000010" );                -- FLAG_CLR - сброс EOT 
                                block_write( cmd, ret, 4, 16#11#, x"00000010" );                -- FLAG_CLR - сброс EOT 
 
 
                        end if;
                        end if;
                        writeline( log, str );
                        writeline( log, str );
 
 
                        if( dma_complete=1 ) then
                        if( dma_complete=1 ) then
                                exit;
                                exit;
                        end if;
                        end if;
 
 
                        wait for 1 us;
                        wait for 1 us;
 
 
                end loop;
                end loop;
 
 
                writeline( log, str );
                writeline( log, str );
 
 
                if( dma_complete=0 ) then
                if( dma_complete=0 ) then
                        write( str, string'("Ошибка - DMA не завершён " ));
                        write( str, string'("Ошибка - DMA не завершён " ));
                        writeline( log, str );
                        writeline( log, str );
                        error:=error+1;
                        error:=error+1;
                end if;
                end if;
 
 
        end if;
        end if;
 
 
        for ii in 0 to 3 loop
        for ii in 0 to 3 loop
 
 
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
                block_read( cmd, ret, 4, 16, data );                    -- STATUS 
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
                write( str, string'("STATUS: " )); hwrite( str, data( 15 downto 0 ) );
                writeline( log, str );
                writeline( log, str );
                wait for 500 ns;
                wait for 500 ns;
 
 
        end loop;
        end loop;
 
 
 
 
        block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL - STOP      
        block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL - STOP      
 
 
 
 
--      block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
--      block_write( cmd, ret, 4, 9, x"00000010" );             -- DMA_CTRL - RESET FIFO 
--      block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL 
--      block_write( cmd, ret, 4, 9, x"00000000" );             -- DMA_CTRL 
--      block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START     
--      block_write( cmd, ret, 4, 9, x"00000001" );             -- DMA_CTRL - START     
 
 
 
 
 
        -- вывод в файл --
        writeline( log, str );
        writeline( log, str );
        if( error=0 ) then
        if( error=0 ) then
                write( str, string'(" Тест завершён успешно " ));
                write( str, string'("TEST finished successfully" ));
                cnt_ok := cnt_ok + 1;
                cnt_ok := cnt_ok + 1;
        else
        else
                write( str, string'(" Тест не выполнен " ));
                write( str, string'("TEST finished with ERR" ));
                cnt_error := cnt_error + 1;
                cnt_error := cnt_error + 1;
        end if;
        end if;
        writeline( log, str );
        writeline( log, str );
        writeline( log, str );
        writeline( log, str );
 
 
 
        -- вывод в консоль --
 
        writeline( output, str );
 
        if( error=0 ) then
 
                write( str, string'("TEST finished successfully" ));
 
                cnt_ok := cnt_ok + 1;
 
        else
 
                write( str, string'("TEST finished with ERR" ));
 
                cnt_error := cnt_error + 1;
 
        end if;
 
        writeline( output, str );
 
        writeline( output, str );
 
 
 
 
end test_adm_write_16kb;
end test_adm_write_16kb;
 
 
end package     body test_pkg;
end package     body test_pkg;
 
 
 
 

powered by: WebSVN 2.1.0

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