123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- library ieee;
- use ieee.std_logic_1164.all;
- use ieee.numeric_std.all;
- use ieee.float_pkg.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;
- use work.test_hardware_task.all;
- use work.test_data_channel_pkg.all;
-
- library std;
- use std.env.all;
- use std.textio.all;
-
- entity test_task_add_rand is
- generic( CHECK_RESULTS : boolean; GUI_MODE : boolean := false );
- end entity test_task_add_rand;
-
- architecture test of test_task_add_rand is
-
- procedure test_configure( signal clk : in std_logic;
- signal req : out work.avalon_slave.Request;
- signal rsp : in work.avalon_slave.Response ) is
-
- variable index : integer := 0;
- variable writedata : std_logic_vector( 31 downto 0 );
- begin
- std.textio.write( std.textio.OUTPUT, " test_configure ... " );
- index := 0;
- writedata := x"08000000"; -- 2^32 / 32
- write_and_assert_config_eq( clk => clk, req => req, rsp => rsp,
- index => index, config => writedata );
-
- index := 1;
- writedata := x"00000000";
- write_and_assert_config_eq( clk => clk, req => req, rsp => rsp,
- index => index, config => writedata );
-
- index := 2;
- writedata := x"40800000"; -- 2 ** 2 = 4 float
- write_and_assert_config_eq( clk => clk, req => req, rsp => rsp,
- index => index, config => writedata );
-
- std.textio.write( std.textio.OUTPUT, TEST_OK );
-
- end procedure test_configure;
-
- signal clk : std_logic := '0';
- signal reset : std_logic := '1';
-
- signal req : work.avalon_slave.Request;
- signal rsp : work.avalon_slave.Response;
-
- signal data_channel_req : work.avalon_slave.Request;
- signal data_channel_rsp : work.avalon_slave.Response;
-
- signal signal_a_read : std_logic;
- signal signal_a_readdata : std_logic_vector( 31 downto 0 );
-
- signal signal_b_read : std_logic;
- signal signal_b_readdata : std_logic_vector( 31 downto 0 );
-
- signal signal_write : std_logic;
- signal signal_writedata : std_logic_vector( 31 downto 0 );
-
- signal data_channel_read : std_logic;
- signal data_channel_readdata : std_logic_vector( 31 downto 0 );
-
- begin
-
- dut : entity work.task_add
- port map (
- clk => clk,
- reset => reset,
-
- address => req.address,
- read => req.read,
- readdata => rsp.readdata,
- write => req.write,
- writedata => req.writedata,
-
- signal_a_read => signal_a_read,
- signal_a_readdata => signal_a_readdata,
-
- signal_b_read => signal_b_read,
- signal_b_readdata => signal_b_readdata,
-
- signal_write => signal_write,
- signal_writedata => signal_writedata
- );
-
- u_data_channel : entity work.data_channel
- port map (
- clk => clk,
- reset => reset,
-
- ctrl_address => data_channel_req.address,
- ctrl_read => data_channel_req.read,
- ctrl_readdata => data_channel_rsp.readdata,
- ctrl_write => data_channel_req.write,
- ctrl_writedata => data_channel_req.writedata,
-
- hw_sink_write => signal_write,
- hw_sink_writedata => signal_writedata,
-
- hw_source_read => data_channel_read,
- hw_source_readdata => data_channel_readdata
- );
-
- clk <= not clk after 10 ns;
-
- reset_release : process is
- begin
- wait for 35 ns;
- reset <= '0';
- wait;
- end process reset_release;
-
- input_data_a_simulus: process is
- variable index : integer := 0;
- begin
- while true loop
- signal_a_readdata <= to_std_logic_vector( to_float( work.sine_cosine_data.expected( index ) ) );
- wait until rising_edge( signal_a_read );
- if ( index < 1023 ) then
- index := index + 1;
- end if;
- end loop;
- end process input_data_a_simulus;
-
- input_data_b_simulus: process is
- variable index : integer := 0;
- begin
- while true loop
- signal_b_readdata <= to_std_logic_vector( to_float( work.rand_data.expected( index ) ) );
- wait until rising_edge( signal_b_read );
- if ( index < 1023 ) then
- index := index + 1;
- end if;
- end loop;
- end process input_data_b_simulus;
-
- stimulus: process is
- variable data_channel_config : std_logic_vector( 31 downto 0 ) := x"00000001";
- begin
- std.textio.write( std.textio.OUTPUT, "--------------------------------------------------------------------------------" & LF );
- std.textio.write( std.textio.OUTPUT, "Starting test_task_add_rand" & LF );
- wait until falling_edge( reset );
- wait until falling_edge( clk );
-
- work.test_data_channel_pkg.write_and_assert_config( clk => clk,
- req => data_channel_req,
- rsp => data_channel_rsp,
- config => data_channel_config );
-
- test_configure( clk => clk, req => req, rsp => rsp );
- test_execute( clk => clk, req => req, rsp => rsp,
- write => signal_write, writedata => signal_writedata );
-
- for i in 0 to 10 loop
- wait until falling_edge( clk );
- end loop;
-
- if ( CHECK_RESULTS ) then
- check_and_write_content( clk => clk,
- req => data_channel_req, rsp => data_channel_rsp,
- expected => work.add_rand_data.expected );
- else
- write_content( clk => clk,
- req => data_channel_req, rsp => data_channel_rsp );
- end if;
-
- if ( GUI_MODE ) then
- std.env.stop;
- else
- std.env.finish;
- end if;
- end process stimulus;
- end architecture test;
|