signal_processing_vorlage/tests/hardware/test_hardware_task.vhd
Johannes Kutning 0d1b73e3e0 Initial commit
2023-10-31 07:47:27 +01:00

218 lines
7.9 KiB
VHDL

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library work;
use work.reg32.all;
use work.avalon_slave.all;
use work.test_utility.all;
use work.test_avalon_slave.all;
use work.task.all;
package test_hardware_task is
procedure read_state( signal clk : in std_logic;
signal req : out work.avalon_slave.Request;
signal rsp : in work.avalon_slave.Response;
variable state : out std_logic_vector );
procedure assert_state_eq( signal clk : in std_logic;
signal req : out work.avalon_slave.Request;
signal rsp : in work.avalon_slave.Response;
variable state : std_logic_vector );
procedure assert_cycle_count_eq( signal clk : in std_logic;
signal req : out work.avalon_slave.Request;
signal rsp : in work.avalon_slave.Response;
variable cycle_count : std_logic_vector );
procedure write_start( signal clk : in std_logic;
signal req : out work.avalon_slave.Request );
procedure write_config( signal clk : in std_logic;
signal req : out work.avalon_slave.Request;
variable index : in integer;
variable config : in std_logic_vector );
procedure assert_config_eq( signal clk : in std_logic;
signal req : out work.avalon_slave.Request;
signal rsp : in work.avalon_slave.Response;
variable index : in integer;
variable config : in std_logic_vector );
procedure write_and_assert_config_eq( signal clk : in std_logic;
signal req : out work.avalon_slave.Request;
signal rsp : in work.avalon_slave.Response;
variable index : in integer;
variable config : in std_logic_vector );
procedure assert_output_steam_data_eq( signal clk : in std_logic;
signal write : std_logic;
signal writedata : std_logic_vector;
signal expected : work.reg32.RegArray );
procedure test_execute( signal clk : in std_logic;
signal req : out work.avalon_slave.Request;
signal rsp : in work.avalon_slave.Response;
signal write : in std_logic;
signal writedata : in std_logic_vector );
end package test_hardware_task;
package body test_hardware_task is
procedure read_state( signal clk : in std_logic;
signal req : out work.avalon_slave.Request;
signal rsp : in work.avalon_slave.Response;
variable state : out std_logic_vector ) is
variable address : std_logic_vector( 3 downto 0 );
begin
wait until falling_edge( clk );
address := std_logic_vector( to_unsigned( 1, address'length ) );
work.test_avalon_slave.read( clk => clk,
address => address,
req => req,
rsp => rsp,
data => state );
end procedure read_state;
procedure assert_state_eq( signal clk : in std_logic;
signal req : out work.avalon_slave.Request;
signal rsp : in work.avalon_slave.Response;
variable state : std_logic_vector ) is
variable address : std_logic_vector( 3 downto 0 );
begin
wait until falling_edge( clk );
address := std_logic_vector( to_unsigned( 1, address'length ) );
work.test_avalon_slave.assert_readdata_eq( clk => clk,
address => address,
req => req,
rsp => rsp,
expected => state,
message => TEST_FAIL & " assert_state_eq" );
end procedure assert_state_eq;
procedure assert_cycle_count_eq( signal clk : in std_logic;
signal req : out work.avalon_slave.Request;
signal rsp : in work.avalon_slave.Response;
variable cycle_count : std_logic_vector ) is
variable address : std_logic_vector( 3 downto 0 );
begin
wait until falling_edge( clk );
address := std_logic_vector( to_unsigned( 2, address'length ) );
work.test_avalon_slave.assert_readdata_eq( clk => clk,
address => address,
req => req,
rsp => rsp,
expected => cycle_count,
message => TEST_FAIL & " assert_cycle_count_eq" );
end procedure assert_cycle_count_eq;
procedure write_start( signal clk : in std_logic;
signal req : out work.avalon_slave.Request ) is
variable address : std_logic_vector( 3 downto 0 );
variable start : std_logic_vector( 31 downto 0 ) := ( others => '0' );
begin
wait until falling_edge( clk );
address := std_logic_vector( to_unsigned( 0, address'length ) );
work.test_avalon_slave.write( clk => clk,
address => address,
req => req,
data => START );
end procedure write_start;
procedure write_config( signal clk : in std_logic;
signal req : out work.avalon_slave.Request;
variable index : in integer;
variable config : in std_logic_vector ) is
variable address : std_logic_vector( 3 downto 0 );
begin
wait until falling_edge( clk );
address := std_logic_vector( to_unsigned( 3 + index, address'length ) );
work.test_avalon_slave.write( clk => clk,
address => address,
req => req,
data => config );
end procedure write_config;
procedure assert_config_eq( signal clk : in std_logic;
signal req : out work.avalon_slave.Request;
signal rsp : in work.avalon_slave.Response;
variable index : in integer;
variable config : in std_logic_vector ) is
variable address : std_logic_vector( 3 downto 0 );
begin
wait until falling_edge( clk );
address := std_logic_vector( to_unsigned( 3 + index, address'length ) );
work.test_avalon_slave.assert_readdata_eq( clk => clk,
address => address,
req => req,
rsp => rsp,
expected => config,
message => TEST_FAIL & " assert_config_eq" );
end procedure assert_config_eq;
procedure write_and_assert_config_eq( signal clk : in std_logic;
signal req : out work.avalon_slave.Request;
signal rsp : in work.avalon_slave.Response;
variable index : in integer;
variable config : in std_logic_vector ) is
variable address : std_logic_vector( 3 downto 0 );
begin
write_config( clk => clk, req => req, index => index, config => config );
assert_config_eq( clk => clk, req => req, rsp => rsp, index => index, config => config );
end procedure write_and_assert_config_eq;
procedure assert_output_steam_data_eq( signal clk : in std_logic;
signal write : std_logic;
signal writedata : std_logic_vector;
signal expected : work.reg32.RegArray ) is
begin
end procedure assert_output_steam_data_eq;
procedure test_execute( signal clk : in std_logic;
signal req : out work.avalon_slave.Request;
signal rsp : in work.avalon_slave.Response;
signal write : in std_logic;
signal writedata : in std_logic_vector ) is
variable expected_readdata : std_logic_vector( 31 downto 0 );
variable state : std_logic_vector( 31 downto 0 );
variable index : integer := 0;
begin
std.textio.write( std.textio.OUTPUT, " test_execute ... " );
expected_readdata := to_std_logic_vector( TASK_IDLE, expected_readdata'length );
assert_state_eq( clk => clk, req => req, rsp => rsp, state => expected_readdata );
write_start( clk => clk, req => req );
expected_readdata := to_std_logic_vector( TASK_RUNNING, expected_readdata'length );
assert_state_eq( clk => clk, req => req, rsp => rsp, state => expected_readdata );
while true loop
work.test_hardware_task.read_state( clk => clk, req => req, rsp => rsp, state => state );
if ( state = to_std_logic_vector( TASK_DONE, expected_readdata'length ) ) then
exit;
end if;
end loop;
std.textio.write( std.textio.OUTPUT, TEST_OK );
end procedure test_execute;
end package body test_hardware_task;